【问题标题】:Can I draw shapes in a StringGrid cell without calling OnDrawCell?我可以在不调用 OnDrawCell 的情况下在 StringGrid 单元格中绘制形状吗?
【发布时间】:2012-02-21 11:55:24
【问题描述】:

我知道如何在 StringGrid.OnDrawCell 事件期间绘制形状(通过调用 TCanvas 对象的方法)。但是,当我这样做时,我的 UI 会不断闪烁并随着绘制事件的反复触发而消耗内存。

导致闪烁的线条表示“如果 [给定单元格的条件 1=true] 然后 [在单元格中画一个红色圆圈]”。 (如果需要,我可以发布实际代码。)

那么,自定义方法是否可以做同样的事情——如果语句解析为真,则告诉网格在单元格中画一个圆圈?

【问题讨论】:

  • OnDrawCell is 是您在其中执行此操作的自定义方法。您是否将 DoubleBuffered 设置为 true?能贴出你的绘图代码吗? (我一直在 StringGrids 和 DBGrids 中使用自定义绘图,这不是问题。)另外,您使用的是什么 Delphi 版本?
  • 你知道吗?我想这就是我所需要的……闪烁似乎停止了!我不知道 DoubleBuffered 属性。 (我认为阅读bcbcaq.freeservers.com/project_SG.html 对我有好处)。 ...请将您的回复作为回复发布,以便我可以接受它作为回答我的问题。谢谢! p.s.这是 2006 年的德尔福。

标签: delphi


【解决方案1】:

实际的绘制行为并不是导致闪烁的原因。当窗口反复刷新时会发生闪烁。这通常意味着您没有正确管理窗口,例如,如果您在绘图条件发生变化时调用Refresh() 而不是Invalidate()。将DoubleBuffer 属性设置为true 就像在上面贴了创可贴。它隐藏了问题,但并没有真正解决根本问题。

【讨论】:

  • +1 我认为你应该先找到根本原因,然后再用创可贴来掩盖它。
  • @Remy -- 好点;谢谢你,雷米......显然,我需要了解更多有关此的信息。现在我没有调用 Refresh、Repaint 或其他任何东西。该程序只是多次调用我的 OnDrawCell 方法。事实上,我希望能够控制何时调用该方法,并且仅在我想要的时候触发事件。 ...这可行吗? (我显然对这个话题一无所知。如果你有推荐的网络链接,我很乐意阅读和学习。)...谢谢,一如既往!
  • 每当 Windows 向网格发送 WM_PAINT 消息以将其绘制到屏幕上时,都会触发 OnDrawCell 事件。你不能控制它,操作系统可以。有很多方法可以触发WM_PAINT 消息 - 在代码中刷新窗口、在网格上拖动其他窗口、最小化/最大化网格的父窗口等。当您的绘图标准更改值时,您如何向网格发出信号所以它可以用新值重新绘制自己?你能显示你的实际代码吗?
  • @Remy--程序是游戏; StringGrid 是板。 OnDrawCell 事件中的代码显示 if game.IsMySquare(aCol,aRow) 然后以一种方式绘制单元格,否则如果 game.IsYourSquare(aCol,aRow) 然后以另一种方式绘制单元格,否则如果 game.IsInMyHand(aCol,aRow)然后以第三种方式绘制单元格 ... 除了 OnDrawCell 之外,唯一的其他网格事件处理程序是 OnSelectCell。在轮到 player2 之后(当程序接收到由 ClientWinSocket 对象接收到的字符串命令时)以及另一个组件的 OnClick 事件之后,网格也会重绘。
  • IsMySquare()IsYourSquare()IsInMyHand() 如何确定他们的标准?当这个标准发生变化时你会怎么做? OnSelectCellOnClick 处理程序实际上是做什么的?您的ClientWinSocket 将接收到的数据存储在哪里?你是如何“在玩家 2 轮到后重新绘制网格”的?同样,请更新您的原始问题以显示您的实际代码。如果您需要帮助找出您的绘图错误,这一点很重要。
【解决方案2】:

如果您还没有,请将 DoubleBuffered 设置为 true。这会导致所有绘图都在离屏位图上完成,然后立即绘制整个位图。它通常会消除闪烁。

就绘制单元格的自定义方法而言,OnDrawCell 自定义方法。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多