【C++】【MFC】Windows程序运行入口 and DialogBox
创建MFC程序同常规创建命令行程序一致,空项目,源文件,C++,但是需要修改项目的属性:
1、链接器 系统 子系统改为窗口
2、高级 字符集改为多字节字符集
相较于命令行程序的入口——int main()
Windows桌面应用入口——int WINAPI/APIENTRY/__stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
参数解析:
1、WINAPI/APIENTRY/__stdcall 表示C++标准调用方式
2、HINSTANCE hInstance 表示当前程序示例的句柄(Handle to Instance),可用于获取程序的资源信息
3、HINSTANCE hPrev 旧版本中表示为Windows的前一个实例句柄,在新版本Windows中,始终为NULL
4、LPSTR lpCmd 表示一个指向以NULL结尾的字符串指针,用于传递命令行参数
5、int nShow 表示程序窗口初始状态
DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc)
参数解析:
1、hInstance 当前程序实例的句柄
2、lpTemplate 对话框模版资源的指针,即资源视图中创建后在resource.h文件中存在
3、hWndParent 父窗口句柄,如果直接在主程序中显示则为NULL
4、lpDialogFunc 回调函数,用于处理Dialog的事件
返回值:返回EndDialog的第二个参数。
INT_PTR WINAPI/APIENTRY/__stdcall msgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
参数解析:
1、INT_PTR 返回类型,自动适应32位或64位程序
2、hWnd 窗口句柄
3、uMsg 表示窗口消息的类型或标识符,用于将窗口发生的事件传递给系统
4、wParam 用于传递额外信息,如鼠标点击和键盘输入
5、lParam 用于传递额外信息,通常为更为复杂的信息,包括鼠标位置等
Practice:
#include "Windows.h" #include "resource.h" #include "stdio.h" // 居中显示 void CenterWindow(HWND hWnd) { RECT re, sys; GetWindowRect(hWnd, &re); sys.left = sys.top = 0; sys.right = GetSystemMetrics(SM_CXSCREEN); sys.bottom = GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd, (sys.right - re.right) / 2, (sys.bottom - re.bottom) / 2, re.right - re.left, re.bottom - re.top, TRUE); } INT_PTR __stdcall msgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG:{ SetWindowText(hWnd, "Message Test."); CenterWindow(hWnd); break; } case WM_CLOSE:{ int retvl = MessageBox(hWnd, "Close?", "Tip", MB_YESNOCANCEL); switch (retvl) { case IDYES: EndDialog(hWnd, wParam); break; } } case WM_LBUTTONUP: { /*int x = LOWORD(lParam); int y = HIWORD(lParam); char s[256]; sprintf_s(s, "%d, %d", x, y); SetWindowText(hWnd, s);*/ break; } case WM_RBUTTONDOWN: // MessageBox(hWnd, "Right Mouse", "Tip", MB_OK); break; case WM_MOUSEMOVE: { short int x = LOWORD(lParam); short int y = HIWORD(lParam); char s[256]; sprintf_s(s, "%d, %d", x, y); if(wParam & MK_LBUTTON) strcat_s(s, "M_L"); if(wParam & MK_RBUTTON) strcat_s(s, "M_R"); SetWindowText(hWnd, s); break; } } return false; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nShow) { DialogBox(hInstance, (LPSTR)IDD_MSGDL, NULL, msgProc); return 0; }