【发布时间】:2015-12-01 06:28:24
【问题描述】:
我创建了允许通过 DialogBoxIndirectParam 动态创建对话框的库。并提供来自 DlgProc 和控件的任何消息。 现在我的任务是通过这个库展示很多控件,所以它们应该放在任何可滚动的区域。
我从 InitCommonControlsEx 提供的标准控件和控件中搜索了简单的决策,但没有找到。
我通过 CreateWindow 和 RegisterClass 创建带有可滚动区域的测试应用程序。效果很好。
然后我尝试在我的库中重复创建这样的窗口。
我在 WM_INITDIALOG 中调用 RegisterClass 和 CreateWindow,但 CreateWindow 返回 NULL,GetLastError 返回 0。
更新:添加寄存器类的代码
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC) DlgProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = GetModuleHandle(NULL);
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "XMYSCROLL";
wcex.hIconSm = NULL;
if (! RegisterClassEx(&wcex) ){
// message box with error
}
【问题讨论】:
-
你为什么在
WM_INITDIALOG中打电话给RegisterClass()?对话结束时您是否取消注册课程?听起来您正在尝试多次注册同一个课程。除此之外,我们还需要查看代码。 -
你说得对,RegisterClass 我应该放在 LoadLibrary 中并在 UnLoad 中取消注册。但它没有帮助。
-
Casting
DlgProctoWNDPROCis wrong. 为你的窗口类写一个窗口过程;不要使用对话过程。更改DlgProc的函数签名也不起作用,因为对话框过程和窗口过程的工作方式完全不同,特别是因为窗口过程不会接收诸如WM_INITDIALOG之类的消息并且返回返回不同;您需要通过并将所有对话 gunk 更改为 window gunk。如果您对外部对话框使用相同的DlgProc,则必须拆分它们。