2011-11-07 51 views
1

我来自C#,非常新,所以请耐心等待。在CreateWindow上设置HWND似乎失败

我有一个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

+0

似乎如果一个人应该工作,另一个应该。你能告诉我们你的WndProc吗?你说初始化(sp)是私有的,并从WM_CREATE调用。 wndproc是一个静态成员函数吗?对象在哪里被创建? –

+0

我附上了完整源代码的链接。 – Ozzah

+0

听起来像你的'this'指针是不正确的。 –

回答

5

欢迎的Win32的世界,这不是专为C++。这是一个很好的尝试。在我说过不值得花更多时间之前,我试图建立一个通用框架几百次。

您的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); 

这是说投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; 

了解了这一切之后。检查ATL thunking。它的方式去如果你想要所有的代码里面的类。我发现当它不需要时,可以远离每一段代码。取决于我写的程序。

+0

这似乎解决它为什么我需要传递一个'this'在CreateWindowEx即使我设置与'指针调用SetWindowLong ?'是什么这两个指针之间的差异 – Ozzah

+0

加入到回答,因为相当长的交代 –

+0

没关系,我理解了它,这是因为,当我去'((LPCREATESTRUCT)lParam的)! - > lpCreateParams'有来自某处,那是从'​​this'指针给我'CreateWindowEx',对吧?:) – Ozzah