Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Назначить клиентскую область


Автор: Zmeevic 29.12.2007, 19:46
Вот такой вопрос: можно ли назначить ClientRect POPUP окну?
прубую что-то мудрить с WM_NCCALCSIZE, пока  smile 

Автор: Mihhail 29.12.2007, 20:18
Можно сделать следующим образом: в главном окне создать дочернее окно-панельку, которое меньше родительского на величину заголовка и бордюра, оно и будет клиентской областью.

Автор: Zmeevic 29.12.2007, 21:19
Пробовал я этот вариат... но хотелось ближе к стандарту... smile 
т.е. что-то где-то отловить, подменить и выплюнуть через DefWindowProc(); smile 

Автор: Earnest 6.1.2008, 10:54
Цитата(Zmeevic @  29.12.2007,  20:46 Найти цитируемый пост)
Вот такой вопрос: можно ли назначить ClientRect POPUP окну?
прубую что-то мудрить с WM_NCCALCSIZE, пока    

Можно, и именно так и нужно. lParam есть адрес структуры NCCALCSIZE_PARAMS, туда (в rgrc) и нужно записать новые координаты клиентской области (уменьшив на сколько надо исходные). И все дела. 

Автор: Denis_Vik 8.1.2008, 11:10
Здравствуйте.

Не моглибы вы привести здесь небольшой пример использования сообщения wm_nccalcsize.
А то не понятен смысл использования трех структур rect и структуры windowpos в структуре nccalcsize_param.

Привидите пожалуста, если можно, пример изменения клиентской области окна, уменьшив ее на 10 пикс. со всех сторон.

Автор: Earnest 8.1.2008, 21:48
Пример есть только для MFС, примерно так:
Код

void CMyView::OnNcCalcSize (BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) 
{
    CRect* pr=(CRect*)lpncsp->rgrc;
    pr->DeflateRect (10, 10);
}

Здесь bCalcValidRects - это wParam, а lpncsp - lParam.
Согласно MSDN, lParam может содержать не только NCCALCSIZE_PARAMS*, и зависит это от wParam, но в коде, откуда я взяла кусок, это не проверяется, но тем не менее все работает. Возможно, в каких-то конкретных случаях надо проверять.

Да, нужно иметь в виду, что это сообщение посылается в процессе создания окна. Т.е. если окно создается не под твоим контролем, то в свой обработчик ты можешь и не попасть. Чтобы перустановить клиентскую область после создания окна, нужно вызвать SetWindowPos с флагом SWP_FRAMECHANGED - тогда NCCALCSIZE опять придет.

Автор: Zmeevic 10.1.2008, 04:38
to Earnest, спасибо, если б мог, поднял бы репутацию, а пока еще раз СПАСИБО!!!

Автор: dizzy1984 10.1.2008, 12:56
Ты поднял Earnest репутацию.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)