Desenhando um retângulo contínuo
-
21-09-2019 - |
Pergunta
Atualmente, estou trabalhando no Visual C ++ 2008 Express Edition. No meu projeto, tenho uma caixa de imagem que contém uma imagem, agora tenho que desenhar um retângulo para intensificar o usuário para selecionar uma parte da imagem. Eu usei o "Mousedown" Evento da PictureBox e o código abaixo para desenhar um retângulo:
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);
}
Agora, na "largura dos argumentos" e "ht" "Drawrectangle", o código acima resulta no desenho de um retângulo no ponto em que o usuário pressiona o botão do mouse na imagem no PictureBox ... eu quero Permita que o usuário possa arrastar o cursor e desenhar um retângulo de tamanho que ele deseja .. por favor me ajude nisso .. Thanx ..
Solução
Você não deve desenhar diretamente para a sua janela em seus manipuladores de eventos - todo o desenho deve estar no manipulador de eventos de pintura.
Há muito mais que você pode fazer para fazê -lo funcionar bem, mas o núcleo da técnica que você precisa é:
Para mover um retângulo à medida que o usuário arrasta o mouse, você deve lidar com eventos movidos pelo mouse. Cada vez que você recebe um, você precisa invalidar () para causar uma redefinição da sua janela. No manipulador de tinta, se o botão do mouse estiver inativo, obtenha a posição do ponteiro do mouse e desenhe o retângulo naquele local.
Isso irá iniciar, mas terá alguns problemas - a janela piscará à medida que constantemente redesenha, e pode ser um pouco lento.
Há outras coisas que você pode fazer para melhorar isso, incluindo:
Apenas invalide as partes do formulário que você precisa (de onde o retângulo antigo precisa ser apagado e onde o novo retângulo precisa ser desenhado)
Após o invalidato (), ligue para a atualização () imediatamente para fazer com que o redesenho aconteça o mais rápido possível
Renderização "dupla buffer" e/ou armazenar o conteúdo da janela em um bitmap fora da tela para que você possa renderizar o plano de fundo com o retângulo em cima mais rapidamente e sem piscar. (Mas isso é uma técnica bastante avançada).