3
votes

Currently I'm repositioning dialog controls when the dialog is resized like this:

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
ScreenToClient(listRect);

// Get the dialog Rect.
CRect dialogRect;
GetWindowRect(&dialogRect);
ScreenToClient(dialogRect);

list->MoveWindow(listRect.left, listRect.top,
                 dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);

This works great in Windows XP, but when I tried in Windows Vista the positioning was off. I think this must be down to larger dialog borders and captions in Windows Vista dialogs, and the fact that GetWindowRect has the following entry in the documentation:

The dimensions are given in screen coordinates relative to the upper-left corner of the display screen. The dimensions of the caption, border, and scroll bars, if present, are included.

So my question is, how do I reposition dialog controls when resizing a dialog so that they are consistent between operating systems? Thanks

1

1 Answers

2
votes

You should use GetClientRect instead of GetWindowRect followed by ScreenToClient -- the former returns the extents of the client part of the window (i.e. without borders), whereas the latter retrieves the extents of the whole window including non-client parts (albeit in client coordinates).

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
dlg->ScreenToClient(&listRect);

// Get the dialog Rect.
CRect dialogRect;
dlg->GetClientRect(&dialogRect);

list->MoveWindow(listRect.left, listRect.top, dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);