【问题标题】:g.Draw blinking a lotg.Draw 经常闪烁
【发布时间】:2019-09-23 16:35:42
【问题描述】:

我在定时器中使用这个功能:

IntPtr Handle = FindWindow(null, "Notepad");

if (radioButton1.Checked)
{
    using (Graphics g = Graphics.FromHwnd(Handle))
    {
        Pen PN = new Pen(pictureBox2.BackColor, (Convert.ToInt32(numericUpDown2.Value)));
        g.DrawLine(PN, 961, 520, 961, 560);
        g.DrawLine(PN, 985, 540, 935, 540);
        g.Dispose();
    }
}

但即使我将计时器间隔设置为 1,平局也会闪烁很多

【问题讨论】:

  • 即使我将计时器间隔设置为 1 嗯?意思是 即使我尽可能频繁地运行它 ??? (间隔以毫秒为单位!)
  • @TaW Yeh.. 有什么解决办法吗?
  • 对于较慢的闪烁率,请将 Interval 设置为较大的值。 1000 是一秒。 - 也不要处理在 using 子句中创建的内容!
  • @TaW 更慢的间隔实际上更糟糕它甚至没有正确绘制它
  • 不确定您的方法是否有效。 See here

标签: c# winforms


【解决方案1】:

您的代码只会获取主窗口的句柄。

大多数应用程序都有覆盖该客户区域的其他控件。

您需要获取记事本文本区域的句柄,而不是在客户端区域上绘图。

你可以测试一下

  • 测试句柄值。如果是0,你只有桌面。这可能是您所看到的。

  • 如果您使用自己的表单对其进行测试,当且仅当绘图区域未被其他控件覆盖时,它才会显示您的十字。

列举获得正确标题的过程也是一个好主意。这是我在另一篇文章中找到的示例:

public static IntPtr WinGetHandle(string wName)
{
    IntPtr hWnd = IntPtr.Zero;
    foreach (Process pList in Process.GetProcesses())
    {
        if (pList.MainWindowTitle.Contains(wName))
        {
            hWnd = pList.MainWindowHandle;
        }
        Console.WriteLine(pList.MainWindowTitle);
    }
    return hWnd;
}

需要更多的试错代码才能找到应用程序表面的合适子句柄..

【讨论】:

  • 仍然无法弄清楚如何修复闪烁的绘图,当我使用“for (;;)”时效果会更好,但如果我使用它,我就无法再返回表单了
  • 您的目标是获得什么价格?另外:您是否声称您的代码实际上是在记事本上绘制的? (测试:移动记事本;它还会在同一个地方得到十字架吗??)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多