鼠标分层绘图问题-在已有的bmp图像上绘图
====================================
namespace WindowsApplication1
{
public partial class Form1 : Form
{
private string ChoFiNam;
Image Img = null;
private Size originalSize = new Size(0, 0);
Rectangle curRect;
double curZoom;
private bool IfMove;
private bool firstMove = true;
private Point StartPoint;
private Point EndPoint;
private Point MovingPoint;
public Form1()
{
InitializeComponent();
}
private void panel2_MouseDown(object sender, MouseEventArgs e)
{
IfMove = true;
StartPoint = new Point(e.X, e.Y);
}
private void panel2_MouseMove(object sender, MouseEventArgs e)
{
if (IfMove && e.Button == MouseButtons.Left)
{
if (firstMove)
{
firstMove = false;
EndPoint = new Point(e.X, e.Y);
Brush b = Brushes.Blue;
Pen p = new Pen(b);
DrawRect(p, StartPoint, EndPoint);
}
else
{
//通过利用新的颜色(背景色)重新绘制擦去先前已经画好的线
Color c = panel2.BackColor;
Pen p = new Pen(c);
DrawRect(p, StartPoint, EndPoint);
//画新的线
MovingPoint = new Point(e.X, e.Y);
Brush b = Brushes.Blue;
p = new Pen(b);
DrawRect(p, StartPoint, MovingPoint);
EndPoint = MovingPoint;
}
}
}
private void panel2_MouseUp(object sender, MouseEventArgs e)
{
//通过利用新的颜色(背景色)重新绘制擦去先前已经画好的线
Color c = panel2.BackColor;
//Brush b = Brushes.Blue;
Pen p = new Pen(c);
DrawRect(p, StartPoint, EndPoint);
}
private void DrawRect(Pen p, Point startPoint, Point endPoint)
{
Graphics g = panel2.CreateGraphics();
int Dwidth = Math.Abs((endPoint.X) - (startPoint.X));
int DHeight = Math.Abs((endPoint.Y) - (startPoint.Y));
//g.DrawLine(p, startPoint, endPoint);
g.DrawRectangle(p, startPoint.X, startPoint.Y, Dwidth, DHeight);
}
private void segButton2_Click(object sender, EventArgs e) // 选择要编辑的图像
{
if (opFiDg2.ShowDialog() == DialogResult.OK)
{
ChoFiNam = opFiDg2.FileName;
curZoom = 1.0; // 初始值;
try
{
Img = Image.FromFile(ChoFiNam);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
panel2.AutoScrollMinSize = new Size
((int)(Img.Width),
(int)(Img.Height));
curRect = new Rectangle(0, 0, Img.Width, Img.Height);
panel2.Invalidate();
// Save origianl size of the imageOrWth, OrHit;
originalSize.Width = Img.Width;
originalSize.Height = Img.Height;
}
}
private void panel2_Paint(object sender, PaintEventArgs e)// 绘制bmp图像
{
Graphics g = e.Graphics;
if (Img != null)
{
g.DrawImage(Img, new Rectangle
(panel2.AutoScrollPosition.X,
panel2.AutoScrollPosition.Y,
(int)(curRect.Width * curZoom),
(int)(curRect.Height * curZoom)));
}
}
}
}
相关推荐
mfc鼠标点击绘图并保存图像
在mfc窗口中绘图画线,刷新后也不会消失,保存图像文件到本地,限定鼠标样式及移动范围,实时提示坐标位置,修改窗口背景色,没有标题栏也能通过鼠标按住移动窗口;代码精练,功能齐全,注释详细
WinForms绘图程序开发:从双缓冲到图层管理的完整实践
在桌面应用开发中,绘制交互功能常因画布刷新机制不当而出现闪烁、卡顿等问题。理解双缓冲和位图画布模型是构建流畅绘图体验的基础,它能有效消除界面重绘开销。进一步地,通过图层数据结构与快照式撤销栈,可实现复杂编辑操作而不必逆运算,使得橡皮擦、实时预览等交互自然实现。合理的图形对象生命周期管理(如GDI资源释放)与局部无效区域刷新策略,能显著提升性能。本文面向需要实现绘图、图像编辑或白板等功能的开发者,以WinForms为实践环境,系统梳理从画布建模、图层集成到保存导出的完整技术路径,帮助构建稳定高效的绘图程序。
用MFC打造高效截图工具:GDI绘图与热键实战解析
在Windows桌面应用开发中,图形编程与屏幕捕获是绕不开的基础能力。MFC作为经典的C++框架,依托GDI提供了强大的位图操作与绘制接口,配合全局热键和消息映射,能够实现功能完整的系统级截图工具。屏幕像素捕获的原理本质上是BitBlt内存拷贝,而选区交互、标注绘制和剪贴板输出则涉及坐标转换、双缓冲与状态机设计等关键技巧。这类工具型软件广泛应用于产品演示、技术支持与文档制作等场景,是理解Windows底层图形机制的极佳实践。本文从GDI绘图与窗口消息入手,完整拆解了全屏截取、热键注册、选区拖拽、标注合成及静
C++与Qt实现绘图系统:从底层算法到图形界面开发实践
计算机图形学是研究如何在计算机中生成、处理和显示图形的技术领域,其核心在于将数学描述的图形转换为屏幕上的像素。底层绘图算法,如布雷森汉姆直线算法和中点圆算法,通过高效的整数运算替代浮点计算,实现了图形从公式到像素的精确、快速转换,这是图形库和渲染引擎的基石。掌握这些原理对于深入理解图形渲染管线、进行性能优化以及开发图形密集型应用(如CAD、游戏、数据可视化)具有重要价值。本文通过一个具体的绘图系统项目,详细剖析了如何利用C++的高效控制与Qt的GUI框架,从零实现包括直线、圆形、多边形填充在内的核心绘图功能
Qt+C++图形交互开发包:支持2D绘图编辑、裁剪算法实现与OpenGL六面体3D渲染
这个C++ Qt项目提供一套可直接运行的图形绘制与交互系统,能画直线、圆、椭圆、多边形并支持填充;所有图形都可被选中高亮、拖拽平移、绕自身中心旋转(带手柄操作)、等比缩放。内置梁友栋-Barsky直线裁剪和单边多边形裁剪算法,支持对单个图形或整个画布执行裁剪。绘制结果可导出为BMP图像。3D部分用OpenGL实现六面体渲染,通过键盘左右键控制视角旋转。界面功能完整:颜色选择器、图层聚焦切换、画布缩放(非鼠标中心缩放)、图形增删与清空。代码按图形类型拆分为独立类(Point/Line/Circle/Ellip


