目录
创建一个窗体得过程:
- 1 注册
- 2 创建
- 3 处理消息
用户一般也是把消息取出来(GetMessage),调用WindowProc处理.(只能
使用CallWindowProc调用,但一般调用他的封装函数DispatchMessage)
DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc。
int MessageBox(
HWND hWnd, //提示窗体的父窗体
LPCTSTR lpText, //提示的文本
LPCTSTR lpCaption, //标题
UINT uType //按钮样式
);
int WINAPI WinMain(
HINSTANCE hInstance, //程序的初始化地址
HINSTANCE hPrevInstance, //永远不用
LPSTR lpCmdLine, //命令行
int nCmdShow //窗体显示的样式
);
1.先定义后注册
typedef struct _WNDCLASS {
UINT style; //窗体的样式(*) CS_VREDRAW | CS_HREDRAW
WNDPROC lpfnWndProc; //处理窗体的交互事件(*)
int cbClsExtra; //注册类的系统分配空间 0
int cbWndExtra; //系统为窗口数据分配的空间 0
HINSTANCE hInstance; //程序的内存地址(WinMain传递)
HICON hIcon; //窗口图标 (0/NULL)
HCURSOR hCursor; //鼠标光标(0/NULL)
HBRUSH hbrBackground; //背景颜色(*)
LPCTSTR lpszMenuName; //菜单 (0/NULL)
LPCTSTR lpszClassName; //注册名(*)
} WNDCLASS, *PWNDCLASS;
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // 注册窗口类的数据参数
);
2.创建
HWND CreateWindow(
LPCTSTR lpClassName, // 使用RegisterClass注册的名字
LPCTSTR lpWindowName, // 窗体的标题文本
DWORD dwStyle, // 窗体样式
int x, // 窗体的x-坐标
int y, // 窗体的y-坐标
int nWidth, // 窗体宽度
int nHeight, // 窗体的高度
HWND hWndParent, // 窗体的父窗体
HMENU hMenu, // 窗体菜单
HINSTANCE hInstance, // 应用程序的句柄
LPVOID lpParam // 创建窗体的数据(对MDI窗体有意义)0
);
3.消息处理
先获取,再发送
BOOL GetMessage(
LPMSG lpMsg, // 返回消息
HWND hWnd, // 指定消息所属的窗体,如果是NULL,则取所有消息
UINT wMsgFilterMin, // 消息最小值 0
UINT wMsgFilterMax // 消息最大值 0
);
LRESULT DispatchMessage(
CONST MSG *lpmsg // message information
);
DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc
控制台输出的应用
1.创建控制台
BOOL AllocConsole(void);创建控制台
BOOL FreeConsole(VOID);用完释放控制台
2.获取需要的IO句柄
HANDLE GetStdHandle(
DWORD nStdHandle // input, output, or error device
);
返回:控制台IO句柄
参数:指定控制台IO的类型:标准输入/标准输出/标准错误输出
STD_INPUT_HANDLE Standard input handle
STD_OUTPUT_HANDLE Standard output handle
STD_ERROR_HANDLE Standard error handle
3.控制台输出
BOOL WriteConsole(
HANDLE hConsoleOutput, // 控制台句柄
CONST VOID *lpBuffer, // 输出数据的缓冲
DWORD nNumberOfCharsToWrite, // 输出数据大小
LPDWORD lpNumberOfCharsWritten, // 返回实际输出的数据个数
LPVOID lpReserved // 永远不使用
);
消息处理
一、WM_PAINT的工作原理:
BeginPaint InvalidateRect ValidateRect
EndPaint InvalidateRgn ValidateRgn
- 1.WM_PAINT没有参数,但是依赖一个绘制区数据结构.PAINTSTRUCT
他们之间的关系:WM_PAINT触发,必须存在PAINTSTRUCT结构
如果存在PAINTSTRUCT结构,则系统回自动发送WM_PAINT消息 - 2.BeginPaint/EndPaint与WM_PAINT的关系
BeginPaint/EndPaint获取WM_PAINT对应的绘制结构PAINTSTRUCT
返回HDC.
如果WM_PAINT对应的PAINTSTRUCT是空,则BeginPaint返回0 - 3.强制调用WM_PAINT的消息处理:
PostMessage发送消息
UpdateWindow完成
RedrawWindow完成
前面两个函数可以强制发送消息,但是没有绘制结构PAINTSTRUCT
推荐:InvalidateRect/InvalidateRgn产生一个绘制区. - 4.动画编程模型:
1.在定时器过程改变数据y+=3,并且设置绘制的无效区InvalidateRect,
同时强制更新窗体UpdateWindow
2.在WM_PAINT主要根据数据进行绘制工作1.WM_PAINT://当窗体大小/位置改变的时候,该消息被系统使用PostMessage发送
a.WM_PAINT不能使用SendMessage发送 b.WM_PAINT优先级别比较低的消息 c.WM_PAINT的参数(没有使用) d.WM_PAINT的