21xrx.com
2025-06-25 06:20:28 Wednesday
登录
文章检索 我的文章 写文章
C++ 创建窗口教程
2023-07-03 10:47:15 深夜i     16     0
C++编程 窗口创建 图形界面 Win32 API 教程

C++是一种流行的编程语言,已广泛应用于许多应用程序和游戏,同时也被广泛用于开发窗口应用程序。本文将介绍如何使用C++创建一个窗口。

第一步是定义窗口类以及需要用到的变量。我们需要定义窗口的类别、窗口标题、窗口位置和大小等属性,并声明一些必要的变量来存储窗口的句柄和消息等。

//define class and variables
const char g_szClassName[] = "MyWindowClass";
HWND hwnd;
MSG Msg;

第二步是编写窗口处理函数,也称为回调函数。我们需要在此函数中定义窗口的处理方式,包括消息处理、范围大小定义和重绘等。

//Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
    case WM_CLOSE:
      DestroyWindow(hwnd);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

第三步是注册窗口类。我们需要定义窗口类,包括窗口处理函数、窗口类名和样式等,并将其注册到系统中。

//register window class
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
  MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
  return 0;
}

第四步是创建窗口。我们需要使用CreateWindowEx函数来创建窗口,指定窗口类别、窗口标题、样式、位置和大小等。

//create window
hwnd = CreateWindowEx(
  WS_EX_CLIENTEDGE,
  g_szClassName,
  "The title of my window",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
  NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
  MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
  return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

以上四个步骤完成后,就可以成功创建一个窗口并显示在屏幕上了。完整的代码如下:

#include <windows.h>
const char g_szClassName[] = "MyWindowClass";
HWND hwnd;
MSG Msg;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
    case WM_CLOSE:
      DestroyWindow(hwnd);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPSTR lpCmdLine, int nCmdShow)
{
  WNDCLASSEX wc;
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = 0;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = g_szClassName;
  wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  if(!RegisterClassEx(&wc))
  {
    MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
    return 0;
  }
  hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    g_szClassName,
    "The title of my window",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
    NULL, NULL, hInstance, NULL);
  if(hwnd == NULL)
  {
    MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
    return 0;
  }
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);
  while(GetMessage(&Msg, NULL, 0, 0) > 0)
  {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }
  return Msg.wParam;
}

在使用此代码创建窗口时,请确保您的编译器已经正确安装并配置正确的库文件和头文件。运行程序后,您应该可以看到创建的窗口,并能够尝试交互式地拖动和调整大小。

  
  
下一篇: C++栈代码实例

评论区