Рисование непрерывного прямоугольника - PullRequest
0 голосов
/ 19 марта 2010

В настоящее время я работаю над Visual C ++ 2008 Express Edition. В моем проекте у меня есть поле для изображений, которое содержит изображение, теперь я должен нарисовать прямоугольник, чтобы пользователь мог выбрать часть изображения .. Я использовал событие «MouseDown» в картинке и приведенный ниже код для рисования прямоугольника:

Void pictureBox1_MouseDown(System::Object^ sender, Windows::Forms::MouseEventArgs^  e)   
                 {  
             Graphics^ g = pictureBox1->CreateGraphics();  
             Pen^ pen = gcnew Pen(Color::Blue);  
             g->DrawRectangle( pen , e->X ,e->Y,width,ht);           
         }

теперь в «DrawRectangle» аргументы «width» и «ht» являются статическими, поэтому приведенный выше код приводит к рисованию прямоугольника в точке, где пользователь нажимает кнопку мыши на изображении в picturebox ... я хочу позволить пользователю иметь возможность перетаскивать курсор и рисовать прямоугольник размера, который он желает .. Пожалуйста, помогите мне в этом .. Спасибо ..

1 Ответ

0 голосов
/ 19 марта 2010

Вы не должны рисовать прямо в своем окне в ваших обработчиках событий - все рисование должно быть в вашем обработчике событий Paint.

Вы можете сделать гораздо больше, чтобы она работала хорошо, но ядро ​​техники, которая вам нужна, это:

Чтобы переместить прямоугольник, когда пользователь перетаскивает мышь, вы должны обрабатывать события перемещения мыши. Каждый раз, когда вы получаете один, вам нужно Invalidate (), чтобы вызвать перерисовку вашего окна. В вашем обработчике Paint, если кнопка мыши нажата, найдите указатель мыши и нарисуйте прямоугольник в этом месте.

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

Есть и другие способы улучшить это, в том числе:

  • Только делает недействительными те части формы, которые вам нужны (откуда нужно стереть старый прямоугольник и где нужно нарисовать новый прямоугольник)

  • После Invalidate () немедленно вызовите Update (), чтобы перерисовка произошла как можно скорее

  • рендеринг с "двойной буферизацией" и / или сохранение содержимого окна в закадровом растровом изображении, чтобы можно было повторно визуализировать фон с прямоугольником сверху быстрее и без мерцания. (Но это довольно продвинутая техника).

...