请问GetDC和GetWindowDC有何区别?TextOut(GetDC(GetDesktopWindow),0,0,'AAABBB',6);看不到输出的字符,而
TextOut(GetWindowDC(GetDesktopWindow),0,0,'AAABBB',6);能看到,为什么?TextOut(GetDC(GetDesktopWindow),0,0,'AAABBB',6);看不到,但
TextOut(GetDC(0),0,0,'AAABBB',6);能看到. 为什么?用TextOut(GetDC(self.handle),0,0,'AAABBB',6);输出字符后,
用InvalidateRect(self.handle,nil,true);可以清除掉输出的字符.但TextOut(GetDC(0),0,0,'AAABBB',6)输出到屏幕,
用InvalidateRect(GetDesktopWindow,nil,true)为什么又不可以清除呢?

解决方案 »

  1.   

    GetDC(0)获得的是整个屏幕的设备环境,程序可以直接在屏幕上执行绘制操作,覆盖窗口及其他图形(不推荐使用)在默认情况下,显示环境位于窗口客户区域内。这是执行绘制的通常区域,同时也可以获得整个窗口或者显示器的环境设备。GetWindowDC获得的窗口的设备环境。该函数获得包括非客户区域(边框、标题栏等)的设备环境。这个设备环境总是通用的设备环境,并且不与其他设备环境共享属性。而GetDC是获得对象的私有设备环境,对通过GetWindowDC函数获得的设备环境所做的任何改变都不会影响私有设备环境
      

  2.   

    GetDc函数用于获得hWnd参数所指定窗口的客户区域的一个设备环境。所获得的设备环境可以是通用、类或者私有类型,具体由指定窗口的类风格决定。对于通用设备环境,GetDc函数每次获取一个设备环境时都会用默认属性对它进行初始化。该函数获得的类和私有设备环境会与它们最后一次的设置保持一致。当设备环境不再需要时,应该调用ReleaseDC函数将其释放。GetWindowDC函数返回hWnd参数所指定的窗口的设备环境。获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏、菜单、滚动条,以及边框。这使得程序能够在非客户区域实现自定义图形,例如自定义标题或者边框。当不再需要该设备环境时,需要调用ReleaseDC函数释放设备环境。注意,该函数只获得通用设备环境,该设备环境的任何属性改变都不会反映到窗口的私有或者类设备环境中(如果窗口有的话)----------摘自《Delphi Win32核心API参考》
      

  3.   

    TextOut(GetDC(GetDesktopWindow),0,0,'AAABBB',6);看不到输出的字符,而
    TextOut(GetWindowDC(GetDesktopWindow),0,0,'AAABBB',6);能看到,为什么?TextOut(GetDC(GetDesktopWindow),0,0,'AAABBB',6);看不到,但
    TextOut(GetDC(0),0,0,'AAABBB',6);能看到. 为什么?用TextOut(GetDC(self.handle),0,0,'AAABBB',6);输出字符后,
    用InvalidateRect(self.handle,nil,true);可以清除掉输出的字符.但TextOut(GetDC(0),0,0,'AAABBB',6)输出到屏幕,
    用InvalidateRect(GetDesktopWindow,nil,true)为什么又不可以清除呢?