- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 OnPaint 方法中绘图时,我一直偏离 1 个像素。我不明白为什么。
不过,我不确定是不是我算不上!
我已经回到绘图板,在 1 个面板中使用 1 个标签,因为我确定我正确地计算了这些,我有大量的跟踪,并且我一次一个地检查语句,绝对检查一切。
我确实发现了一些与此无关的错误,因此显然值得为此做。
我发现以下代码确实向 ClientRectangle 写入单个像素边框:-
System::Drawing::Rectangle rectangle = this->ClientRectangle;
rectangle.Inflate(-1,-1);
e->Graphics->DrawRectangle(blackPen, rectangle);
到目前为止还不错,但为什么是 -1?
无论如何,当我单步执行代码时,我的困惑加深了。
除了这 1 个像素的边框外,我用以下内容填充了矩形的全部内容(通过反复试验和颜色编码找到了 2 个!):-
System::Drawing::Pen^ violetPen = gcnew System::Drawing::Pen( Brushes::Violet );
for(int y=2; y< e->ClipRectangle.Bottom-1; y++)
{
e->Graphics->DrawLine( violetPen, e->ClipRectangle.Left+2, y,
this->ClientRectangle.Right-2, y);
}
因此,ClientRectangle 是可写区域,但对它的索引从 (1,1) 开始。
现在这是一个没有边框的面板,根据 MSDN a ClientRectangle如下:-
控件的客户区是控件的边界,减去滚动条、边框、标题栏和菜单等非客户元素。由于客户坐标是相对于控件客户区的左上角,因此该属性返回的矩形的左上角坐标为(0,0)。您可以使用此属性获取控件客户区的大小和坐标,以执行在控件表面上绘制等任务。
现在我的控件没有滚动条、边框、标题栏和菜单,所以我认为索引应该从 (0,0) 开始,这是我一直在计数的地方。
和一个Panel
Panel 控件默认无边框显示。
有人可以帮我理解我在这里缺少什么吗?
最佳答案
嗯,您确定问题点实际上是左上角,而不是右下角吗?
RECT
structure Windows 控件内部使用的是独占,这意味着坐标为(右,下) 的像素紧靠在矩形之外。
如您所示,将对应于客户区的矩形缩小 1 个像素可解决此问题。
关于.net - 一个像素输出 - OnPaint - System::Drawing::Rectangle rectangle = this->ClientRectangle;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5280838/
我想知道在windows窗体程序中覆盖OnPaint时应该什么时候调用base.OnPaint? 我正在做的是: private void Form1_Paint(object sender, P
我有一个包含用户控件的 Windows 窗体。此用户控件具有以下代码: protected override void OnPaint(PaintEventArgs pe) { base.OnPa
我有一个包含用户控件的 Windows 窗体。此用户控件具有以下代码: protected override void OnPaint(PaintEventArgs pe) { base.OnPa
我正在尝试使用 FillPath 覆盖我自己的自定义控件中标签的 OnPaint 方法。 这是我的控件代码: public partial class GlassLabel : Label {
如果我重写 OnPaint 并在控件上绘制一个正方形,当我在设计器中预览它时,如何让 e.graphics.draw... 显示出来? 最佳答案 http://msdn.microsoft.com/e
我正在创建一个带有自定义边框的表单。我想使用 onPaint 重写来绘制自己的边框。不幸的是,当我只使用下面的代码时,我得到了图像的踪迹。 有人知道怎么解决吗?是的,我已将 DoubleBuffere
我在对话框中有一个图片控制框(CStatic)。当用户按下对话框中的按钮时,我需要 onPaint() 在其中绘制图像。问题是,图像是在对话框加载时绘制的。如何防止这种情况并仅在按下按钮时调用它。 我
我对 CFrameWnd 的 OnPaint 方法有问题,我似乎无法弄清楚发生了什么。 OnPaint 大约每 10 毫秒调用一次,这会导致计算机死机。检查 CPU 使用率,此应用占用 50%! 该应
我有一个 CWind 类的 child ,我在其中订阅 OnPaint 事件: BEGIN_MESSAGE_MAP(MyListBox, CWnd) ON_WM_PAINT() END_MES
我有一个 CWind 类的 child ,我在其中订阅 OnPaint 事件: BEGIN_MESSAGE_MAP(MyListBox, CWnd) ON_WM_PAINT() END_MES
我们有一个通常在 Windows XP 下运行的 .NET 2.0 软件(在 Windows“经典”模式下配置,没有附加功能)。现在,我在 Windows 7 上运行它的全部功能。我在 Windows
我正在尝试使命令模式适应具有撤消功能的简单绘图应用程序。我一直坚持使用 OnPaint 撤消操作事件。这是代码: [已解决] 帖子末尾的详细信息 interface ICommand { vo
大家好,我在编写自定义控件时遇到了问题。我的控件继承自 Windows.Forms.Control,我试图重写 OnPaint 方法。这个问题有点奇怪,因为只有当我在我的表单中包含一个控件时它才有效,
我有一个自定义绘画的用户控件。据我所知,构造函数正确设置样式。基本代码: public partial class LineChart2 : UserControl { public Line
我有以下自定义 Control: public class Line : Control { protected override void OnPaint(PaintEventArgs e)
我有一个 UserControl(WinForms,.net 2.0),我有这个: protected override void OnPaint(PaintEventArgs e) { ba
我正在尝试使用 winforms 和 gdi+ 实现一些动画,但我在控件中发现了很多撕裂的移动 Sprite 。 在托管 .net 中有没有办法让重写的 Control.OnPaint 方法等待监视器
在 WinForm 应用程序中,当订阅 OnPaint() 事件时,PaintEventArgs 提供一个 ClipRectangle 属性定义要绘制的区域。 当表单垂直或水平调整大小时,它会给出要绘
我有以下wx.Window: class SketchWindow(wx.Window): def __init__(self, parent): wx.Window.__init__(s
我有一个用 C++ 和 MFC 编写的基于对话框的应用程序。该对话框有一个 CStatic 图片控件。我在 PictureCtrl 的 OnPaint() 函数中绘制 BITMAP。相关代码如下: v
我是一名优秀的程序员,十分优秀!