MFC: определение размера закрепленной панели инструментов с помощью CControlBar :: OnNcCalcSize получает неправильные значения

реализуя редактор в MFC, я застрял с проблемой, которая кажется невероятной & неразрешимой! (по крайней мере для меня) Это очень просто: запускается редактор и появляется пользовательская панель инструментов, полученная из CControlBar, прикрепленная к правому краю редактора. Я максимизирую редактор, но панель инструментов остается того же размера, вместо того, чтобы растягивать ее высоту, чтобы соответствовать размеру редактора.

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

Упомянутый обработчик — CHlavniOkno :: CPropertyGridBar :: OnNcCalcSize. Если бы кто-то мог взглянуть, это было бы очень полезно, потому что я до сих пор провел все выходные, играя с ним, пытаясь заставить его работать так, как ожидалось. (И как со всеми такими ошибками, это будет что-то ужасно глупое, что я только что пропустил !!)

Вот некоторые комментарии соответствующего кода (полный исходный код доступен на http://nestorovic.hyperlink.cz/cpp_mfc.zip (на данный момент это всего лишь несколько строк! — с использованием VS2010 Express + устаревшая комбинация MFC4.2)

// main frame constructor
CHlavniOkno::CHlavniOkno(){
// - creating the main window
Create( NULL,
"The Hello Application",
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
rectDefault,
NULL,
MAKEINTRESOURCE(IDM_MAIN)
);
m_bAutoMenuEnable=FALSE;
EnableDocking( CBRS_ALIGN_ANY );
// - creating the Tabbed Document Interface (serving as the main view)
RECT r;
GetClientRect(&r);
tdi.Create( AFX_WS_DEFAULT_VIEW & ~WS_BORDER,
r,
this,
AFX_IDW_PANE_FIRST
);
// - creating the CControlBar-derived toolbar, initially docked to the right
propertyGridBar=new CPropertyGridBar;
DockControlBar( propertyGridBar, AFX_IDW_DOCKBAR_RIGHT );
propertyGridBar->ShowWindow(SW_SHOW);
ShowControlBar( propertyGridBar, TRUE, FALSE );
}

// the toolbar constructor
CHlavniOkno::CPropertyGridBar::CPropertyGridBar()
: rozmery(200,500) { // initial dimensions
Create( AfxRegisterWndClass(0),
NULL,
WS_CHILD | WS_VISIBLE ,
CRect(0,0,220,220),
AfxGetMainWnd(),
IDW_PROPERTYGRIDBAR // = AFX_IDW_CONTROLBAR_FIRST+32
);
SetBarStyle( GetBarStyle() | CBRS_SIZE_DYNAMIC | CBRS_GRIPPER );
EnableDocking( CBRS_ORIENT_VERT ); // = CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT
}

// fixed dimensions calculation under different situations
CSize CHlavniOkno::CPropertyGridBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz){
// - if floating, return the current dimensions
if(IsFloating())
return rozmery;
// - if docked, calculate the dimensions
CRect r;
m_pDockBar->GetWindowRect(r);   // <-- this always gets DELAYED values (see description in the main text)
return CSize(   rozmery.cx,
bStretch ? 0x7fff : r.Height()+2*::GetSystemMetrics(SM_CYBORDER)
);
}

// calculation of dimensions when dragging the toolbar's border
CSize CHlavniOkno::CPropertyGridBar::CalcDynamicLayout(int nLength, DWORD nMode){
static bool dimenzovaniY;   // carrying out vertical sizing
// - if docked, rearrange main window and return new fixed dimensions
if (nMode & (LM_HORZDOCK | LM_VERTDOCK)){
SetWindowPos(NULL, 0,0, 0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED );
m_pDockSite->RecalcLayout();
return CControlBar::CalcDynamicLayout(nLength,nMode);
}
// - if dragging cancelled, return to original dimensions
if (nMode & LM_MRUWIDTH)
return rozmery;
// - if dragging ended with dropping, commit current dimensions
if (nMode & LM_COMMIT){
if (dimenzovaniY){
RECT r;
GetWindowRect(&r);
POINT c;
::GetCursorPos(&c);
if (m_pDockContext->m_nHitTest==HTTOP){
const int VYSKA_OKRAJE=::GetSystemMetrics(SM_CYBORDER);
m_pDockContext->m_rectFrameDragHorz.top = c.y-VYSKA_OKRAJE;
rozmery.cy = r.bottom-c.y-::GetSystemMetrics(SM_CYSMCAPTION)-VYSKA_OKRAJE;
}else
rozmery.cy = c.y-r.top;
}else
rozmery.cx=nLength;
return rozmery;
}
// - currently carrying out dragging - allow whatever dimensions
if (dimenzovaniY = nMode & LM_LENGTHY)
return CSize( rozmery.cx, nLength );
else
return CSize( nLength, rozmery.cy );
}

afx_msg void CHlavniOkno::CPropertyGridBar::OnNcCalcSize(BOOL bCalcValidRects,NCCALCSIZE_PARAMS *pncsp){
// determining the position & size of CControlBar's client area
// - as the Gripper is painted into the client area, the content (hPropGrid) is moved downwards for the Gripper to be visible
if (IsFloating())
::MoveWindow( hPropGrid, 0,0, rozmery.cx,rozmery.cy, TRUE );
else
// <-- below always received DELAYED values in "pncsp" variable (see description in the main text)
::MoveWindow( hPropGrid, 0,GRIPPER_TLOUSTKA, rozmery.cx,pncsp->rgrc[0].bottom-pncsp->rgrc[0].top-GRIPPER_TLOUSTKA, TRUE );
}

Заранее спасибо за ответ.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector