【问题标题】:Force screen redraw after drawing to screen's DC C++绘制到屏幕的 DC C++ 后强制屏幕重绘
【发布时间】:2010-10-11 21:33:28
【问题描述】:

我正在创建一个 Windows Mobile 自定义 SIP,当用户按下或“悬停”在键盘上的一个按钮上时,我使用 ::GetDC(NULL) 将其对应的选定图像(iPhone 式)绘制到屏幕的 DC。它是用 Win32 C++ 开发的。

我的问题是我永远无法让屏幕重新绘制自己,擦除之前绘制的键。我已经尝试了所有我能想到的强制它,::RedrawWindow() 使用 NULL 或任何 Get..Window 函数作为 HWND 的所有不同参数组合,以及所有标志组合 (INVALIDATE | UPDATENOW | ERASENOW | 所有儿童等)。我还尝试过使用 ::GetActiveWindow 和 ::GetForegroundWindow 使 rect 无效并强制重新绘制底层应用程序,使用 ::GetDesktopWindow 的变体等。我基本上已经没有想法了,这是阻止我的最后一件事在我的 Windows Mobile 设备上使用它。有没有人有任何想法?任何帮助将不胜感激。

我提供了一些截图来说明我的困境。

Before Screenshot
After Screenshot

Before http://img13.imageshack.us/img13/9861/cezoom1.pngAfter http://img3.imageshack.us/img3/7481/cezoom2.png

提前致谢!

【问题讨论】:

    标签: c++ screen gdi draw repaint


    【解决方案1】:

    与其绘制到背景 DC,不如创建一个临时窗口并在其中绘制?当您销毁窗口时,背景应该会自动重新绘制。

    我只是猜测,因为我不了解 Windows Mobile,但可能是 Windows 正在缓存最后一个被绘制到 DC 中的内容,并在每次使窗口无效时重新绘制它。

    【讨论】:

    • 这是一个有趣的方法,我会试一试,谢谢。我不相信 DC 正在缓存,因为问题仅在按钮被绘制到我的 sip 面板(上方)之外时才会出现。即使面板内的按钮也被绘制到屏幕上,我也没有这个问题。
    • 当我说面板内的按钮时,我指的是蓝色选定的弹出按钮。 (所有其他按钮都绘制到位图,然后 blt 到我的 sip 面板的 DC 而不是屏幕)
    【解决方案2】:

    你在屏幕 hWnd 上尝试过 InvalidateRect 吗?

    【讨论】:

    • 按屏幕 hWnd 我假设您的意思是 ::GetDesktopWindow(),对吗?如果这就是你的意思,那么是的,我已经尝试了所有对屏幕 wnd 的常用调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多