在CreateWindow上设置HWND失败

Set HWND on CreateWindow appears to fail

本文关键字:HWND 失败 设置 CreateWindow      更新时间:2023-10-16

我是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函数返回的值会导致问题,但我以前这样做过,没有问题吗?

我以前的代码和这段代码之间的唯一区别是,我现在使用类,而以前(当我正在学习的时候)我只是在WinMainWndProc中拥有一切。

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_NCCREATEWM_CREATE。它可以是任意的LPVOID。在C语言中,你可以发送一个指向结构体的指针或任何你想要的东西。在这种情况下,你想给它发送一个指向关于你的窗口的对象的指针。

要在WM_NCCREATE或WM_CREATE中获得此参数,请使用以下代码:

(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);

这就是说将lParam转换为pointerCREATESTRUCT。然后从中得到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的想法。如果你想把所有的代码都放在类里,这就是你要走的路。我发现最好不要把每一段代码都放在类中,而不必放在类中。这取决于我写的程序。