无效区产生时机和绘制dc

//派发消息到对应的窗口过程函数

LRESULT DispatchMessage(

 CONST MSG *lpmsg // message information 消息地址

);

 

绘图消息 WM_PAINT

消息来的时机:

当产生无效区的时候,系统会发送WM_PAINT消息。

 

 无效区 -- 窗口需要重新绘制的部分

 

无效区产生的时机

1.   最小化恢复的时候

2.  被覆盖的部分重新显示(win10 移除屏幕外)

3. 拖动\鼠标移动\菜单,不会产生,因为系统做了优化

4. 窗口的尺寸被修改

5.  还有一些API可以发送WM_PAINT消息 

例如:  指定位置发送绘制消息

BOOL InvalidateRect(

HWND hWnd, // handle to window

CONST RECT* lpRect, // rectangle coordinates 绘制矩形   左上右下两个点

BOOL bErase // erase state 是否更新背景

);

(UpdateWindow)(必须加在一起来重新绘制窗口)

 

绘制区域

typedef struct tagPAINTSTRUCT {

  HDC  hdc; 显示dc用来绘制

  BOOL fErase; 是否删除背景

  RECT rcPaint; 绘制矩形   左上右下两个点

  BOOL fRestore; 恢复系统内部使用

  BOOL fIncUpdate; 更新系统内部使用

  BYTE rgbReserved[32]; 保留系统内部使用

} PAINTSTRUCT, *PPAINTSTRUCT;

 

HDC获得显示图案的环境(上下文)

开始绘制图案位置

HDC BeginPaint(

HWND hwnd, // handle to window 窗口句柄

LPPAINTSTRUCT lpPaint // paint information指向将接收的PAINTSTRUCT地址

);

 

绘制文字

int DrawText(

HDC hDC, // handle to DC

 LPCTSTR lpString, // text to draw 输出的字符

int nCount, // text length 字符大小

LPRECT lpRect, // formatting dimensions 绘制矩形   左上右下两个点

UINT uFormat // text-drawing options  绘制样式  比如居中,靠左对齐等

);

 

释放beginpaint产生的内存。如果不调用就会一直增加

BOOL EndPaint(

HWND hWnd, // handle to window

CONST PAINTSTRUCT *lpPaint // paint data指向将接收的PAINTSTRUCT地址

);

 

人工产生绘制图案位置(无效区)

HDC GetDC( HWND hWnd // handle to window);

释放GetDC产生的内存。如果不调用就会一直增加

int ReleaseDC(

HWND hWnd, // handle to window

HDC hDC // handle to DC );

 

WM_PAINT 消息接受里面不能使用GetDC 会造成循环

 

BeginPaint与GetDC的区别(使用效果相同)

BeginPaint会清除无效区,GetDC不会

BeginPaint/EndPaint通常只在WM_PAINT消息中使用.

 

加载指定图标资源

HICON LoadIcon(

 HINSTANCE hInstance, // handle to application instance  句柄实例

 LPCTSTR lpIconName // name string or resource identifier 图标资源选择

);

 

将图标绘制到指定环境中

BOOL DrawIcon(

HDC hDC, // handle to DC  

int X, // x-coordinate of upper-left corner绘制x坐标

 int Y, // y-coordinate of upper-left corner 绘制y坐标

HICON hIcon // handle to icon  绘制句柄

);

 

键盘消息WM_KEYDOWN

LRESULT CALLBACK WindowProc(

 HWND hwnd,       // handle to window  

UINT uMsg,       // WM_KEYDOWN

 WPARAM wParam,   // virtual-key code  虚拟键盘值 Windows统一了标准

LPARAM lParam    // key data 扫描码  生产商给定的值

);

 

int wsprintf( 输出位置 ,格式 比如TEXT("%c") ,消息);

//将keydown消息转换为字符消息

 

这个函数帮我们实现了字符shift和capslk组合使用来完成大小写的转换

BOOL TranslateMessage(

CONST MSG *lpMsg // message information

);

 

keydown消息转换为字符消息 WM_CHAR

 

 

posted @ 2020-09-04 12:03  特权E5  阅读(134)  评论(0编辑  收藏  举报