我一直在嘗試通過繼承父視窗程序來創建子視窗。我遇到了一些我無法弄清楚的非常奇怪的行為。
后CreateWindow()呼叫時,所述代碼將停止執行并立即跳轉到碼塊的頂部(這是一個WM_CREATE訊息)和在一個無限回圈在再次執行的一切。
我以前從未這樣做過,所以我不知道我做錯了什么。這是代碼。
LRESULT CALLBACK EditorProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
HWND RichEdit;
HWND Toolbar;
HWND ListboxType, ListboxArch;
HWND hwndBuildButton;
HWND Labels;
hdc = GetDC(hwnd);
GetClientRect(hwnd, &rect);
switch (message)
{
case WM_CREATE:
LoadLibrary(TEXT ("Msftedit.dll"));
//Create Child Windows
RichEdit = CreateWindow(MSFTEDIT_CLASS, TEXT("EDITOR"), WS_CHILD | ES_MULTILINE | WS_VISIBLE | WS_BORDER,
0, 0, 0, 0, hwnd, RichEditorID, GetModuleHandle(NULL), NULL);
Toolbar = CreateWindow(TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_FLAT, 0, 0, 0, 0, hwnd,
ToolBarID, GetModuleHandle(NULL), NULL);
ListboxType = CreateWindow(WC_LISTBOX, NULL, WS_CHILD| WS_VISIBLE, 0, 0, 0, 0, Toolbar, ChildID1 2,
GetModuleHandle(NULL), NULL);
ListboxArch = CreateWindow(WC_LISTBOX, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, Toolbar, ChildID1 3,
GetModuleHandle(NULL), NULL);
hwndBuildButton = CreateWindow(WC_BUTTON, L"Build", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, Toolbar, ChildID1 4,
GetModuleHandle(NULL), NULL);
Labels = CreateWindow(szEditorName,NULL, WS_CHILD, 0, 0, 0, 0, hwnd, ChildID1 5,
GetModuleHandle(NULL), NULL);
OriginalProc = SetWindowLong(Labels, GWL_WNDPROC, LabelProc);
EnumChildWindows(hwnd, EditorChildProc, (LPARAM)&rect);
return 0;
這是子類視窗程序:
LRESULT CALLBACK LabelProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR ArchLabel[] = (L"Architecture:");
TCHAR BuildLabel[] = (L"Build Type:");
hdc = GetDC(hwnd);
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetTextAlign(hdc, TA_TOP);
TextOut(hdc, 50, 50, ArchLabel, ARRAYSIZE(ArchLabel));
TextOut(hdc, 100, 50, BuildLabel, ARRAYSIZE(BuildLabel));
EndPaint(hwnd, &ps);
return TRUE;
}
ReleaseDC(hwnd, hdc);
return CallWindowProcA(OriginalProc, hwnd, message, wParam, lParam);
}
代碼在以下位置停止并重復:
Labels = CreateWindow(szEditorName,NULL, WS_CHILD, 0, 0, 0, 0, hwnd, ChildID1 5,
GetModuleHandle(NULL), NULL);
uj5u.com熱心網友回復:
免責宣告:此答案中的所有內容都是假設,因為我們無法看到所有代碼。
我希望在這一行:
Labels = CreateWindow(szEditorName,NULL, WS_CHILD, 0, 0, 0, 0, hwnd, ChildID1 5,
GetModuleHandle(NULL), NULL);
szEditorName與您的父視窗的類名不同。如果是,為什么您對無限回圈感到驚訝?
您創建父 szEditorName 視窗,在 WM_CREATE 中創建子視窗,但最后一個視窗與父視窗具有相同的類,因此相同的視窗程序,因此一次又一次地呼叫 EditorProc......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314732.html
