首页 > 技术文章 > Windows核心编程第01天 创建窗口

creature-lurk 2020-07-21 21:42 原文

1.入口函数WinMain,该函数的功能是被系统调用,作为一个32位应用程序的入口点。

int WINAPI WinMain( HINSTANCE hInstance,  //应用程序当前实例的句柄。
            HINSTANCE hPrevInstance, //应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。
            LPSTR lpCmdLine,  //指向应用程序命令行的字符串的指针,不包括执行文件名。pCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。
            int nCmdShow)  //指明窗口如何显示。

 2.WNDCLASS,该结构包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性

typedef struct _WNDCLASS {
  UINT style;  // 窗口类型
  WNDPROC lpfnWndProc;  //窗口处理函数
  int cbClsExtra;  //窗口扩展
  int cbWndExtra;  //窗口实例扩展
  HINSTANCE hInstance;  //实例句柄
  HICON hIcon;  //窗口的最小化图标
  HCURSOR hCursor;  //窗口鼠标光标
  HBRUSH hbrBackground;  //窗口背景色
  LPCTSTR lpszMenuName;  //窗口菜单
  LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

初始化代码如下:

   WNDCLASS wndclass;

   wndclass.style = CS_HREDRAW | CS_VREDRAW;  //设置当水平长度或垂直长度改变或移动窗口时,重画整个窗口 wndclass.lpfnWndProc = (WNDPROC)WinSunProc;  //设置WinSunProc为窗口处理函数 wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance;  // wndclass.hIcon = LoadIcon(NULL, IDI_ERROR);  //设置图标为系统的错误图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //设置鼠标光标为系统箭头光标 wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);  //设置背景画刷为深灰色 wndclass.lpszMenuName = NULL;  //无窗口菜单 wndclass.lpszClassName = L"WeiXin";  //设置窗口类名

3.注册窗口

   RegisterClass(&wndclass);

4.创建窗口

    HWND hwnd;
    hwnd = CreateWindow(L"WeiXin",   //指定窗口类名,这可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。
              L"测试",   //设置窗口名字
              WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,  //设置无最大化(~WS_MAXIMIZEBOX表示取反最大化窗口)窗口风格
               100, 100, 640, 480,   //窗口初始位置设置为(100,100),大小为640x480
              NULL,   //无父窗口设为NULL
              NULL,   //无菜单设为NULL
              hInstance,   //窗口实例句柄
              NULL);  //窗口创建数据

5.显示并更新窗口

    ShowWindow(hwnd, SW_SHOWNORMAL);  //设置正常显示
    UpdateWindow(hwnd);

6.消息循环(保证窗口一直显示)

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))  //设置NULL表示接收所有窗口消息
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

完整代码如下:

#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = (WNDPROC)WinSunProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_ERROR);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = L"WeiXin";

    RegisterClass(&wndclass);

    HWND hwnd;
    hwnd = CreateWindow(L"WeiXin", L"测试", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 100, 100, 640, 480, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

 

推荐阅读