把A窗口SetForegroundWindow后,怎么判断A窗口完成重绘

解决方案 »

  1.   

    一般来说,showmodel就够了。
    实在需要的话在SetForegroundWindow前加入以下语句。RedrawWindow(0,nil,0,RDW_ERASE   or   RDW_INVALIDATE   or   RDW_ALLCHILDREN);   
      

  2.   

    说明:
    RedrawWindow 导致更新特定的矩形或者给定窗口的区域。不同的操作允许你控制更新过程。BOOL RedrawWindow(
        HWND hWnd, // handle of window
        CONST RECT *lprcUpdate, // address of structure with update rectangle
        HRGN hrgnUpdate, // handle of update region
        UINT flags  // array of redraw flags
       );
     
    参数:
    HWND: 指定窗口的句柄。如果这个参数是NULL,则更新桌面窗口。lprcUpdate: 到RECT结构的指针。这个矩形包含要更新的客户区的坐标。这个参数可以是NULL。如果这个参数和hrgnUpdate都是NULL,则假设为整个客户区。hrgnUpdate: 指定要更新的区域句柄。如果这个参数不是NULL,则将忽略lprcUpdate。如果这个参数和lprcUpdate都是NULL,则假设为整个客户区。flags: 指定定义如何影响窗口,如何进行重绘和影响哪一个窗口的不同标志。对于flags的值参数如下:无效标志RDW_ERASE 受到影响的窗口将在重新绘制的时候收到WM_ERASEBKGND消息。也必须指定RDW_INVALIDATE标志。
    RDW_FRAME 导致和更新区域相交的非客户区部分收到WM_NCPAINT消息。也必须指定RDW_INVALIDATE标志。
    RDW_INTERNALPAINT 强迫向受到影响的窗口发送WM_PAINT消息,而无论是否存在无效的区域。
    RDW_INVALIDATE 导致将hrgnUpdate 或者lprcUpdate所定义的区域标志为无效。如果两个参数者是NULL,则整个客户区是无效的。有效标志RDW_NOERASE 导致忽略任何挂的WM_ERASEBKGND消息。
    RDW_NOFRAME 导致忽略任何挂的WM_NCPAINT消息。也必须指定RDW_VALIDATE消息。
    RDW_NOINTERNALPAINT 导致忽略任何挂的WM_PAINT消息。如果产生的更新区域不是NULL,则仍然将发出WM_PAINT。
    RDW_VALIDATE 导致hrgnUpdate 或者lprcUpdate所定义的区域标志为有效。任何挂起的内部WM_PAINT消息仍然将发送给窗口。重新绘制标志RDW_ERASENOW 导致完成任何挂起的WM_NCPAINT和WM_ERASEBKGND消息。
    RDW_UPDATENOW 导致在从这个函数返回之前,完成任何挂起的WM_NCPAINT,WM_ERASEBKGND和WM_PAINT消息。子窗口控制标志RDW_ALLCHILDREN 导致影响所有子窗口。
    RDW_NOCHILDREN 导致不影响所有子窗口。返回值 如果成功,则返回非0,否则返回0。
      

  3.   

    判断进行 SetForegroundWindow 操作后,OnPaint 事件是否执行过即可吧。
      

  4.   

    先设置visible
    再SetForegroundWindow