Windows API编程实践:从WinMain到消息处理

需积分: 5 1 下载量 153 浏览量 更新于2024-09-15 收藏 38KB DOC 举报
"VC++编程练习" 在Windows API编程中,Windows程序通常以`WinMain`函数作为入口点,这是与传统的C/C++程序中的`main`函数不同的地方。`WinMain`函数是Windows应用程序的核心,负责初始化和管理应用程序的生命周期。 Windows程序中的`WinMain`函数执行一个`while`循环来不断地检索并调度消息。这个循环会反复调用三个关键的API函数:`GetMessage`、`TranslateMessage`和`DispatchMessage`。`GetMessage`用于从消息队列中取出消息,`TranslateMessage`处理键盘输入的虚拟键消息,将其转化为字符消息,而`DispatchMessage`则将消息分发给相应的窗口过程进行处理。 当Windows应用程序运行结束时,会接收到一个`WM_QUIT`消息,表明应用程序应该终止。当用户释放鼠标左键时,会触发`WM_LBUTTONUP`消息。当窗口尺寸被调整时,系统会发送`WM_SIZE`消息给窗口,告知其尺寸变化的情况。 在Windows中,对话框是一种特殊的窗口,用于获取用户的输入。对话框可以分为模态对话框(Modal Dialog)和非模态对话框(Modeless Dialog)。模态对话框会阻塞用户对其他窗口的操作,直到对话框关闭;而非模态对话框允许用户在对话框打开的同时与应用程序的其他部分交互。MFC(Microsoft Foundation Classes)库将对话框的功能封装在`CDialog`类中,方便开发者使用。对话框如同其他窗口一样,能够接收和处理各种消息,如用户输入事件或系统通知。 图形的刷新通常通过重绘(Redraw)机制来完成,可以调用`InvalidateRect`函数标记需要更新的区域,然后由Windows系统自动调用`WM_PAINT`消息进行绘制。对于鼠标操作的编程,可以通过响应`WM_MOUSEMOVE`、`WM_LBUTTONDOWN`、`WM_LBUTTONUP`等消息来捕获和处理鼠标的各种动作。 编辑框控件的内容读写与修改,可以通过`GetDlgItemText`函数读取编辑框内容,而`SetDlgItemText`函数则用于设置新的文本。响应滚动条消息,需要在窗口过程函数中处理`WM_VSCROLL`或`WM_HSCROLL`消息,根据消息参数来确定滚动条的动作,然后更新视图内容。 MFC应用程序有三种基本模式:基于对话框的应用程序(Dialog-Based)、单文档界面(SDI)和多文档界面(MDI)。对话框模式主要围绕一个中心对话框进行交互;SDI模式通常用于每个文档对应一个独立窗口的应用,如文本编辑器;MDI模式则允许多个文档在同一窗口内同时打开和操作,提供更复杂的用户界面。 以下是一个简化的Windows消息处理函数示例: ```cpp long WINAPI WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hDC; // 画刷设备上下文句柄 HBRUSH hBrush; // 画刷对象句柄 HPEN hPen; // 笔对象句柄 PAINTSTRUCT PtStr; // 绘图结构体 switch (iMessage) { // 处理消息 case WM_PAINT: // 处理绘图消息 hDC = BeginPaint(hWnd, &PtStr); // 初始化绘图环境 SetMapMode(hDC, MM_ANISOTROPIC); // 设置映射模式 hPen = (HPEN)GetStockObject(BLACK_PEN); // 获取黑色笔对象 hBrush = (HBRUSH)GetStockObject(DKGRAY_BRUSH); // 获取深灰色画刷对象 SelectObject(hDC, hBrush); // 选择画刷 SelectObject(hDC, hPen); // 选择笔 // ① 在这里绘制图形或文字 EndPaint(hWnd, &PtStr); // 结束绘图 break; // 其他消息处理... } return DefWindowProc(hWnd, iMessage, wParam, lParam); // 转发未处理的消息给默认窗口过程 } ``` 在程序中,`①`处应填写具体的绘图代码,例如绘制矩形、椭圆或者文字等。`EndPaint`函数用于结束绘图操作,并清除`PAINTSTRUCT`中的信息。