Windows编程了解

Windows编程了解_第1张图片
Windows 编程模型
一个完整的Win32程序(#include ),该程序实现的功能是创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序的实现步骤为:

  1. WinMain函数的定义;
  2. 创建一个窗口;
  3. 进行消息循环;
  4. 编写窗口过程函数。
#include //底层实现窗口的头文件

/*
HWND,  消息所属的窗口句柄
UINT,  具体消息名称 WM_XXXX消息名
WPARAM, 键盘附加消息
LPARAM 鼠标附加消息
*/
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
//程序入口函数

//WINAPI 代表__stdcall 参数的传递顺序,从右到左依次入栈,并且在函数返回前清空栈
int WINAPI WinMain(
    _In_ HINSTANCE hInstance,//应用程序实例句柄
    _In_opt_ HINSTANCE hPrevInstance,//上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用了
    _In_ LPSTR lpCmdLine,//char *argv[]
    _In_ int nShowCmd//显示命令 最大化 最小化 正常
)
{
    //1.设计窗口
    //2.注册窗口
    //3.创建窗口
    //4.显示和更新
    //5.通过循环取消息
    //6.处理消息(窗口过程)

    //1.WNDCLASS
    WNDCLASS wc;
    wc.cbClsExtra = 0;//类的额外的内存
    wc.cbWndExtra = 0;//窗口额外的内存;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置句柄
    wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标
    wc.hIcon = LoadIcon(NULL, IDI_ERROR);//设置图标
    wc.hInstance = hInstance;//应用程序实例句柄,传入WinMain形参即可
    wc.lpfnWndProc = WindowProc;//回调函数 窗口过程
    wc.lpszClassName = TEXT("WIN");//指定窗口类名称
    wc.lpszMenuName = NULL;//菜单名称
    wc.style = 0;//显示风格 0代表默认风格

    //2.
    RegisterClass(&wc);

    //3.
    /*
    (lpClassName 类名
    lpWindowName 标题名
    dwStyle 风格
    x,
    y,
    nWidth, 
    nHeight, 
    hWndParent, 
    hMenu,
    hInstance,
    lpParam) 附加值 鼠标附加值
    */
    HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, wc.hInstance, NULL);
    //4.
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    //5.
    /*
    HWND        hwnd; 主窗口句柄
    UINT        message; 具体消息名称
    WPARAM      wParam; 附加消息 键盘消息
    LPARAM      lParam; 附加消息 鼠标消息
    DWORD       time; 消息产生时间
    POINT       pt; 附加消息 鼠标消息 x,y
    */
    MSG msg;

    while (1)
    {
        /*
    _Out_ LPMSG lpMsg, 
    _In_opt_ HWND hWnd, 捕获窗口 NULL代表捕获所有窗口
    _In_ UINT wMsgFilterMin, 最小和最大的过滤消息 0代表捕获所有消息
    _In_ UINT wMsgFilterMax);
        */
        if (GetMessage(&msg,NULL,0,0)==FALSE)
        {
            break;
        }

        //翻译消息
        TranslateMessage(&msg);

        //其他消息分发
        DispatchMessage(&msg);
    }


    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int xPos;
    int yPos;
    switch (uMsg)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);//发送出另一个消息 WM_DESTROY
        //所有以XXXXWindow为结尾的方法都不会进入到消息队列中,而是直接执行
        break;
    case WM_DESTROY:
        PostQuitMessage(0);//会让GetMessage返回值为False
        break;
    case WM_LBUTTONDOWN:
        xPos = LOWORD(lParam);
        yPos = HIWORD(lParam);

        char buf[1024];
        wsprintf(buf,TEXT("x = %d,y = %d"), xPos, yPos);
        //MessageBox(hwnd, TEXT("hahaha"), TEXT("鼠标左键摁下"), MB_OK);
        MessageBox(hwnd, buf, TEXT("鼠标左键摁下"), MB_OK);
        break;
    case WM_PAINT:
    {
        PAINTSTRUCT ps;//绘图结构体
        HDC hdc = BeginPaint(hwnd, &ps);
        TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
        EndPaint(hwnd, &ps) ;
    }

        break;
    default:
        break;
    }
    //返回默认处理方式
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

;
}

    break;
default:
    break;
}
//返回默认处理方式
return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

[参考](https://www.bilibili.com/video/BV1JW41147NX?p=5)

你可能感兴趣的:(windows,c++)