21xrx.com
2024-05-20 13:38:37 Monday
登录
文章检索 我的文章 写文章
如何使用C++创建窗口
2023-07-04 23:55:12 深夜i     --     --
C++ 窗口 创建

在C++中,使用Windows API可以轻松创建自己的窗口应用程序。下面将介绍如何使用C++来创建一个简单的窗口应用程序。

1. 定义窗口类

使用Windows API创建窗口需要创建一个窗口类,它描述了窗口的样式、消息处理函数等信息。在C++中,我们可以使用如下代码来定义窗口类:


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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

  WNDCLASSEX wcex;

  wcex.cbSize = sizeof(WNDCLASSEX);

  wcex.style = CS_HREDRAW | CS_VREDRAW;

  wcex.lpfnWndProc = WndProc;

  wcex.cbClsExtra = 0;

  wcex.cbWndExtra = 0;

  wcex.hInstance = hInstance;

  wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

  wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);

  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

  wcex.lpszMenuName = nullptr;

  wcex.lpszClassName = "MyWindowClass";

  wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

  if (!RegisterClassEx(&wcex))

  {

    MessageBox(nullptr, "窗口类注册失败!", "错误提示", MB_ICONERROR | MB_OK);

    return 1;

  }

  // 窗口创建代码

  ...

}

代码中,我们定义了一个名为"MyWindowClass"的窗口类,并注册到系统中。其中,`WndProc`函数是窗口的消息处理函数,后面会介绍到。

2. 创建并显示窗口

在上一步中,我们定义了窗口类,接下来需要实际创建窗口并显示出来。在C++中,我们使用如下代码来创建窗口:


HWND hWnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,

             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

             nullptr, nullptr, hInstance, nullptr);

if (!hWnd)

{

  MessageBox(nullptr, "窗口创建失败!", "错误提示", MB_ICONERROR | MB_OK);

  return 1;

}

代码中,我们使用`CreateWindow`函数创建窗口,并传入窗口类名、窗口标题、样式参数等信息。如果创建失败,我们通过`MessageBox`函数提示用户。

接下来,我们需要将窗口显示出来(不然用户怎么看到呢?)。在C++中,我们使用如下代码来显示窗口:


ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

代码中,`ShowWindow`函数用来显示窗口,`UpdateWindow`函数用来刷新窗口显示。

3. 消息处理函数

在窗口显示出来后,用户可能会进行各种操作,比如移动窗口、调整窗口大小、关闭窗口等等。这些操作将会触发窗口消息,我们需要编写消息处理函数来处理这些消息。

在C++中,我们可以使用如下代码来定义消息处理函数`WndProc`:


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

{

  switch (message)

  {

  case WM_PAINT:

    {

      PAINTSTRUCT ps;

      HDC hdc = BeginPaint(hWnd, &ps);

      EndPaint(hWnd, &ps);

    }

    break;

  case WM_DESTROY:

    PostQuitMessage(0);

    break;

  default:

    return DefWindowProc(hWnd, message, wParam, lParam);

  }

  return 0;

}

代码中,我们使用`switch`语句来处理窗口消息,对于`WM_PAINT`消息,我们使用`BeginPaint`和`EndPaint`函数来处理窗口的绘制工作;对于`WM_DESTROY`消息,我们调用`PostQuitMessage`函数来通知系统关闭窗口。

4. 循环消息

在窗口显示出来并启动消息循环后,我们需要不断地处理消息,以响应用户的操作。在C++中,我们可以使用如下代码来循环处理消息:


MSG msg;

while (GetMessage(&msg, nullptr, 0, 0))

{

  TranslateMessage(&msg);

  DispatchMessage(&msg);

}

代码中,`GetMessage`函数用来获取消息队列中的消息,如果返回`FALSE`,表示消息队列已经被清空,我们可以退出消息循环了;`TranslateMessage`函数用来将虚拟键消息转换成字符消息;`DispatchMessage`函数用来分派消息给窗口消息处理函数`WndProc`处理。

至此,我们就成功创建了一个简单的窗口应用程序。当然,这只是一个起点,我们可以在此基础上不断扩展,创建更加丰富、功能更加强大的窗口应用程序。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复