如何在对话框编辑器中创建窗口占位符

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

【讨论】:

以上是关于如何在对话框编辑器中创建窗口占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何给占位符在yii2 gridview中创建的下拉框

在占位符字段中创建空间

在输入 javascript 时在占位符中创建单词

使用钩子在 Reactjs 中创建一个动态占位符

如何在 Summernote 中插入占位符元素?

如何修复 select2 的占位符在文档准备好时被截断?