【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;
}

 

posted @ 2024-05-13 21:41  VanGoghpeng  阅读(118)  评论(0编辑  收藏  举报