Winapi: удаление украшения

Это похоже на дубликат, но сначала услышь меня. Это больше на стороне отладки. Я пытаюсь удалить границы моего окна, используя метод здесь.

Что может заставить эти функции не работать? Скрытие окон с помощью ShowWindow(Handle, SW_HIDE) тоже не работает Я создал свой собственный класс Window со многими функциями, поэтому я не хочу вставлять сюда весь свой код.

Вот моя функция инициализации для окна:

HRESULT SampleWindow::InitializeSimple(SampleWindow* win)
{
    HRESULT         hr;
    HWND            hWnd;
    SampleWindow*   sampleWin;

    sampleWin = new SampleWindow();

    aMWindowProps->Center();
    hWnd = CreateWindowEx(
        NULL,
        aMWindowProps->aWindowClass,
        aMWindowProps->aWindowTitle,
        WS_OVERLAPPEDWINDOW,
        aMWindowProps->aRealLeft,
        aMWindowProps->aRealTop,
        aMWindowProps->GetRelativePosWidth(),
        aMWindowProps->GetRelativePosHeight(),
        HWND_DESKTOP,
        NULL,
        *aMWindowProps->aHInstance,
        sampleWin);

    aMWindowProps->aHwnd = &hWnd;

    hr = hWnd ? S_OK : E_FAIL;

    win->aHwnd = &hWnd;
    //ShowWindow(hWnd, SW_SHOWNORMAL);

    return hr;
}

WindowProps как видите, содержит различную информацию о создаваемом окне. у меня тоже есть HWND переменная указателя в моем классе, которая указывает на обработчик окна.

Вот некоторые вещи, которые я пробовал на своем main, где sw2 - указатель на мой класс окна:

    ShowWindow(*sw2->aHwnd, SW_SHOW);
    //ShowWindow(*sw2->aHwnd, nCmdShow);
    LONG lStyle = GetWindowLong(*sw2->aHwnd, GWL_STYLE);
    lStyle &= WS_POPUP;
    //lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
    SetWindowLong(*sw2->aHwnd, GWL_STYLE, lStyle);
    //ShowWindow(*sw2->aHwnd, SW_MINIMIZE);
    //ShowWindow(*sw2->aHwnd, SW_HIDE);
    //ShowWindow(*sw2->aHwnd, SW_HIDE);
    //SetWindowLong(*sw2->aHwnd, GWL_STYLE, GetWindowLong(*sw2->aHwnd, GWL_STYLE) && ~ WS_BORDER && ~ WS_SIZEBOX && ~ WS_DLGFRAME);
    SetWindowPos(*sw2->aHwnd, HWND_TOP, sw2->aMWindowProps->aRealLeft, sw2->aMWindowProps->aRealTop, sw2->aMWindowProps->aRealWidth, sw2->aMWindowProps->aRealHeight, SWP_FRAMECHANGED);
    //LONG lExStyle = GetWindowLong(*sw2->aHwnd, GWL_EXSTYLE);
    //lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
    //SetWindowLong(*sw2->aHwnd, GWL_EXSTYLE, lExStyle);
    //SetWindowPos(*sw2->aHwnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);

Я просто хотел бы дать несколько советов о том, где отладить мой код. Я знаю, что функции работают, так как я тестировал их в гораздо более простом оконном проекте (пример проекта от Microsoft).

1 ответ

Решение

Как уже отметил Джонатан Поттер в своем комментарии, ваша ошибка:

aMWindowProps->aHwnd = &hWnd;

hr = hWnd ? S_OK : E_FAIL;

win->aHwnd = &hWnd;

где HWND hWnd действителен только в рамках текущего метода. Я предполагаю, что вы определили aHwnd в вашем классе как что-то вроде:

HWND * aHwnd;

что по крайней мере не нужно. Вы, кажется, ошибаетесь, что HANDLE (HWND - ничто иное) как своего рода экземпляр / объект. Это не так, это больше похоже на указатель или ссылку. Вы всегда можете смело писать:

HWND myAttribute=hWnd;

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

На самом деле я не знаю ситуации, когда вы держите указатель на дескриптор вместо самого дескриптора.

Заметьте, я явно писал об дескрипторах, поскольку HWND - это своего рода стандартные оконные дескрипторы.

Другие вопросы по тегам