【发布时间】:2011-12-23 09:12:00
【问题描述】:
我来自 C# 并且对此非常陌生,所以请多多包涵。
我有一个 MainWindow 类,它有一些私有的 HWND 变量。一个用于窗口本身,一个用于每个控件。我想我需要跟踪它们,或者以后会更容易?
无论如何,我有:
class GUIMain
{
private:
HINSTANCE hInstance;
HWND hWnd; // The windows itself
HWND cmdGenerate, cmdQuit; // 2 buttons
我有一个名为 initialise(HWND hWnd) 的私有方法,它在 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);
}
它似乎工作正常。
逻辑似乎表明将 HWND 私有变量的值分配给 CreateWindow 函数返回值会导致问题,但我之前已经这样做过并且没有问题?
我之前的代码和这段代码的唯一区别是我现在使用的是类,而之前(在我学习的时候)我只是在 WinMain 和 WndProc 中拥有所有东西。
WinMain:http://pastebin.com/j54vW9gc
头文件:http://pastebin.com/cUs4vVJ6
CPP 文件:http://pastebin.com/B5KUXTvx
【问题讨论】:
-
似乎一个应该工作,另一个应该工作。你能告诉我们你的 WndProc 吗?您说初始化(sp)是私有的,并且从 WM_CREATE 调用。 wndproc 是静态成员函数吗?对象在哪里创建?
-
我附上了完整源代码的链接。
-
听起来你的
this指针不正确。 -
@AlfP.Steinbach 这怎么可能?这样的事情在 C# 中是不可能发生的 :(
-
@Ozzah:请参阅下面 Joe McGrath 的回答。
标签: c++ windows winapi createwindow