Question:
I'm beginning the design of an application where it would be advantageous to be able to programmatically move the position of a control on its form. Is it possible to do this using Visual C++?
Answer:
Yes, all control classes (ie CEdit, CListBox, CStatic, etc) in
Visual C++ are derived from CWnd, the base class containing
all the fundamental functionality of a Window. Please keep in
mind that neither CWnd nor any of its decendents are
Window Controls but are merely C++ classes that strongly
wrap Window API functions that permit communication with
Window Controls such as sending a message to control to
reposition itself. Hence having said that, to reposition a
control on a window using Visual C++ with MFC, you could
call either CWnd:: MoveWindow or CWnd:: SetWindowPos
depending your needs.
MoveWindow allows you to change the position and
dimensions of a specified Window Control, and
SetWindowPos allows you to change the position,
dimensions and Z-order of a child, popup and top level
windows. Z-order is the order of window on a stack of
windows that reside on the Z axis which is an imaginary line
that sticks straight out from the screen.
For example if you want to move a button control on a
CFormView derived class 26 screen units (pixels) down the Y
axis from its current position you could do the following:
1. void CMyFormView::OnInitialUpdate()
2. {
3. CFormView::OnInitialUpdate();
4.
5. // Retrieve a pointer to the button control.
6. CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1);
7. ASSERT(pBtn);
8. // Structure used to store the button control's dimensions.
9. RECT rect;
10. // Get button control's dimensions with respect to the screen.
11. pBtn->GetWindowRect(&rect);
12. // Convert the button control's dimensions with respect to its
parent window.
13. ScreenToClient(&rect);
14. // Adjust button control's dimensions +26 pixels down the Y axis.
15. rect.top +=26;
16. rect.bottom +=26;
17.
18. // Move the button control 26 pixels down the Y axis.
19. pBtn->MoveWindow(&rect);
20. }