首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CreateWindow上设置HWND似乎失败

在CreateWindow上设置HWND似乎失败
EN

Stack Overflow用户
提问于 2011-11-07 12:33:56
回答 1查看 3.5K关注 0票数 2

我是从C#来的,在这方面非常新手,所以请容忍我。

我有一个包含一些私有HWND变量的MainWindow类。一个用于窗口本身,一个用于每个控件。我想我需要跟踪他们,或者这将使事情变得更容易?

不管怎样,我有:

代码语言:javascript
复制
class GUIMain
{
private:
    HINSTANCE hInstance;
    HWND hWnd; // The windows itself
    HWND cmdGenerate, cmdQuit; // 2 buttons

我有一个在WM_CREATE上调用的名为initialise(HWND hWnd)的私有方法,它将所有控件添加到窗口中:

代码语言:javascript
复制
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);
}

然而,这似乎并没有将按钮放在窗口上。事实上,当我调试时,我可以看到它甚至没有超过第一行。奇怪的是,当我把它改成这样:

代码语言:javascript
复制
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);
}

它似乎工作得很好。

逻辑似乎表明,将CreateWindow函数返回的值赋给私有HWND变量会导致问题,但我以前这样做过,没有问题吗?

我以前的代码和这段代码之间的唯一区别是,我现在使用类,而以前(在我学习的时候)我只需要WinMainWndProc中的所有东西。

WinMain:http://pastebin.com/j54vW9gc

头文件:http://pastebin.com/cUs4vVJ6

CPP文件:http://pastebin.com/B5KUXTvx

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-07 12:57:52

欢迎来到不是为C++设计的win32世界。这是一个很好的第一次尝试。我重写了数百次试图创建通用框架的类,然后说它不值得再花时间了。

您的WinMain()也会有所帮助,但我看到的一个大问题是您对CreateWindowEx()的调用。您发送的最后一个参数是0。当您稍后检索它时,SetWindowLong(hWnd, GWL_USERDATA, (long) ((LPCREATESTRUCT)lParam)->lpCreateParams);会说它是一个指向类的指针。你的意思是:

代码语言:javascript
复制
         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

代码语言:javascript
复制
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中获取此参数,请使用以下代码:

代码语言:javascript
复制
(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);

也就是说,将lParam转换为pointer,再转换为CREATESTRUCT。也不愿从中得到lpCreateParams。并将其转换为long。这与我写的这段难以理解的代码略有不同。如果你把它分成几个步骤,看起来就更容易了。如果你需要进一步的解释,请在这里告诉我。

下面是CreateStruct的定义,让你全面了解它。它包含的不仅仅是lpCreateParams。(您选择它作为指向您的类的指针)。

代码语言:javascript
复制
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吧。如果你想把所有的代码都放在类中,这是个不错的选择。我发现,当每段代码都在一个类中时,当它不是必须存在的时候,它会变得更好。这取决于我正在编写的程序。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8032767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档