gpt4 book ai didi

C++ 在其他 cpp 文件中创建窗口(不在 WinMain 中)

转载 作者:行者123 更新时间:2023-11-30 04:02:00 25 4
gpt4 key购买 nike

我有一个函数位于与 WinMain 不同的 cpp 文件中,调用时将创建一个窗口。然而,新窗口的窗口类是在 WinMain 中声明和注册的。现在,当我在单独的函数中创建窗口时,我不得不重新声明 CreateWindowEx 函数的第二个和第三个变量:

_In_opt_  LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,

因为实际执行创建的函数的位置无法访问在 WinMain 中创建的那些变量。现在...我的疑问是,我的程序是否真的使用了我在 WinMain 中注册的窗口类?据我所知,重新声明这些变量并创建远离 WinMain 函数的函数可能会导致编译器采用其他一些标准窗口类。那么,我的程序是否真的使用了我在 WinMain 中注册的窗口类?

已编辑:提供更多代码

//+++++++++++++++++++++++++++++++++++++++++++++++++win main 的 cpp 文件:

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

...//previous code made the main window of the program and so forth

const char g_szClassName2[] = "windowClass2";//name of the window class
WNDCLASSEX winClass2;
HWND invisHWnd;

winClass2.cbSize = sizeof(WNDCLASSEX);
winClass2.style = 0;
winClass2.lpfnWndProc = WndProcedure2;
winClass2.cbClsExtra = 0;
winClass2.cbWndExtra = 0;
winClass2.hInstance = hInstance;
winClass2.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winClass2.hCursor = LoadCursor(NULL, IDC_ARROW);
winClass2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
winClass2.lpszMenuName = NULL;
winClass2.lpszClassName = g_szClassName2;
winClass2.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&winClass2);

... //other code irrelevant to issue

}

//++++++++++++++++++++++++++++++++++++++++其他cpp文件:

void otherCppFile::creatingWindow()
{

const char g_szClassName2[] = "windowClass2";//name of the window class
const char WndName2[] = "winClass2";//name of the window class

HWND windowHandle = CreateWindowEx(0,
g_szClassName2,
WndName2,
WS_OVERLAPPEDWINDOW,
0,
0,
800,
500,
NULL,
NULL,
NULL,
NULL);
}

这最后一个函数是否使用在 WinMain 中注册的窗口类,即使它不在 WinMain 中并且函数中重新声明了一些变量?

最佳答案

注册窗口类 的全部意义在于它是独一无二的,您可以在需要时随时使用它。当您使用 RegisterClass[Ex] 函数注册一个窗口类时,您有两个选项来识别它:

  • 您传递给函数的窗口类名称(字符串)。
  • 函数返回的 ATOM(整数值)。

在 99.9% 的情况下,您会忘记 ATOM 而只使用字符串。您需要该字符串来创建 窗口类,因此您不妨紧跟该字符串并使用它来创建该类的窗口

从技术上讲,您的操作是可以的。您有多个变量,但它们都包含完全相同的字符串值,因此一切正常。但那是一场维护噩梦,也违反了 DRY(不要重复自己)规则。如果您想更改窗口类的名称怎么办?您必须找到声明它的每个文件并确保更新它。然后您将不得不永远等待整个项目重新编译,因为您已经触及了大量文件。不好。

相反,您想在全局 范围内声明此变量,使其在创建窗口的项目的每个文件中都可用。将它放在您要包含在所有代码文件中的通用头文件中,或者制作一个单独的 Window.h header 或类似性质的文件,并在适当的地方包含它。

确保将此窗口类名声明为常量。没有理由在您的应用程序执行期间对其进行修改。

如果您正在为在 C++ 中声明和/或使用全局常量而苦苦挣扎,您可以查看 this question 的答案。或者在 Stack Overflow 上自行搜索。这部分不是 Windows 编程所独有的;它只是基本的 C++。

当然,您会经常听说全局变量不好。这是真的。您正在编写的代码并不是真正的 C++。它是C。Windows API 是C API,因此它自然会引导您使用C++ 编写C 代码。如果您想真正编写 C++ 代码,则需要找到(或编写您自己的)围绕基于 C 的 Windows API 的 C++ 包装器。例如,您将编写一个表示窗口的类,并且该类将包含一个静态类级常量,该常量保存您的窗口类的名称。该类将负责创建所有新窗口,因此您不需要将这些信息或那些实现细节分散到多个代码文件中。

窗口名称而言,这是完全不同的。 Windows 不使用它来识别您的窗口。事实上,它是 CreateWindow[Ex] 函数的一个完全可选的参数。您甚至不必为窗口命名。这实际上是出现在窗口标题栏中的名称。它被用户用来识别窗口。因此,它通常需要本地化,并且应该存储在项目的资源文件中,而不是源代码中。使用 LoadString function从项目的资源文件中加载字符串。您可以在创建窗口时动态地执行此操作:只需加载要用作该特定窗口标题的字符串。

关于C++ 在其他 cpp 文件中创建窗口(不在 WinMain 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com