c# - 绘制矩形覆盖现有位图 c#
问题描述
我有一个已经绘制到图片框的网格,我希望在单击鼠标的单元格中绘制一个矩形。我试图通过在单元格的左上角绘制一个矩形并让它填充整个细胞。然而,当我点击网格消失。我怎样才能让它保持网格?
有没有明显更好的方法来做到这一点?
重新绘制网格的唯一方法是再次按下按钮,但我希望它留在那里。谢谢。
解决方案
在 mouse_click 事件中的每次鼠标单击时,首先您会处理图片框的图像,然后再次将位图分配给图片框图像,否则如果您单击网格太多次,您可能会遇到内存不足异常
private void InitializePictureBoxImage(PictureBox pictureBox)
{
if(pictureBox.Image != null)
{
var image = pictureBox.Image; // cache it to dispose
pictureBox.Image = null; // don't dispose an used object
image.Dispose(); // and dispose of it
}
Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
pictureBox.Image = bitmap; // assign bitmap to image
}
然后在单击表单中的“生成网格”按钮时调用用于绘制图片框的 mouse_click 事件中的方法。然后使用 mouse_click 事件中的图形为您按下的网格着色,并从 MouseEventArgs 获取 XY 坐标。
总而言之,我认为它会是这样的
private void Mouse_ClickEvent(object sender, MouseEventArgs e)
{
InitializePictureBoxImage(pictureBox);
DrawThePictureBoxImage(pictureBox);
using (Graphics graphics = Graphics.FromImage(pictureBox.Image))
{
Color color = Color.Blue;
color = Color.FromArgb(150, color.R, color.G, color.B); // lower the opacity so the writing in the grid is visible
var brush = new SolidBrush(color);
// Calculate the starting X-Y coordinate and Width,Height of the grid to color
graphics.FillRectangle(brush, startX, startY,
width, height);
}
推荐阅读
- python - 如何展平具有以下内容的列表:原始数据类型、列表和生成器?
- metaprogramming - 你如何从它们所属的类型之外访问私有方法或属性?
- html - 如何将标签或段落准确地放在/绑定项目顶部?
- javascript - Javascript if/else 不工作。奥丁项目的石头剪刀布
- performance - 如何检查 Z3 优化问题的进度
- c++ - C ++函数'WINBOOL GetProcessIoCounters(HANDLE,PIO_COUNTERS)'的参数太少
- html - 谷歌表给销售人员
- python - 在主轴上的 vbar_stacked 图和次轴上的线图的图中,主要 y_range 不会更新
- apache-spark - 在java中使用withColumn在地图中查找字段值将列添加到数据框
- r - 更新两个 checkboxGroupInput