![](/img/trans.png)
[英]How can I create a window (HWND) without using CreateWindow(Ex)?
[英]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
函數返回的值會引起問題,但我之前已經這樣做過,並且沒有問題嗎?
我之前的代碼和這段代碼之間的唯一區別是,我現在正在使用類,而以前(在我學習期間)我只擁有WinMain
和WndProc
所有內容。
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_NCCREATE
或WM_CREATE
。 它可以是任何LPVOID。 在C語言中,您可以發送指向結構或任何所需內容的指針。 在這種情況下,您想向它發送一個指向與您的窗口有關的對象的指針。
要在WM_NCCREATE或WM_CREATE中獲取此參數,請使用以下代碼:
(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);
就是說將lParam
轉換為CREATESTRUCT
的pointer
。 從中獲得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.