如何在对话框编辑器中创建窗口占位符
Posted
技术标签:
【中文标题】如何在对话框编辑器中创建窗口占位符【英文标题】:How to create a window placeholder in the dialog editor 【发布时间】:2020-11-03 02:21:09 【问题描述】:如果我忽略了某些内容,我深表歉意,但我只是想在 ATL 对话框中创建一个占位符窗口,该对话框将用于托管预览处理程序。我认为放置一个自定义控件可能是要做的事情,因为它是空白的并且会占据一个指定的位置,但这会导致对话框崩溃,我觉得用自定义控件做某事比我想象的要复杂为了。那么有没有办法在对话框中放置一个虚拟窗口以用作主机站点?感谢您的任何意见。
更新:我似乎已经使用一个简单的空白图片控件达到了预期的效果。但我仍然想知道是否有更官方的方式来做到这一点。
【问题讨论】:
我一般使用组控件(这实际上只是标准按钮类的一种样式)。 【参考方案1】:对于占位符,我们需要使用完全自定义的控件。重点 - 需要指定窗口类名。并且这个类必须注册。
类的名称将是 MyClass
所以在.rc文件中必须是
CONTROL "Custom1",IDC_CUSTOM1,"MyClass",...
我们需要注册“MyClass”,最少的代码
class MyWndCls
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
switch (uMsg)
case WM_NCDESTROY:
delete this;
break;
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
static LRESULT CALLBACK _WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return reinterpret_cast<MyWndCls*>(GetWindowLongPtrW(hwnd, GWLP_USERDATA))->WindowProc(hwnd, uMsg, wParam, lParam);
static LRESULT CALLBACK StartWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (uMsg == WM_NCCREATE)
if (MyWndCls* p = new MyWndCls)
SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR)p);
SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONG_PTR)_WindowProc);
return p->WindowProc(hwnd, uMsg, wParam, lParam);
return 0;
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
inline static const WCHAR clsname[] = L"MyClass";
public:
static ULONG Register()
WNDCLASS wndcls =
0, StartWindowProc, 0, 0, (HINSTANCE)&__ImageBase, 0,
LoadCursorW(0, IDC_HAND), (HBRUSH)(COLOR_INFOBK + 1), 0, clsname
;
return RegisterClassW(&wndcls) ? NOERROR : GetLastError();
static ULONG Unregister()
return UnregisterClassW(clsname, (HINSTANCE)&__ImageBase) ? NOERROR : GetLastError();
;
当然,在使用此自定义控件创建任何对话框之前,我们需要调用 MyWndCls::Register();
【讨论】:
以上是关于如何在对话框编辑器中创建窗口占位符的主要内容,如果未能解决你的问题,请参考以下文章