Как я могу удалить произвольную границу HWND (WinAPI)? - PullRequest
0 голосов
/ 21 января 2020

Короче говоря, я создаю диспетчер плиточного окна в стиле i3, и мне нужно переопределить chrome произвольного windows, чтобы принудительно удалить границы, заголовок и связанные кнопки.

Перепробовав практически каждую логическую комбинацию стилей WS_STYLE и WS_EX, связанных с хромированием, я ничего не получаю для большинства приложений. Это нормально с простыми встроенными программами (терминалы работают как положено), но для подавляющего большинства других приложений возникает та же проблема:

Border issue

Выше результат присутствует в большинстве случаев. Есть окружающая граница того же размера, но с различным поведением для приложения. Насколько я могу судить, это «прозрачная» (очевидно, не в этом случае) граница, используемая для тестирования при перетаскивании мышью (хотя с стилем, отключенным в стилировании, этого не должно быть). Кажется, что кадровый буфер не очищается в этой области (т. Е. Если размер окна изменяется в себя, граница заполняется предыдущими пикселями в этом месте).

Это быстрый проект выходного дня - моя работа не имеет отношения к программированию WinAPI, так что для меня это все ново, но если я правильно понял, тогда эта граница фактически не относится к клиентской области? Другими словами, неклиентарея должна быть обнулена, чтобы клиентская область занимала весь прямоугольник окна. Я пытался справиться с этим, подклассифицируя все цели windows с помощью GWL_WNDPRO C и обнуляя WM_NCCALCSIZE, но я получаю тот же результат.

Как я могу вызвать произвольное окно (которое я не делаю ' создать себя) чтобы полностью удалить всю не клиентскую область?

1 Ответ

0 голосов
/ 21 января 2020

Я использую следующую функцию для удаления / восстановления границ окна:

void WndSetFrame(HWND hWnd, int bSmall)
{
    static int wwStyle=0;       // remember initial style
    int ww= GetWindowLong(hWnd, GWL_STYLE);

    if (bSmall) {
        wwStyle= ww;
        ww &= ~(WS_OVERLAPPED|WS_CAPTION|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SIZEBOX|WS_SYSMENU);
        ww |=  (WS_POPUP /*|WS_DLGFRAME*/);
        if (ww==wwStyle) return;
        SetWindowLong(hWnd, GWL_STYLE, ww);
    }
    else {
        if (!wwStyle || ww==wwStyle) return;
        SetWindowLong(hWnd, GWL_STYLE, wwStyle);
    }
    SetWindowPos (hWnd,0,0,0,0,0,SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);

}
...