08 Windows编程——画图
源码
#include<Windows.h>
#include<tchar.h>
#include<stdio.h>
#define NUM 1000 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
{
WNDCLASS WndClass;
TCHAR* ClassName = TEXT("MyClass");
HWND hwnd;
MSG msg;
HBRUSH hBrush; hBrush = CreateSolidBrush(RGB(0x20, 0x85, 0x41));
WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = hBrush;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInst;
WndClass.lpfnWndProc = WindProc;
WndClass.lpszClassName = ClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_VREDRAW | CS_HREDRAW; if (!RegisterClass(&WndClass))
{
MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK);
return ;
} //WS_VSCROLL窗口滚动条
hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, , , , , NULL, NULL, hInst, NULL);
if (hwnd == NULL)
{
MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK);
return ;
}
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return ;
} LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static HPEN hPen1,hPen2;
static HBRUSH hBrush;
PAINTSTRUCT pt;
TEXTMETRIC ts;
TCHAR buf[];
int i; //行数
static int cyChar; //字体大小
static int cy; //客户区高度
static SCROLLINFO si;
static int position = ;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(, , ));
hPen1 = CreatePen(PS_SOLID,, RGB(, , ));
GetTextMetrics(hdc, &ts);
ReleaseDC(hwnd, hdc);
cyChar = ts.tmHeight;
si.cbSize = sizeof(si);
return ;
case WM_SIZE:
//窗口高度
cy = HIWORD(lParam);
si.fMask = SIF_ALL;
si.nMax = NUM - ;
si.nMin = ;
si.nPage = cy / cyChar;
si.nPos = position;
si.nTrackPos = ;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
case WM_VSCROLL:
//当滚动条是窗口的一部分时,可以忽略IParam参数
switch (LOWORD(wParam))
{
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEDOWN:
si.nPos++;
break;
case SB_LINEUP:
si.nPos--;
break;
case SB_PAGEDOWN:
si.nPos = si.nPos + cy / cyChar;
break;
case SB_PAGEUP:
si.nPos = si.nPos - cy / cyChar;
break;
case SB_THUMBPOSITION:
si.nPos = HIWORD(wParam);
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
GetScrollBarInfo(hwnd, SB_VERT, &si);
position = si.nPos;
//UpdateWindow(hwnd);//窗口必须有无效区,否则刷新也是白刷。替换为InvalidateRect强制刷新
//InvalidateRect函数会产生WM_PAINT消息
InvalidateRect(hwnd, NULL, FALSE);
return ;
case WM_PAINT:
GetScrollBarInfo(hwnd, SB_VERT, &si);
//调用BeginPaint后整个客户去都是有效的。ValidateRect使客户区中任意矩形区域变成有效的
hdc = BeginPaint(hwnd, &pt);
hPen2=(HPEN)SelectObject(hdc, hPen1);
SelectObject(hdc, hBrush);
MoveToEx(hdc, , , NULL);
LineTo(hdc, , );
Rectangle(hdc, , , , );
SelectObject(hdc, hPen2); for (i = ; i < NUM; i++)
{
_stprintf(buf, TEXT("---------------%d--------------"), si.nPos + i);
TextOut(hdc, , i * cyChar, buf, _tcslen(buf));
}
EndPaint(hwnd, &pt);
return ;
case WM_DESTROY:
PostQuitMessage();//发送WM_QUIT消息
return ;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
}
创建画刷
HBRUSH CreateSolidBrush(
COLORREF color
);
初始化一个指定颜色的画刷。画笔可以随后被选为任何设备上下文的当前刷子。
SelectObject
HGDIOBJ SelectObject(
HDC hdc,
HGDIOBJ h
);
把一个对象(位图、画笔、画刷等)选入指定的设备描述表。新的对象代替同一类型的老对象。
hdc :设备描述表句柄(要载入的设备描述表句柄)
h: 选择要载入的对象的句柄
但该对象的句柄必须使用以下函数创建才有效:
Bitmap(位图) CreateBitmap, CreateBitmapIndirect,
CreateCompatibleBitmap, CreateDIBitmap,
CreateDIBSection
Brush(画刷) CreateBrushIndirect, eateDIBPatternBrush,
CreateDIBPatternBrushPt, CreateHatchBrush,
CreatePatternBrush, CreateSolidBrush
Font(字体) CreateFont, CreateFontIndirect
Pen(画笔) CreatePen, CreatePenIndirect
Region(区域) CombineRgn, CreateEllipticRgn,
CreateEllipticRgnIndirect,
CreatePolygonRgn, CreateRectRgn,
CreateRectRgnIndirect
COLORREF SetBkColor(
HDC hdc,
COLORREF color
);
用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。
BOOL MoveToEx(
HDC hdc,
int x,
int y,
LPPOINT lppt
);
将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。
BOOL LineTo(
HDC hdc,
int x,
int y
);
用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y。
08 Windows编程——画图的更多相关文章
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)
为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题 ...
- 走进windows编程的世界-----入门篇
1 Windows编程基础 1.1Win32应用程序基本类型 1) 控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2) Win32窗体程序 包括窗体的程序,能够通过窗 ...
- 【Windows编程】系列第十一篇:多文档界面框架
前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...
- 【Windows编程】系列第十篇:文本插入符
大家知道,在使用微软的编程环境创建工程时会让你选择是控制台模式还是Windows应用程序.如果选择控制台的console模式,就会在运行时出现一个黑洞洞的字符模式窗口,里面就有等待输入一闪一闪的插入符 ...
- 【Windows编程】系列第八篇:通用对话框
上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个 ...
- 【Windows编程】系列第七篇:Menubar的创建和使用
上一篇我们学习了利用windows API创建工具栏和菜单栏,与上一篇紧密联系的就是菜单栏,菜单栏是一个大多数复杂一些的Windows应用程序不可或缺的部分.比如下图就是Windows自带的记事本的菜 ...
- 【Windows编程】系列第九篇:剪贴板使用
上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...
随机推荐
- sqlserver如何创建链接服务器
遇到下列问题: 线上服务器A,中转服务器B,本地服务器C 数据在A上面,想在B上面操作类似 select * from [A].[database].table这样的SQL,不用去链接服务器,直接把处 ...
- 论文笔记: LSTD A Low-Shot Transfer Detector for Object Detection
背景知识: Zeroshot Learning,零次学习. 模型 对于 训练集 中 没有出现过 的 类别,能自动创造出相应的映射: X→Y. Low/Few-shot Learning.One-sho ...
- Windows 10系统永久关闭Windows Defender Antivirus防病毒程序方法
Win + R 键运行 gpedit.msc 找到 计算机配置 -> 管理模板 -> Windows 组件 -> Windows Defender 防病毒程序 右边双击 “关闭Win ...
- Linux 学习笔记 1 使用最小的系统,从分区安装系统开始
我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作,以至于后期,不了解什么是分区以及分区当中最基本的一些概念, 我们不说最细的知识,只求了解这个过程,那直接步入正题,开始第一节的学习 ...
- Core JSON及JSON解析
JSON (JavaScript Object Notation) 是一种基于文档的标准数据交换格式,它可以让应用程序通过网络交换数据.JSON独立于编程语言(Ruby, Java/EE, JavaS ...
- weblogic搭建总结
目录: 一.安装weblogic软件 二.创建域 三.启动管理节点 四.创建被管理节点 五.部署应用 一.安装weblogic软件 一.关闭selinux和防火墙 service iptables s ...
- 微信公众号对接JS-SDK接口 调用微信内置地图
微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...
- C语言 - cJSON解析特定格式 含有数组array类型的数据
在ESP32中使用了cJSON库,发现很好用.最近服务器端的JSON格式越来越多样,还是有些注意点,需要做下笔记记录下来. cJSON *MAC_arry = cJSON_GetObjectItem( ...
- apache - storm - Setting Up a Development Environment
Installing a Storm release locally If you want to be able to submit topologies to a remote cluster f ...
- SSH框架CRUD+树形菜单案例
今天结合了案例来写ssh的增删改查 表设计 t_ssh_tree t_vue_user book 核心配置文件 struts-base.xml <?xml version="1.0 ...