在CreateWindow上设置HWND失败
Set HWND on CreateWindow appears to fail
我是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
欢迎来到不是为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);
查找其他问题。看看有没有帮助。如果没有,你可以发布你的main()
补充道: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的想法。如果你想把所有的代码都放在类里,这就是你要走的路。我发现最好不要把每一段代码都放在类中,而不必放在类中。这取决于我写的程序。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在CreateWindow上设置HWND失败