Resizing Controls at Runtime

Introduction

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 using 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 in the image above). First thing 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 two events that are needed to be taken care of: 

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.

OnLButtonDown 

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) ;