创建简单的窗口程序

#include <windows.h>

/*窗口函数的函数原型*/
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    char szClassName[] = "MainWClass";
    WNDCLASSEX wndclass;
    
    /*用描述主窗口的参数填充WNDCLASSEX结构*/
    wndclass.cbSize = sizeof(wndclass);             /*结构的大小*/
    wndclass.style = CS_HREDRAW | CS_VREDRAW;       /*指定如果大小改变就重画*/
    wndclass.lpfnWndProc = MainWndProc;             /*窗口函数指针*/
    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 = szClassName;           /*窗口类的名称*/
    wndclass.hIconSm = NULL;                        /*没有类的小图标*/
    
    /*注册这个窗口*/
    RegisterClassEx(&wndclass);
    
    /*创建主窗口*/
    HWND hwnd = CreateWindowEx(
        0,                         /*dwExStyle, 扩展样式*/
        szClassName,               /*lpClassName, 类名*/
        "My first Window!",        /*lpWindowName, 标题*/
        WS_OVERLAPPEDWINDOW,       /*dwStyle, 窗口风格*/
        CW_USEDEFAULT,             /*X, 初始X坐标*/
        CW_USEDEFAULT,             /*Y, 初始Y坐标*/
        CW_USEDEFAULT,             /*nWidth,宽度*/
        CW_USEDEFAULT,             /*nHeight, 高度*/
        NULL,                      /*hWndParent, 父窗口句柄*/
        NULL,                      /*hMenu, 菜单句柄*/
        hInstance,                 /*hInstance, 程序实例句柄*/
        NULL);                       /*lpParam, 用户数据*/
    
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Error build the Window!", "Error", MB_OK);
        return -1;
    }
    
    /*显示窗口,刷新窗口客户区*/
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    
    /*从消息队列中取出消息,交给窗户函数处理,直接到GetMessage返回FALSE,结束消息循环*/
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        /*转化键盘消息*/
        TranslateMessage(&msg);
        /*将消息发送到相应的窗口函数*/
        DispatchMessage(&msg);
    }
    
    /*当GetMessage返回FALSE时程序结束*/
    return msg.wParam;
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    char szText[] = "最简单的窗口程序!";
    switch(message)
    {
        case WM_PAINT:  /*窗口客户区需要重画*/
        {
            HDC hdc;
            PAINTSTRUCT ps;
            
            /*使无效的客户区变得有效,并取得设备环境句柄*/
            hdc = BeginPaint(hwnd, &ps);
            /*显示文字*/
            TextOut(hdc, 10, 10, szText, strlen(szText));
            EndPaint(hwnd, &ps);
            return 0;
        }
        case WM_DESTROY: /*正在销毁窗口*/
            /*向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环*/
            PostQuitMessage(0);
            return 0;
    }
    /*将我们不处理的消息交给系统做默认处理*/
    return DefWindowProc(hwnd, message, wParam, lParam);
}





另一个类似的例子:


#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
 
    static TCHAR szClassName[] = 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= szClassName; /*窗口类名*/
    
    
    /*注册窗口*/
    RegisterClass(&wndclass);
    
    /*************第二步:创建窗口(并让窗口显示出来)***************/
    hwnd = CreateWindow(
        szClassName,  /*窗口名字*/
        TEXT("Welcome"), /*窗口标题*/
        WS_OVERLAPPEDWINDOW,  /*窗口风格*/
        CW_USEDEFAULT,  /*初始化x轴的位置*/
        CW_USEDEFAULT,  /*初始化y轴的位置*/
        640,  /*窗口宽度*/
        480,  /*窗口高度*/
        NULL, /*父窗口句柄*/
        NULL, /*窗口菜单句柄*/
        hInstance, /*当前窗口句柄*/
        NULL    /*不使用该值*/
        );
        
    if(hwnd == NULL)
    {
        MessageBox(NULL, "创建窗口出错!", "Error", MB_OK);
        return -1;
    }

        
    /*显示窗口*/
    ShowWindow(hwnd, nCmdShow);
    /*更新(绘制)窗口*/
    UpdateWindow(hwnd);
    
    
    /*************第三步:消息循环*************/
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);  /*翻译消息*/
        DispatchMessage(&msg);   /*分派消息*/
    }
    return msg.wParam; /*当GetMessage程序返回FALSE是程序结束*/
}

/*************第四步:窗口过程*****************/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    
    switch(message)
    {
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rect);
            DrawText(
                hdc,
                TEXT("你好,欢迎来到地球。"),
                -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);
}


你可能感兴趣的:(创建简单的窗口程序)