Ozz*_*zah 2 c++ windows winapi createwindow
我来自C#而且很新,所以请耐心等待.
我有一个MainWindow有一些私有HWND变量的类.一个用于窗口本身,一个用于每个控件.我想我需要跟踪它们,或者以后会让事情变得更容易吗?
无论如何,我有:
class GUIMain
{
private:
HINSTANCE hInstance;
HWND hWnd; // The windows itself
HWND cmdGenerate, cmdQuit; // 2 buttons
Run Code Online (Sandbox Code Playgroud)
我有一个调用的私有方法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);
}
Run Code Online (Sandbox Code Playgroud)
但是这似乎没有把按钮放在窗口上.事实上,当我调试时,我可以看到它甚至没有越过第一行.奇怪的是,当我把它更改为:
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);
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常.
逻辑似乎暗示为私有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);
Run Code Online (Sandbox Code Playgroud)
寻找其他问题.看看是否有帮助.如果没有,也许你的帖子你的主()
补充: 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
);
Run Code Online (Sandbox Code Playgroud)
最后一个参数lpParam是可选的.因此,当你将它设置为0时,它不会伤害任何东西.但这就是你如何"发送"给你WM_NCCREATE或你的东西WM_CREATE.它可以是任何LPVOID.在C中,您可以发送指向结构或任何所需内容的指针.在这种情况下,您希望向它发送一个指向窗口对象的指针.
要在WM_NCCREATE或WM_CREATE中获取此参数,请使用以下代码:
(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);
Run Code Online (Sandbox Code Playgroud)
这是说投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;
Run Code Online (Sandbox Code Playgroud)
了解了这一切之后.查看ATL thunking.如果你想要所有代码都在类中,那就是它的方法.我觉得最好远离类中的每一段代码而不是必须的.取决于我写的程序.