2014-09-07 3 views
1

Я пишу код управления окном в C. Когда определенные флаги установлены, я хочу иметь максимально развернутое окно, которое нельзя изменить, перетащив окно по строке заголовка. Есть ли способ «заблокировать» максимизированное окно в его максимизированном состоянии?Предотвращение выхода из режима максимального окна

ответ

2

Попробуйте этот

case WM_SYSCOMMAND: 
    if(IsMaximized(hwnd) && ((wParam & 0xFFF0) == SC_RESTORE || (wParam & 0xFFF0) == SC_MOVE)){ 
     return 0; 
    } 

    break; 

Редактировать

Полный код

switch(message){ //handle the messages 
    ... 
    ... 
    case WM_SYSCOMMAND: 
     ... 
     break; 
    .... 
    default: //for messages that we don't deal with 
     return DefWindowProc(hwnd, message, wParam, lParam); 
} 

return DefWindowProc(hwnd, message, wParam, lParam); 

Это значение по умолчанию WindowProcedure. Я думал, что это было известно.

Вальтера

+0

Это почти сработало, я сделал небольшую корректировку. Я проверяю SC_MOVE вместо SC_RESTORE следующим образом: 'if (((wParam & 0xFFF0) == SC_MOVE) && (style & WS_MAXIMIZE)) return 0;'. Также важно вернуть DefWindowProc, когда он не возвращает нуль, иначе все остальные syscommands будут проигнорированы. Спасибо за ваш ответ! –

+0

@JobTalle Вот почему у нас есть оператор * break *. См. Править –

2

ответ Valter показывает, как перехватить действия пользователя и отменить изменения состояния окна на этом этапе. Это, однако, не будет обрабатывать изменения состояния, выполненные с использованием Win API напрямую (например, ShowWindow).

API Windows предлагает еще один вариант, который обеспечивает более точное управление изменениями состояния/положения окна. Он также более гибкий: например, он позволяет применять ограничения, определенные приложением, в позиции окна. Опция WM_WINDOWPOSCHANGING сообщение и ее обработчик. Окно получает указатель на структуру, которую он может изменить, чтобы настроить желаемое состояние и положение. Таким образом, принудительное максимизированное состояние обрабатывает более широкий диапазон сценариев.

Пока это сообщение обрабатывается, изменение любого из значений в WINDOWPOS влияет на новый размер окна, положение или место в порядке Z. Приложение может предотвратить изменения в окне, установив или очистив соответствующие биты в члене флагов WINDOWPOS.

Вы также можете прочитать об этом сообщении в блоге Raymond Chen: Use WM_WINDOWPOSCHANGING to intercept window state changes.

Есть также несколько вопросов здесь, на SO, а также, это выглядит близко к вашим и ответ также предоставляет фрагмент кода, а также: Detect window restore operation is about to begin

Смежные вопросы