변환을 사용하여 마우스 커서에서 이미지 확대/축소
이 시나리오에서는 비트맵 원점을 마우스 위치로 변환한 다음 이미지 크기를 조정하고 원점을 변환하기 위해 Paint 이벤트의 변환을 사용하는 마우스 위치 뒤로.
문제:
플랫폼:
관련 코드 블록:
private void trackBar1_Scroll(object sender, EventArgs e) { // Get rotation angle ang = trackBar1.Value; pnl1.Invalidate(); } private void pnl1_MouseWheel(object sender, MouseEventArgs e) { // Get mouse location mouse = e.location; // Get new scale (zoom) factor zoom = (float)(e.Delta > 0 ? zoom * 1.05 : zoom / 1.05); pnl1.Invalidate(); } private void pnl1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; pan = true; mouX = e.X; mouY = e.Y; oldX = imgX; oldY = imgY; } private void pnl1_MouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left || !pan) return; // Coordinates of panned image imgX = oldX + e.X - mouX; imgY = oldY + e.Y - mouY; pnl1.Invalidate(); } private void pnl1_MouseUp(object sender, MouseEventArgs e) { pan = false; } private void pnl1_Paint(object sender, PaintEventArgs e) { // Apply rotation angle @ center of bitmap e.Graphics.TranslateTransform(img.Width / 2, img.Height / 2); e.Graphics.RotateTransform(ang); e.Graphics.TranslateTransform(-img.Width / 2, -img.Height / 2); // Apply scaling factor - focused @ mouse location e.Graphics.TranslateTransform(mouse.X, mouse.Y, MatrixOrder.Append); e.Graphics.ScaleTransform(zoom, zoom, MatrixOrder.Append); e.Graphics.TranslateTransform(-mouse.X, -mouse.Y, MatrixOrder.Append); // Apply drag (pan) location e.Graphics.TranslateTransform(imgX, imgY, MatrixOrder.Append); // Draw "bmp" @ location e.Graphics.DrawImage(img, 0, 0); }
가능한 해결 방법:
이 문제를 해결하려면 마우스 위치에서 부드럽게 확대/축소하려면 다음 제안 사항을 고려하세요. 트릭:
1. 분할 및 정복: 다양한 그래픽 효과와 변형을 특정 작업을 수행하는 별도의 전문 방법으로 분류합니다. 그런 다음 필요할 때 원활하게 함께 작동할 수 있도록 이러한 방법을 설계하세요.
2. 단순하게 유지하세요: 여러 그래픽 변환을 적용할 때 행렬이 쌓이는 순서로 인해 혼란과 예상치 못한 결과가 발생할 수 있습니다. 특정 변환(주로 변환 및 크기 조정)을 미리 계산하고 GDI가 사전 처리된 개체 및 모양의 렌더링을 처리하도록 하는 것이 더 간단합니다.
3. 올바른 도구 사용: 이와 같은 시나리오에서는 패널을 "캔버스"로 사용하는 것이 권장되지 않습니다. 활성화할 수는 있지만 이중 버퍼링이 부족합니다. 그러나 PictureBox(또는 비시스템 플랫 라벨)는 기본적으로 이중 버퍼링을 제공하며 하위 컨트롤을 포함하기보다는 그리기용으로 설계되었습니다.
4. 확대/축소 모드 구현: 마우스 위치에서 맹목적으로 크기를 조정하는 대신 확대/축소 동작을 제어할 수 있는 다양한 방법을 제공합니다. ImageLocation, CenterCanvas, CenterMouse 및 MouseOffset과 같은 확대/축소 모드를 구현하여 유연성을 제공하고 다양한 사용 사례를 충족합니다.
이 지침을 따르고 맞춤형 확대/축소 모드를 구현하면 마우스 위치에서 부드럽고 효과적인 확대/축소를 달성할 수 있습니다. 원하는 이미지 위치와 배율을 유지합니다.
위 내용은 C# 변환을 사용하여 마우스 커서로 확대/축소할 때 이미지가 점프하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!