主窗口编程---掌握mainwin32的基础知识

作者:广东麻将开发公司 阅读:40 次 发布时间:2025-04-29 15:36:22

摘要:在Windows程序开发中,主窗口编程是一项非常重要的任务。主窗口是程序的核心窗口,它承载了整个应用程序的界面。主窗口的创建是任何Windows程序的第一步,而在此过程中,使用C++语言及其面向对象的编程风格,可以为完整、高效、稳定的应用程序铺平道路。在Windows编程中,主窗...

在Windows程序开发中,主窗口编程是一项非常重要的任务。主窗口是程序的核心窗口,它承载了整个应用程序的界面。主窗口的创建是任何Windows程序的第一步,而在此过程中,使用C++语言及其面向对象的编程风格,可以为完整、高效、稳定的应用程序铺平道路。在Windows编程中,主窗口的创建与操作主要依靠WinAPI,而WinAPI提供了一套C/C++编程接口,我们通常称之为mainwin32。

主窗口编程---掌握mainwin32的基础知识

在本文中,我们将探讨WinAPI主窗口编程的基础知识。我们将从如何创建主窗口开始,深入研究主窗口处理消息及其使用。我们还将介绍如何添加菜单和工具栏,以及如何处理常见的应用程序事件。最后,我们将了解如何退出应用程序并清理所有资源。

创建主窗口

主窗口的创建是WinAPI主窗口编程的第一步。WinAPI使用CreateWindowEx函数创建主窗口。以下是CreateWindowEx函数的一般形式:

```

HWND CreateWindowEx(

DWORD dwExStyle, // 扩展风格

LPCTSTR lpClassName, // 窗口类名

LPCTSTR lpWindowName, // 窗口标题

DWORD dwStyle, // 窗口风格

int x, int y, // 窗口位置

int nWidth, int nHeight,// 窗口大小

HWND hWndParent, // 父窗口句柄

HMENU hMenu, // 菜单句柄

HINSTANCE hInstance, // 应用程序实例句柄

LPVOID lpParam // 创建窗口时附加的实例数据

);

```

下面是CreateWindowEx各参数的含义:

- dwExStyle:扩展窗口样式,通常为0;

- lpClassName:窗口类名,是先前使用RegisterClassEx函数创建窗口类时指定的名称;

- lpWindowName:窗口标题,可以是简单的字符串;

- dwStyle:窗口风格,通常包括WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_MINIMIZEBOX、WS_MAXIMIZEBOX和WS_THICKFRAME等;

- x、y:窗口在屏幕上的位置;

- nWidth, nHeight:窗口的宽度和高度;

- hWndParent:父窗口的句柄,如果是顶级窗口,则该值为NULL;

- hMenu:窗口的菜单句柄或者子窗口ID号;

- hInstance:应用程序实例句柄,通常通过WinMain函数的参数hInstance获取;

- lpParam:创建窗口时附加的实例数据,可以是任意指针。

主要参数注释完毕,我们来看一个简单的示例:

```

#include

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

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

{

const char szClassName[] = "MyGreateAppWndClass";

const char szAppName[] = "MyGreateApp";

WNDCLASS wc = {0};

HWND hWnd = NULL;

MSG msg;

wc.lpfnWndProc = WndProc;

wc.hInstance = hInstance;

wc.lpszClassName = szClassName;

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

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

if (!RegisterClass(&wc)) {

MessageBox(NULL, "窗口注册失败!", szAppName, MB_ICONERROR);

return 0;

}

hWnd = CreateWindow(szClassName, szAppName,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL);

if (!hWnd) {

MessageBox(NULL, "窗口创建失败!", szAppName, MB_ICONERROR);

return 0;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

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

{

switch (message) {

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

```

上面代码中,我们定义了一个名为MyGreateApp的主窗口,并为其设置了窗口类名和窗口的创建和销毁函数。函数WndProc用于为主窗口处理消息,包括WM_CREATE、WM_PAINT、WM_SIZE、WM_CLOSE和WM_DESTROY等消息。在本示例中,WndProc只响应WM_DESTROY消息,当用户关闭窗口时,程序通过PostQuitMessage函数发送WM_QUIT消息结束主消息循环。

在主窗口创建后,通过ShowWindow函数显示主窗口并通过UpdateWindow函数更新窗口内容。在主消息循环中,我们使用GetMessage、TranslateMessage和DispatchMessage函数获取消息并将其分配给WndProc进行处理。

处理主窗口消息

处理主窗口消息是WinAPI主窗口编程的核心任务之一。在主窗口创建后,它将不断接收Windows系统的消息,并将其分配到对应的函数中进行处理。主要的消息有:

- WM_CREATE:当窗口被创建时发送此消息。在接收到此消息后,程序有机会进行初始化并为窗口分配所需的资源;

- WM_SIZE:当窗口大小更改时,发送此消息通知程序。在接收到此消息后,程序可以根据新大小重新调整窗口元素的位置和大小;

- WM_PAINT:当窗口需要重新绘制时,Windows操作系统将向程序发送此消息;

- WM_KEYDOWN/WM_KEYUP:当用户按下/释放键盘上的键时,Windows操作系统将发送此消息;

- WM_MOUSEMOVE:当鼠标移动时,Windows操作系统将发送此消息;

- WM_LBUTTONDOWN/WM_LBUTTONUP/WM_RBUTTONDOWN/WM_RBUTTONUP:当用户单击了鼠标左/右按钮时,Windows操作系统将发送此消息;

- WM_COMMAND:当用户从菜单或工具栏中选择命令时,Windows操作系统将发送此消息。

应用程序在接收到某个消息后,将依据消息的类型执行对应的操作。对于不同的消息类型,WndProc函数应该做出不同的响应。以下代码示例处理了WM_CREATE、WM_SIZE和WM_DESTROY消息:

```

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

{

switch (message) {

case WM_CREATE:

// 对新窗口进行初始化工作

break;

case WM_SIZE:

// 调整窗口元素的位置和大小

break;

case WM_DESTROY:

// 退出应用程序

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

```

添加菜单和工具栏

除了主窗口消息处理外,WinAPI主窗口编程也需要支持菜单和工具栏的添加和使用。在Windows程序中,菜单可以通过程序代码或资源文件的方式添加到应用程序中。首先,应该使用下面的函数将菜单添加到主窗口中:

```

SetMenu(HWND hWnd, HMENU hMenu);

```

可以使用以下代码示例从资源文件中加载菜单并将其添加到主窗口:

```

HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU));

SetMenu(hWnd, hMenu);

```

同样,工具栏可以通过API或资源文件的方式添加到应用程序中。以下是将工具栏添加到主窗口的示例:

```

HWND hToolBar = CreateToolbarEx(hWnd, WS_CHILD | TBSTYLE_TOOLTIPS | WS_VISIBLE,

IDR_TOOLBAR, 0, NULL, 0, NULL, 0, 0, 0, 0, 0,

sizeof(TBBUTTON));

if (!hToolBar) {

MessageBox(hWnd, "无法创建工具栏!", szAppName, MB_ICONERROR);

return 0;

}

```

这段代码创建了一个新的工具栏并将其添加到主窗口中。在上面的代码中,我们定义了一个TBBUTTON数组,该数组包含了工具栏上的所有按钮。通过CreateToolbarEx函数,我们可以将TBBUTTON数组传递给系统,并使用它来创建工具栏。在创建工具栏后,通过ShowWindow将其显示出来。

处理常见应用程序事件

在WinAPI主窗口编程过程中,也需要对常见的应用程序事件进行处理。例如,在用户关闭程序时,需要清理资源并退出程序。以下是一些常见事件的处理:

- WM_CLOSE:当用户关闭窗口时,Windows将向程序发送WM_CLOSE消息。在程序中,可以使用以下代码处理此事件:

```

case WM_CLOSE:

DestroyWindow(hWnd);

break;

```

- WM_COMMAND:当用户选择菜单选项或工具栏按钮时,Windows将向程序发送WM_COMMAND消息。在程序中,可以使用以下代码处理此事件:

```

case WM_COMMAND:

switch (LOWORD(wParam)) {

case ID_FILE_OPEN:

// 处理打开文件的逻辑

break;

case ID_FILE_SAVE:

// 处理保存文件的逻辑

break;

case ID_EDIT_COPY:

// 处理复制内容的逻辑

break;

case ID_EDIT_PASTE:

// 处理粘贴内容的逻辑

break;

}

break;

```

应用程序退出

在WinAPI主窗口编程中,应用程序退出时,需要清理所有资源并终止应用程序的消息循环。以下代码示例演示了如何终止应用程序:

```

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

{

switch (message) {

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

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

{

MSG msg = {0};

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

// 终止应用程序

return (int)msg.wParam;

}

```

当应用程序退出时,Windows将清理资源并向应用程序发送WM_QUIT消息。应用程序收到此消息后,可以终止消息循环并返回msg.wParam。这将作为应用程序的退出代码。

总结

WinAPI主窗口编程是Windows应用程序开发的基础。在本文中,我们介绍了如何创建和处理主窗口消息,如何添加菜单和工具栏,以及如何处理应用程序退出事件。这些基础知识是编写任何Windows应用程序的基础。通过深入了解mainwin32的基本概念,你将能够构建出更加复杂且高效的应用程序。

  • 原标题:主窗口编程---掌握mainwin32的基础知识

  • 本文链接:https://qipaikaifa.cn/zxzx/14835.html

  • 本文由深圳中天华智网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与中天华智网联系删除。
  • 微信二维码

    ZTHZ2028

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:157-1842-0347


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部