大家知道,如果用API函数直接画屏幕,当刷新速度快时闪烁现象是很严重的
我用了一个CreateCompatibleDC,创建一个与屏幕某区域兼容的设备场景
然后在这个兼容DC中画图,最后用Bitblt拷贝到屏幕区域
要求重画的时候我想用InvalidateRect,但是这个函数的第一个参数是一个hwnd
应该用我创建的这个DC对应的hwnd,在C下可以用GetSafehwnd这个API函数获得
可是VB下没有这个函数,哪位高人知道该怎么解决这个问题?
我的最终目的是要解决屏幕重画时的闪烁问题。

解决方案 »

  1.   

    Private Declare Function GetDesktopWindow Lib "USER32" () As LonghWndScreen = GetDesktopWindow()
      

  2.   

    即 hdc=CreateCompatibleDC(GetDC(0))
      

  3.   

    用GetDesktopWindow即可求出代表整个屏幕的一个窗口(桌面窗口)句柄另外,需要提醒你的是:
    InvalidateRect只是设置要刷新的区域,你还需要调用 UpdateWindow(UpdateWindow是强制发送WM_PAINT消息,刷新窗口。如果不强制发送,就只有等系统发送该消息了)
      

  4.   

    楼上的哥哥,我就是想让系统来发送这个消息啊,为了避免强制发送消息和系统抢资源
    我的刷新区域就只是usercontrol,我创建的DC就是usercontrol的兼容DC,我想得到这个DC的hwnd,有法子吗?
    难道只能用刷新整个屏幕的办法了吗?能不能只刷新用户控件这一块区域?最好
      

  5.   

    如果你是在PICTURE中画图就是PICTURE1.refresh就可以刷新了
      

  6.   

    WindowFromDC 取回与某一设备场景相关的窗口的句柄
    VB声明 
    Declare Function WindowFromDC Lib "user32" Alias "WindowFromDC" (ByVal hdc As Long) As Long 
    说明 
    取回与某一设备场景相关的窗口的句柄 
    返回值 
    Long,执行成功为设备场景对应的窗口的句柄,失败为0 
    参数表 
    参数 类型及说明 
    hdc Long,设备场景句柄 
      

  7.   

    根据hdc取得hwnd,用WindowFromDC就可以