21xrx.com
2024-11-05 14:53:46 Tuesday
登录
文章检索 我的文章 写文章
C++ 创建窗口教程
2023-07-03 10:47:15 深夜i     --     --
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++栈代码实例

评论区

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