使用双缓冲绘制图形的问题。

maoaq 2019-05-13 06:00:49
现在有一个窗口,窗口上有一个panel1,panel1上又有一个panel2.在panel2上用双缓冲绘制图形。图形很简单,就是一般的长方形。
设置双缓冲的代码如下:
this.SetStyle(ControlStyles.UserPaint, true);//自绘
this.SetStyle(ControlStyles.DoubleBuffer, true);// 双缓冲
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
但是结果是,绘制的图形都没有显示出来。
我注释掉 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 这行代码,就可以显示绘制的图形。
请问这是什么原因?
我之所以要使用双缓冲,是因为在滚动条事件中,重绘了panel2上的图形,要解决闪烁的问题。
这段代码是在一个比较大的工程中写的,出了上述的问题。但是我重新建一个工程,利用上面的代码绘制,是没有问题的。请问
有什么因素可能会导致以上的问题?
非常感谢!
...全文
432 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2019-05-16
  • 打赏
  • 举报
回复
引用 9 楼 maoaq 的回复:
我现在的问题是要在panel上画一个矩形,在拖动滚动条的时候,要让这个矩形始终绘制在可见区域的最右边。我可以通过滚动条的AutoScrollPosition的值来定位。现在的问题是,我必须在scroll事件中调用Invalidate来进行实时的刷新才能实现这个功能。如果不在
scroll事件中调用Invalidate,则在拖动滚动条的情况下,会出现矩形的阴影。请问如何在不调用Invalidate的情况下实现这个功能?在 Gif_WriteElement.cs代码中,也没有相关的代码可以参考,好像它没有与拖动滚动条相关特别的功能。非常感谢!

可能这个例子帮不到你,里面的重绘方式可以参考
用这种方式重绘的

public abstract class DraggableObject
{
public abstract int Id { get; set; }
public abstract int prim_X { get; set; }
public abstract int prim_Y { get; set; }
public abstract Rectangle Region { get; set; } // 大小范围
public abstract bool IsDragging { get; set; } // 能否拖动
public abstract Point DraggingPoint { get; set; } // 组件拖动位置
public abstract int ControlType { get; set; } // 组件类型,1.文本;2.图像;
public abstract bool isContent { get; set; } // 组件内是否有内容
public abstract string Field_Text { get; set; } // 文字
public abstract string Field_TextFont { get; set; } // 字体
public abstract int Field_TextFontSize { get; set; } // 字体大小
public abstract int Field_TextFontStyle { get; set; } // 文字样式
public abstract Color Field_TextColor { get; set; } // 文字颜色
public abstract Bitmap Field_ImgSource { get; set; } // 原始图像
public abstract int Field_ImgZoom { get; set; } // 图像缩放
public abstract bool[] Field_BoxLine { get; set; } // 边框和斜线
public abstract Color Field_LineColor { get; set; } // 边框和斜线颜色
public abstract int Field_LineThickness { get; set; } // 边框和斜线粗细
public abstract DashStyle Field_LineType { get; set; } // 线型
public abstract Bitmap Field_Img { get; set; } // 组件图像
public abstract void OnPaint(PaintEventArgs e); // 重绘
}

public class Draggable : DraggableObject
{
private int m_id;
private int m_primX;
private int m_primY;
private Rectangle m_Region;
private bool m_IsDragging;
private Point m_DraggingPoint;
private int m_ControlType;
private bool m_isContent;
private Bitmap m_FieldImg;
private string m_FieldText;
private string m_FieldTextFont;
private int m_FieldTextFontSize;
private int m_FieldTextFontStyle;
private Color m_FieldTextColor;
private Bitmap m_FieldImgSource;
private int m_FieldImgZoom;
private bool[] m_FieldBoxLine;
private Color m_FieldLineColor;
private int m_FieldLineThickness;
private DashStyle m_FieldLineType;

public Draggable(int startX, int startY, int width, int height, int _controlType)
{
m_Region = new Rectangle(startX, startY, width, height);
m_ControlType = _controlType;
m_isContent = false;
m_FieldBoxLine = new bool[8] { false, false, false, false, false, false, false, false };
m_FieldLineColor = Color.White;
m_FieldLineThickness = 1;
m_FieldLineType = DashStyle.Solid;
}
public override int Id
{
get => m_id;
set => m_id = value;
}
public override int prim_X
{
get => m_primX;
set => m_primX = value;
}
public override int prim_Y
{
get => m_primY;
set => m_primY = value;
}
public override Rectangle Region
{
get => m_Region;
set => m_Region = value;
}
public override bool IsDragging
{
get => m_IsDragging;
set => m_IsDragging = value;
}
public override Point DraggingPoint
{
get => m_DraggingPoint;
set => m_DraggingPoint = value;
}
public override int ControlType
{
get => m_ControlType;
set => m_ControlType = value;
}
public override bool isContent
{
get => m_isContent;
set => m_isContent = value;
}
public override string Field_Text
{
get => m_FieldText;
set => m_FieldText = value;
}
public override string Field_TextFont
{
get => m_FieldTextFont;
set => m_FieldTextFont = value;
}
public override int Field_TextFontSize
{
get => m_FieldTextFontSize;
set => m_FieldTextFontSize = value;
}
public override int Field_TextFontStyle
{
get => m_FieldTextFontStyle;
set => m_FieldTextFontStyle = value;
}
public override Color Field_TextColor
{
get => m_FieldTextColor;
set => m_FieldTextColor = value;
}
public override Bitmap Field_ImgSource
{
get => m_FieldImgSource;
set => m_FieldImgSource = value;
}
public override int Field_ImgZoom
{
get => m_FieldImgZoom;
set => m_FieldImgZoom = value;
}
public override bool[] Field_BoxLine
{
get => m_FieldBoxLine;
set => m_FieldBoxLine = value;
}
public override Color Field_LineColor
{
get => m_FieldLineColor;
set => m_FieldLineColor = value;
}
public override int Field_LineThickness
{
get => m_FieldLineThickness;
set => m_FieldLineThickness = value;
}
public override DashStyle Field_LineType
{
get => m_FieldLineType;
set => m_FieldLineType = value;
}
public override Bitmap Field_Img
{
get => m_FieldImg;
set => m_FieldImg = value;
}
public override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(Field_Img, m_Region);
}
}
public static List<DraggableObject> DraggableObjects = new List<DraggableObject>();
desperaso 2019-05-16
  • 打赏
  • 举报
回复
引用 9 楼 maoaq 的回复:
我现在的问题是要在panel上画一个矩形,在拖动滚动条的时候,要让这个矩形始终绘制在可见区域的最右边。我可以通过滚动条的AutoScrollPosition的值来定位。现在的问题是,我必须在scroll事件中调用Invalidate来进行实时的刷新才能实现这个功能。如果不在
scroll事件中调用Invalidate,则在拖动滚动条的情况下,会出现矩形的阴影。请问如何在不调用Invalidate的情况下实现这个功能?在 Gif_WriteElement.cs代码中,也没有相关的代码可以参考,好像它没有与拖动滚动条相关特别的功能。非常感谢!


打开一个大的gif文件,里面上百帧,在"编辑"、"创建"里面,panel的滚动条。
"创建"带滚动条,且可拖动图像移动位置并自动排列位置,就是panel滚动+bitmap重绘
maoaq 2019-05-16
  • 打赏
  • 举报
回复
我现在的问题是要在panel上画一个矩形,在拖动滚动条的时候,要让这个矩形始终绘制在可见区域的最右边。我可以通过滚动条的AutoScrollPosition的值来定位。现在的问题是,我必须在scroll事件中调用Invalidate来进行实时的刷新才能实现这个功能。如果不在 scroll事件中调用Invalidate,则在拖动滚动条的情况下,会出现矩形的阴影。请问如何在不调用Invalidate的情况下实现这个功能?在 Gif_WriteElement.cs代码中,也没有相关的代码可以参考,好像它没有与拖动滚动条相关特别的功能。非常感谢!
desperaso 2019-05-15
  • 打赏
  • 举报
回复

https://pan.baidu.com/s/1W1nzX4eljE9rzomxrqPJFQ
提取码:bj1w

maoaq 2019-05-15
  • 打赏
  • 举报
回复
引用 6 楼 好奇都是要学的 的回复:
[quote=引用 4 楼 desperaso 的回复:] 参考http://bbs.cskin.net/thread-14927-1-1.html 里面的 Gif_WriteElement.cs
注册了 下载不了 可以给一份吗?[/quote] 我也是这样,注册了,但是不能下载。
  • 打赏
  • 举报
回复
引用 4 楼 desperaso 的回复:
参考http://bbs.cskin.net/thread-14927-1-1.html 里面的 Gif_WriteElement.cs
注册了 下载不了 可以给一份吗?
maoaq 2019-05-15
  • 打赏
  • 举报
回复
引用 4 楼 desperaso 的回复:
参考http://bbs.cskin.net/thread-14927-1-1.html 里面的 Gif_WriteElement.cs
这个代码下不下来,请问你有吗?
desperaso 2019-05-14
  • 打赏
  • 举报
回复
参考http://bbs.cskin.net/thread-14927-1-1.html
里面的 Gif_WriteElement.cs
maoaq 2019-05-14
  • 打赏
  • 举报
回复
我准备换个思路,如何使得拉动滚动条时,画面不刷新,保证画面的内容不变化?谢谢!
maoaq 2019-05-13
  • 打赏
  • 举报
回复
我是按照网上那样做的,但是为什么显示不了图形呢?
北京.NET 2019-05-13
  • 打赏
  • 举报
回复
http://www.cnblogs.com/1175429393wljblog/p/5684090.html

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧