Как создать заполнитель окна в редакторе диалогов - PullRequest
0 голосов
/ 13 июля 2020

Прошу прощения, если я что-то упускаю, но я пытаюсь просто создать окно-заполнитель в диалоговом окне ATL, которое будет использоваться для размещения обработчика предварительного просмотра. Я подумал, что можно было бы разместить настраиваемый элемент управления, так как он пуст и займет определенное место, но это приводит к тому, что диалоговое окно взламывает sh, и у меня возникает ощущение, что делать что-то с настраиваемым элементом управления сложнее, чем я ищу. Так есть ли способ просто поместить фиктивное окно в диалоговое окно для использования в качестве хост-сайта? Спасибо за любой ввод.

Обновление: похоже, я достиг желаемого результата, используя простой элемент управления пустым изображением. Но мне все еще интересно, есть ли более официальный способ сделать это.

1 Ответ

0 голосов
/ 14 июля 2020

для заполнителя нам нужно использовать именно настраиваемый элемент управления. Дело в том, что нужно указать имя класса окна. и этот класс должен быть зарегистрирован.

пусть имя класса будет MyClass

поэтому в .r c файле должно быть

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(); перед созданием любого диалога с этим настраиваемым элементом управления

...