我正在嘗試在對話框中創建一個簡單的下拉選單。這是實際執行此操作的代碼位:
BOOL CALLBACK Remove(HWND hDlgc, UINT message, WPARAM wParam, LPARAM lParam)
//message handler for remove category box
{
//UNREFERENCED_PARAMETER(lParam);
HINSTANCE current = GetModuleHandle(NULL);
//GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_PIN, "comctl32.dll", NULL);
CreateWindow(WC_COMBOBOXW, _TEXT(""), CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE, 100, 100, 200, 200, hDlgc, NULL, NULL, NULL, NULL);
這會起作用,它會顯示組合框,但只有在等待 2 分鐘左右之后......非常不受歡迎!在組合框出現之前,我的程式將進入無回應狀態。輸出顯示 comctl32.dll 在組合框出現之前被加載和卸載了大約 1500 次。當它發生時,它仍然沒有回應,我必須等待更長時間才能開始作業。我嘗試固定模塊以停止加載和卸載,但這并沒有做任何事情。任何幫助表示贊賞。如您所見,我對 win32 編程非常陌生。我讓我的程式的后端運行良好,只是這個 gui 困擾著我。
編輯:這是我能得到的盡可能短的代碼。只需在VS中創建一個空白桌面專案,然后將底部的“about”功能替換為以下內容:(并且還包括commctrl.h)
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
HWND dd_Hand = CreateWindow(WC_COMBOBOXW, _TEXT(""), CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
20, 20, 200, 200, hDlg, NULL, NULL, NULL);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
如果我這樣做,我會得到前面描述的癥狀。
再次編輯:我將組合框的 createwindow 函式放入 WndProc 的 WM_CREATE 案例中,一切正常,立即加載。我開始懷疑這是在對話框中創建組合框的正確方法。任何以其他方式執行此操作的建議(尚未能夠找到使用拆分按鈕資源執行此操作的方法)也受到歡迎。
uj5u.com熱心網友回復:
解決方案很簡單。只需輸入以下代碼:
HWND dd_Hand = CreateWindow(WC_COMBOBOXW, _TEXT(""), CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
20, 20, 200, 200, hDlg, NULL, NULL, NULL);
以及加載組合框的代碼,因此它只運行一次。沒有更多的問題。另一種更簡單的方法是創建一個組合框資源并使用 SendMessage() 函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515601.html
標籤:C 温纳皮
