簡體   English   中英

在CreateWindow上設置HWND似乎失敗

[英]Set HWND on CreateWindow appears to fail

我來自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轉換為CREATESTRUCTpointer 從中獲得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轉換。 如果要在類中包含所有代碼,這是一種方法。 我發現最好不必在類中擺脫每段代碼。 取決於我正在編寫的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM