Изменение стиля окна со стандартного на отсутствие заголовка и обратно - PullRequest
0 голосов
/ 20 июня 2019

Я пишу приложение (c ++, win32), в котором я хочу создать главное окно как а) стандартное или б) без строки заголовка, но изменяемого размера / подвижного, и я хочу переключаться между двумя стилями при запуске время.

Я использую следующий код для создания окна:

bool   bare        = false ;
DWORD  style_bare  = WS_POPUP  | WS_SIZEBOX | WS_THICKFRAME ;
DWORD  style_std   = WS_OVERLAPPEDWINDOW     ;
DWORD  win_style   = bare ? style_bare : style_std ;
DWORD  win_exstyle = WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE | WS_EX_APPWINDOW;
...
HWND main = CreateWindowEx( win_exstyle ,  className , applName ,  win_style,  x, y, cx, cy, NULL, NULL, hInstance, NULL);

и позже, в MainWndProc (), чтобы изменить стиль

bare = ! bare ;
if ( bare ) 
    SetWindowLongPtr( hwnd , GWL_STYLE,   style_bare ) ;
else 
    SetWindowLongPtr( hwnd , GWL_STYLE,   style_std  ) ;
InvalidateRect( hwnd, NULL , TRUE ) ;

и, находясь в «голом» режиме, я обрабатываю сообщение WM_NCHITEST, которое делает подвижное пустое окно следующим образом:

   if ( bare && WM_NCHITTEST == message )
   {
        LRESULT rc = DefWindowProc( hwnd, message, wParam, lParam ) ;
        if ( HTCLIENT  == rc ) return HTCAPTION  ;
        return rc ;
  }

Код работает нормально, когда я создаю окно в любом режиме, но когда я переключаю режим, окно рисуется, как и ожидалось, но не «выбирается» ... Когда я нажимаю на него, он перемещается за все окна, которые могут быть там, и когда я закрываю все окна, чтобы найти свое приложение и нажимаю на него, выбираются значки с рабочего стола.

Чего мне не хватает ...

1 Ответ

1 голос
/ 20 июня 2019

Не забудьте вызвать SetWindowPos при использовании SetWindowLongPtr для изменения рамки окна.Ваш SetWindowLongPtr устанавливает значение рамки окна с указанным смещением в дополнительной памяти окна.И информация об изменении кадра кэшируется.SetWindowPos сделает его эффективным.

bare = !bare;
if (bare)
    SetWindowLongPtr(hwnd, GWL_STYLE, style_bare);
else
    SetWindowLongPtr(hwnd, GWL_STYLE, style_std);
SetWindowPos(hwnd,0,0,0,0,0, SWP_FRAMECHANGED| SWP_NOMOVE| SWP_NOOWNERZORDER| SWP_NOSIZE| SWP_NOZORDER| SWP_SHOWWINDOW);
InvalidateRect(hWnd, NULL, TRUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...