gpt4 book ai didi

c++ - 在 CreateWindow 上设置 HWND 似乎失败

转载 作者:可可西里 更新时间:2023-11-01 09:48:56 25 4
gpt4 key购买 nike

我来自 C#,对此非常陌生,所以请多多包涵。

我有一个 MainWindow 类,它有一些私有(private)的 HWND 变量。一个用于窗口本身,一个用于每个控件。我假设我需要跟踪它们,或者它会让以后的事情变得更容易?

无论如何,我有:

class GUIMain
{
private:
HINSTANCE hInstance;
HWND hWnd; // The windows itself
HWND cmdGenerate, cmdQuit; // 2 buttons

我有一个名为 initialise(HWND hWnd) 的私有(private)方法,它在 WM_CREATE 上调用并将所有控件添加到窗口:

void MainWindow::initialise(HWND hWnd)
{
this->hWnd = hWnd;

cmdGenerate = CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."),
WS_VISIBLE | WS_CHILD,
6, 6, 150, 25,
hWnd, (HMENU)1, 0, 0);

cmdQuit = CreateWindow(TEXT("BUTTON"), TEXT("&Quit"),
WS_VISIBLE | WS_CHILD,
6, 37, 150, 25,
hWnd, (HMENU)2, 0, 0);
}

然而,这似乎并没有将按钮放在窗口上。事实上,当我调试时,我可以看到它甚至没有超过第一行。奇怪的是,当我将其更改为:

void MainWindow::initialise(HWND hWnd)
{
//this->hWnd = hWnd;

/*cmdGenerate = */CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."),
WS_VISIBLE | WS_CHILD,
6, 6, 150, 25,
hWnd, (HMENU)1, 0, 0);

/*cmdQuit = */CreateWindow(TEXT("BUTTON"), TEXT("&Quit"),
WS_VISIBLE | WS_CHILD,
6, 37, 150, 25,
hWnd, (HMENU)2, 0, 0);
}

它似乎工作正常。

逻辑似乎表明,将 CreateWindow 函数返回的值分配给私有(private) HWND 变量会导致问题,但我以前这样做过,没有遇到问题?

我以前的代码和这段代码之间的唯一区别是我现在使用的是类,而之前(在我学习的时候)我只是在 WinMainWndProc 中拥有所有内容.

WinMain:http://pastebin.com/j54vW9gc
头文件:http://pastebin.com/cUs4vVJ6
CPP 文件:http://pastebin.com/B5KUXTvx

最佳答案

欢迎来到不是为 C++ 设计的 win32 世界。这是一个很好的第一次尝试。我重写了数百次试图制作通用框架的类(class),然后才说它不值得再花时间了。

您的 WinMain() 也会有所帮助,但我看到的一个大问题是您对 CreateWindowEx() 的调用。你发送的最后一个参数是 0。当你稍后检索它时 SetWindowLong(hWnd, GWL_USERDATA, (long) ((LPCREATESTRUCT)lParam)->lpCreateParams); 你说它是一个指向类的指针.你的意思是:

         hWnd = CreateWindowEx(0, TEXT("AS2MainWindow"),
TEXT("AS2"),
WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
824, 350,
0, 0,
hInstance, this);

寻找其他问题。看看是否有帮助。如果不是,也许你的帖子是你的 main()

添加:创建窗口Ex

HWND WINAPI CreateWindowEx(
__in DWORD dwExStyle,
__in_opt LPCTSTR lpClassName,
__in_opt LPCTSTR lpWindowName,
__in DWORD dwStyle,
__in int x,
__in int y,
__in int nWidth,
__in int nHeight,
__in_opt HWND hWndParent,
__in_opt HMENU hMenu,
__in_opt HINSTANCE hInstance,
__in_opt LPVOID lpParam
);

最后一个参数lpParam 是可选的。因此,当您将它设置为 0 时,它不会造成任何伤害。但这就是您将某些内容“发送”到您的 WM_NCCREATEWM_CREATE 的方式。它可以是任何 LPVOID。在 C 中,您可以发送一个指向结构或任何您想要的指针。在这种情况下,您希望向它发送一个指向与您的窗口有关的对象的指针。

要在 WM_NCCREATE 或 WM_CREATE 中获取此参数,请使用以下代码:

(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);

这就是说将 lParam 转换为指向 CREATESTRUCTpointer。比从中获取 lpCreateParams。并将其转换为 long。这与我编写这段难以理解的代码的方式略有不同。如果你把它分成几个步骤,它看起来更容易。如果您需要进一步解释,请告诉我。

下面是 CreateStruct 的定义,以便您了解全貌。它不仅仅包含 lpCreateParams。 (你选择它作为你类(class)的指针)。

typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCTSTR lpszName;
LPCTSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT, *LPCREATESTRUCT;

了解了这一切之后。查看 ATL 转换。如果您希望所有代码都在类中,那么这是可行的方法。我发现最好不要让每段代码都在一个类中,而不必在类中。取决于我正在编写的程序。

关于c++ - 在 CreateWindow 上设置 HWND 似乎失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032767/

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