窗口与标题

前言:

  学习逆向工程经典书籍《加密与解密》需要先学习《windows程序设计》这本书籍,在来来回回折腾之后,遂决定好好品读这本书,以为看《加密与解密》打基础,

写博客是为了加强对知识的理解及巩固以及对知识的复习。好了不多说,下面上代码:

#include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This Program requires Windows NT!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(                
        szAppName,                            //窗口类名称
        TEXT("The Hello Program"),            //窗口标题
        WS_OVERLAPPEDWINDOW,                  //窗口风格    
        CW_USEDEFAULT,                        //初始x坐标
        CW_USEDEFAULT,                        //初始y坐标
        CW_USEDEFAULT,                        //初始x方向长度
        CW_USEDEFAULT,                        //初始y方向长度
        NULL,                                //父窗口句柄
        NULL,                                //窗口菜单句柄
        hInstance,                            //程序实例句柄
        NULL                                //创建参数
    );
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        DrawText(hdc, TEXT("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
        
    return DefWindowProc(hwnd, message, wParam, lParam);
}

WinMain的四个参数分别代表的含义是:hInstance代表当前实例句柄,hPrevInstance代表上一个程序的实例句柄,szCmdLine代表命令行,iCmdShow代表程序窗口是以最大化、最小化展示。

代码中的ShowWindow在屏幕中显示窗口,而UpdateWindow则会向窗口过程函数发送WM_PAINT消息使窗口进行重绘,CreateWindow则会在内部创建窗口并保存数据,直到ShowWindow调用显示窗口。在调用CreateWindow时,会产生WM_CREATE对窗口进行一些初始化工作。

基于一个窗口类可以创建多个窗口,创建多个窗口使只需要在CreateWindow函数中初始化第一个参数为窗口类的名称(也就是wndclass.lpszClassName)。

GetClientRect函数第二个参数会获取客户区的尺寸,以便DrawText在客户区尺寸内显示文本,DrawText中的-1是指字符串以0结尾。

任何没有对应case的消息会由DefWindowProc进行处理,以及每条消息处理完后都要返回0。

原文地址:https://www.cnblogs.com/Lu3ky-Athena/p/13618898.html