Resizing Controls at Runtime



With a couple of lines of code, you can give your end-users the ability to resize any control.

Suppose you wanted to give the user the ability to modify the size and position on a certain control?
This example shows how to implement resizing controls on a dialog box as it is done when drawing controls on a dialog template
or visual basic at design time.

In order to accomplish this we can use the class CRectTracker to manage all the drawing and
resizing of a rectangular frame which also has (optional) 6 resize handlers (as shown in the image above).
The first thing, you’ll need to do is to invoke a CRectTracker and specify given coordinates:


LPRECT rect = new RECT;
CWnd* wnd = (CWnd*)(GetDlgItem(IDC_EDIT1));
wnd->GetWindowRect(rect) ;
ScreenToClient(rect) ;
m_tracker = new CRectTracker(rect, CRectTracker::dottedLine |
CRectTracker::resizeOutside |
CRectTracker::hatchedBorder);
m_tracker->Draw(pDC) ;

There are only two events that are needed to be handled:

  • SetCursor
  • if (pWnd == this && m_tracker->SetCursor(this, nHitTest))
     return TRUE;
    

    This is done in order to draw the correct mouse cursors when floating the mouse pointer over the rectangle.

  • LButtonDown
  • m_tracker->Track(this, point, TRUE);
    Invalidate(FALSE);
    CDC* pDC = GetDC();
    m_tracker->Draw(pDC);
    

    This will take care of the drawing of the rectangle with resizing it.

    Once you finished all you have to do is draw the control with the new rectangle coordinates:

    LPRECT rect = new RECT;
    CWnd* wnd = (CWnd*)(GetDlgItem(IDC_EDIT1));
    rect = LPRECT(m_tracker->m_rect);
    wnd->MoveWindow(rect,TRUE) ;
    

Downloads

Download demo project – 9 Kb

More by Author

Must Read