Re: Make client area of frame view a certain (fixed) size (AdjustWindowRectEx
problem)
Mark Salsbery [MVP] wrote:
[snip older posts]
**********************************************
You need to initialize the rect before passing it to ::AdjustWindowRectEx()
rect.left = 0;
rect.top = 0;
rect.right = 400;
rect.bottom = 400;
**********************************************
BOOL b = ::AdjustWindowRectEx(&rect, WS_CAPTION | WS_BORDER |
WS_MINIMIZEBOX | WS_SYSMENU, 0, TRUE);
cs.cx = 400;
cs.cy = 400;
**********************************************
Then use the adjusted rect values:
cs.cx = rect.right - rect.left;
cs.cy = rect.bottom - rect.top;
Mark
Doh! You're right, I forgot that completely. The raw Win32 code did that
but I totally forgot it here. Anyway, I'm not completely there yet
because the client area of the frame view is only 396 * 396. First it
was 392*392 but I removed the extended style WS_EX_CLIENTEDGE that was
set in the view's PreCreateWindow. So it seems the view's non-client
area still takes up some space (4 pixels on each side to exact). How do
I account for that or remove it? I need this code to be portable, so I
can't just adjust it for my system. Here are both PreCreateWindow():s now:
BOOL DoubleBufferingMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
VERIFY(CFrameWnd::PreCreateWindow(cs));
CRect rect(0, 0, 400, 400);
BOOL b = ::AdjustWindowRectEx(&rect, cs.style, cs.dwExStyle, TRUE);
cs.cx = abs(rect.left) + abs(rect.right);
cs.cy = abs(rect.top) + abs(rect.bottom);
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
BOOL DoubleBufferingChildView::PreCreateWindow(CREATESTRUCT& cs)
{
VERIFY(CWnd::PreCreateWindow(cs));
//cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW),
reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
Thanks for the quick replies btw, this newsgroup is really great! Fast,
quality replies - can't ask for more!
- Eric (WP)