父窗体风格里面加上WS_CLIPCHILDREN然后Invalidate(TRUE)父窗体的时候,子控件就不会刷新了。
如果要刷新的话,用子控件Invalidate来控制刷新。

解决方案 »

  1.   

    能否举个例子,如何调用子控件Invalidate来控制刷新,我现在需要在子控件刷新时能够清除背景,另外父窗体风格里面加上WS_CLIPCHILDREN是在哪改呢?
      

  2.   

    建议做自绘显示picture的控件,在自绘控件类中刷新控件。
      

  3.   

    我已加入WS_CLIPCHILDRENint CThumbnailDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1; // TODO:  Add your specialized creation code here
    lpCreateStruct->style |= WS_CLIPCHILDREN; return 0;
    }子控件Invalidate来控制刷新是这样做吗?
    GetDlgItem(IDC_THUMB_1)->Invalidate();
    这样没有用,都没有立即去刷新了,不知我的做法是否欠妥,请帮忙示范一下
      

  4.   

    不明白你说的自绘显示picture的控件,能代码示范一下吗?
      

  5.   

    GetDlgItem(IDC_THUMB_1)->Invalidate();走消息队列的。。
    RedrawWindow看看
      

  6.   

    你是说这样吗?
    GetDlgItem(IDC_THUMB_1 + 7)->RedrawWindow();
    这跟直接调用Invalidate()效果是一样的,刷新的是整个dialog对话框而不是某一个控件,如果我理解错了,麻烦您说详细点行末?代码示范一下哦
      

  7.   

    这位说的是对的。pic.RedrawWindow();会自动擦除背景的。
    DrawThumbnails();这个代码很隐含,应该问题来自于这个。
      

  8.   

    请问pic.RedrawWindow()中的pic是个什么类型的变量呢?RedrawWindow这个API有四个参数...
      

  9.   

    pic就是CStatic,你的图片控件不就是CStatic吗。你把DrawThumbnails()发出来
      

  10.   

    感谢您的继续围观,DrawThumbnails()这个函数包的层数太多了,光看它看不出怎么画的,要贴里面调用的接口就太多了,装不下。如果直接调用RedrawWindow()会刷新整个对话框界面,也会在画下一个图时清空背景,那么和调用Invalidate()效果一样;如果pic.RedrawWindow()我看到指定的控件好像是闪了一下,说明书有用的,可能我没用好,我再描述下我的需求,DrawThumbnails()这个接口应该是没有问题的。我想在点击一个button时刷新九个picture控件,是不是要指定这九个控件呢?像这样:

    for (int i = 0; i < 9; i++)
    {
    m_staticThumb[i].RedrawWindow();   //m_staticThumb[i]是分别关联九个控件的CStatic
    }
    感觉有点别扭,每次RedrawWindow都会跑到onPaint()中吗?
      

  11.   

    怎么能一次性刷新九个控件呢?九个控件的ID是相连的,有什么API能一次性刷新而不是一个一个来刷新的吗?
      

  12.   

    我相信InvalidateRect可以,因为我用过。
    你的做法可能有点问题。
    必须找到这9个picture控件的 左上 顶点 和 右下 顶点。
    先用GetWindowRect获取picture相对于桌面的位置,然后用ScreenToClient转换为相对于对话框的位置,接着在InvalidateRect这个区域。
      

  13.   

    最近有点忙忘了看贴了,不好意思。
    请问怎么同时确定九个picture控件的 左上 顶点 和 右下 顶点,GetWindowRect也只能确定一个控件位置呀,然后再InvalidateRect,不知道您的意思是像我上面写的循环那样吗?(循环做九次,有点别扭)能用代码示范下吗?感谢继续关注~
      

  14.   

    你9个picture应该是分成几行几列的,选择第一行的第一个,取其left和top,选择最后一行的最后一个,取其right和bottom,然后组合成一个CRect。注意最后转换ScreenToClient
      

  15.   

    这个问题已解。之前这样用手没用的不知为啥:CRect rect;
    GetDlgItem(IDC_THUMB_1)->GetClientRect(&rect);     //IDC_THUMB_1为九个控件中的一个
    InvalidateRect(&rect);这样用才能把背景内容给清理:CRect rect;
    GetDlgItem(IDC_THUMB_1)->GetWindowRect(&rect);
    ScreenToClient(rect);请问GetWindowRect&ScreenToClient==GetClientRect??这两个用法是等价的吗?
    先获得相对于屏幕的坐标再转化为客户区的坐标与直接得到客户区坐标这两种做法不一样吗?求详细解释,千万不要把这两个API翻译一遍额,想知道对于我这个问题的这两种做法的区别,针对性的解释下好吗?
      

  16.   

    第二个code没写完整,补充下,如下代码才真正清除背景内容,达到目地:CRect rect;
    GetDlgItem(IDC_THUMB_1)->GetWindowRect(&rect);
    ScreenToClient(rect);
    InvalidateRect(&rect);还是希望热心人士帮忙解释下上个问题
      

  17.   

    我举个例子。屏幕大小 800*600,窗口大小400*300,窗口位置100,100,按钮相对于对话框位置100,100。
    GetClientRect只是按钮大小。left=0,top=0;
    GetWindowRect后,left=200,top=200,ScreenToClient后,left=100,top=100。
      

  18.   

    所以说像我这种情况只能用GetWindowRect&ScreenToClient是吧?
      

  19.   


    是的。GetClientRect获取的只是 大小。
    GetWindowRect&ScreenToClient获取的肯定有大小,而且还有相对位置。
    GetWindowRect是绝对位置。
      

  20.   

    非常感谢您的指导!那么通常可以这样使用,获取大小可以用GetClientRect,而获取位置用GetWindowRect&ScreenToClient较好...
      

  21.   

    获取位置用GetWindowRect&ScreenToClient较好...这个不能笼统的这么说。这个获取的是相对于 父窗口的位置。
    假设我自绘透明按钮,在OnPaint中,这个时候先要获取相对位置,copy父窗口此部分区域。但是,绘制自己部分,用GetClientRect就行了。理解 “相对” 。