在CreateWindow上设置HWND似乎失败

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函数返回的值会导致问题,但我之前已经做过这个并没有出现问题?

我以前的代码和该代码之间的唯一区别是,我现在使用的类而在此之前(而我正在学习)我只是在一切WinMainWndProc.

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

Joe*_*ath 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);
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)

这是说投lParampointerCREATESTRUCT.比得到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.如果你想要所有代码都在类中,那就是它的方法.我觉得最好远离类中的每一段代码而不是必须的.取决于我写的程序.