Разрешить пользователю рисовать прямоугольник перетаскивания в приложении CStatic C ++ MFC

У меня есть приложение MFC, где у меня есть Picture Control в диалоговом окне. В конце концов я хочу позволить пользователю рисовать прямоугольник с изменяемым размером с помощью перетаскивания мышью в элементе управления изображением над загруженным изображением.

Я определил свой собственный класс управления изображениями как подкласс CStatic и работаю с событиями мыши, мыши, вверх и перемещения мыши, но я не могу понять, как разрешить пользователю рисовать прямоугольник. Любое руководство по этому вопросу будет оценено.

Большинство примеров, на которые я смотрел, показывают, как нарисовать прямоугольник в CView: CWnd, но я пока не слишком знаком с MFC, поэтому я немного растерялся. Благодарю.

1

Решение

Обычная техника рисования прямоугольника перетаскивания поверх содержимого окна иллюстрируется здесь:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd145184(v=vs.85).aspx

Это кодирование Win32 API вместо кодирования MFC, но различия минимальны. Основная идея заключается в том, чтобы рисовать с помощью SetROP2 (hdc, R2_NOTXORPEN); Вы инвертируете существующие пиксели, а затем снова рисуете тот же прямоугольник, чтобы снова инвертировать эти пиксели в исходное изображение.

1

Другие решения

Когда пользователь нажимает кнопку мыши, вам нужно записать координаты мыши, чтобы вы знали, где начинается прямоугольник. Вы должны также установить некоторый тип флага, чтобы указать, что пользователь перетаскивает мышь. Когда пользователь перемещает мышь, найдите текущую позицию мыши и используйте DrawDragRect или аналогичная функция для рисования прямоугольника. Когда пользователь отпускает кнопку мыши, снимите ранее упомянутый «флаг», и вы закончили с этой частью процесса.

Вам также нужно будет обрабатывать другие события, такие как потерявший фокус элемент управления и / или родительское окно, чтобы можно было отменить операцию перетаскивания. Поскольку вы не включили ни одного кода в свой вопрос, трудно сказать, что еще вам нужно будет сделать, но это основы.

1

По вопросам рекламы [email protected]