你看的是什么破书。乱说一气
BeginPaint() EndPaint()
GetDC() ReleaseDC()
是得到/释放设备描述表的句柄
GetDC 是得到整个客户区的HDC而其对应的释放设备描述表句柄的函数是ReleaseDC()
GetDC 你可以用在“任何”时候而
BeginPaint() 一般用于消息WM_PAINT并且它得到一个区域(需要被重画的区域)
用BeginPaint()得到HDC一般要用EndPaint()来释放。
你要使一个区域无效你可以用:
InvalidateRect(HWND,RECT,BOOL)(好象就是他了)

解决方案 »

  1.   

    剪切区域是device-context对象的一个属性,当使用这个device-context 对象作图时,位于剪切区域外的作图将被忽略,也就是说,作图被限制在此区域以内。
    你可以用CDC成员函数或同名的Win32API:SetBoundsRect,GetBoundsRect,GetClipBox,SelectClipRgn,ExcludeClipRect,ExcludeUpdateRgn,IntersectClipRect,OffsetClipRgn,PtVisible,RectVisible 来获取或操纵剪切区域。(具体看MSDN)
    BeginPaint/EndPaint主要用于重画客户区域,维持窗口当前外观。
    当使用BeginPaint()取得DC时,该函数将之前由于调用InvalidateRect()或由于系统原因无效的区域(比如一个重叠窗口被移走)相累积,计算出剪切区域并将此剪切区域赋给dc,这样用此DC作图,仅仅无效区域被重画,因此可以避免大量重复而无意义的作图工作。这样特别在需要大量作图的应用中可以显著提高效率。
    当时用EndPaint()结束作图时,函数将设置所有的客户区区域为有效,以避免重复刷新无效区域,并且ReleaseDC.
    其实,BeginPaint/EndPaint内部也调用了GetDC/ReleaseDC.
    而GetDC()只是单纯的取得客户区DC,这时获得的DC剪切区域默认为整个客户区域。用GetDC/ReleaseDC的优点是可以不管该区域是否有效而强制绘制此区域,用于需要改变窗口外观的情况下,比如动画,浮动按钮。但由于是强制性的,每一步作图都需要在屏幕上绘制,所以最好用于小范围作图。
    一点经验,见笑了。
      

  2.   

    呜呜   我看的是《windows程序设计》呀
      

  3.   

    这么说吧, 在响应wm_paint中, 不论你画什么, 比方你按下一个按钮的时候
    on_click()
    {
        bFlag = true;
    }
    on_paint()
    {
     if (bFlag)
    {
        // 画一个方框
    }
    else
    {
        // 花一个园
    }
    }那么, 你按下按钮以后, 窗口不会有任何变化
    你用另外一个窗口挡住一部分, 然后你会发现仅仅是刚才被挡住的部分有了一个园
    而不是显示全部
      

  4.   

    什么时候用 begindc什么时候用 getdc??
    谢谢
      

  5.   

    用begindc是在调用InvalidateRect(hwnd,rect,true),使得以rect为边界的客户区无效,并调用了wm_pait产生重画消息,就用它来取得设备描述表句柄
    而getdc是在取得客户区的大小或默认的客户区来进行一些与图形有关的操作,
    一般说来,如果你进行的图形操作是在产生wm_paint消息中进行的,并且用默认的客户区的大小,他们俩都可以用。
      

  6.   

    好象第2种方法中 GetDC()  无法自己定义一个无效区域(系统事先定义整个客户区为无效区域,能改吗?) 
      

  7.   

    不会吧!《windows程序设计》这本书写的很好呀!
      

  8.   

    一般在响应WM_PAINT消时才用到BeginPaint和EndPaint函数,因为BeginPaint函数会跟据不同的情况决定重画多大的区域——可以用InvalidateRect函数指定。如果InvalidateRect设定了一块很小的区域,在BeginPaint和EndPaint之间的绘图操作中只有部份有效(这很难理解,你可以自已在程序中试试)。如果在其它函数中用BeginPaint和EndPaint函数,大多的情况是你看不到有任何变动,这是因为BeginPaint必须知道哪些地方是无效区。你可以在BeginPaint之前显式的调用InvalidateRect.而GetDC函数几乎和BeginPaint函数没有什么关系,它只是得到一个内存环境的句柄,没有其它任何功能。在除OnPaint函数的其它函数中使用。
      

  9.   

    to rfa20:
    你好,好久不见,我现在在深圳工作。
    你的问题很简单,不过你看的书就太......
    建议你还是买本《Windows程序设计》来看吧,作者是Charles Petzold。
    这是Windows编程的圣经(不是我说的)。
      

  10.   

    . BeginPaint()、EndPaint()
    可以去掉(合并?)多余的WM_PAINT消息.
      

  11.   

    to abei:
    你说的是什么意思?
      

  12.   

    Robin_Hood_POT(令狐冲) :
     nice to see you !
      

  13.   

    用SelectClipRgn可以自己设置剪切区域。