15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Изменение размера элемента управления во время выполнения приложения.


Автор: Amit Nabarro.


Всего парой строк коды Вы можете дать возможность конечному пользователю изменять размеры разлиных элементов управления.

Предположим, Вы испытываете необходимость дать возможность пользователю самостоятельно изменять размер и положение определённого элемента управления? Этот пример показывает, как включить в диалоговое окно такой контрол, как это сделано в редакторе форм Вашего компилятора. В этом нам поможет класс CRectTracker, который будет управлять прорисовкой и изменением размера прямоугольного фрейма. Перво наперво Вам потребуется вызвать CRectTracker и указать нужные координаты:

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

Нужно обработать всего два события:

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

    Это сделано, чтобы прорисовывать правильный курсор мышки, при движении указателя мышки по прямоугольнику.

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

    Этот обработчик будет заботится о получении координат прорисовке прямоугольника во время изменения его размеров.

    В заключении цикла надо нарисовать элемент управления с новыми координатами:

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

Downloads

Скачать демонстрационный проект - 9 Kb