我来自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
答案 0 :(得分:6)
欢迎来到不是为C ++设计的win32世界。这是一个很好的第一次尝试。我重新尝试制作一个通用框架数百次,然后再说它不值得了。
你的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);
寻找其他问题。看看是否有帮助。如果没有,也许你发布你的主()
<强>加了:强> CreateWindowEx
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_NCCREATE
或WM_CREATE
“发送”内容的方法。它可以是任何LPVOID。在C中,您可以发送指向结构或任何所需内容的指针。在这种情况下,您希望向它发送一个指向窗口对象的指针。
要在WM_NCCREATE或WM_CREATE中获取此参数,请使用以下代码:
(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);
这就是说lParam
到pointer
到CREATESTRUCT
。而不是从它获得lpCreateParams
。并将其转换为long
。这与我编写这段难以理解的代码的方式略有不同。如果你将它分成几个步骤,它看起来会更容易。如果您需要在此进一步说明,请与我们联系。
以下是全面了解CreateStruct的定义。它不仅仅包含lpCreateParams。 (你选择成为你班级的指针)。
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 thunking。如果你想要所有代码都在类中,那就是它的方法。我觉得最好远离类中的每一段代码而不是必须的。取决于我写的程序。