调用createwindow时加载和卸载模块



我正在尝试在对话框中创建一个简单的下拉菜单。以下是真正做到这一点的代码:

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中创建一个空白的桌面项目,然后替换";关于";底部的函数如下:(还包括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;
}

如果我这样做,我会出现前面描述的症状。

再次编辑:我将combobox的createwindow函数放入WndProc的WM_CREATE案例中,一切正常,立即加载。我开始怀疑这是否是在对话框中创建组合框的正确方法。任何以另一种方式(尚未找到使用splitbutton资源的方法(进行此操作的建议也都是受欢迎的。

解决方案很简单。只需输入以下代码:

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

以及加载combobox以使其只运行一次的代码。没有更多的问题。另一种更简单的方法是创建一个组合框资源并使用SendMessage((函数。

最新更新