#27 如何在ATL中取得windowsless窗口的HWND?
答:windowsless 就是没有窗口。你的ATL控件没有窗口, m_hWnd不是NULL能是什么。 至于Ondraw得到的 hdc 实际是父窗口的hdc。huhu 你注意看 M$ 的form 系列控件(就是IE页面中的那些textbox checkbox ....), 都是windwosless的。
if (m_bWndLess) 

HDC hDC; 
HWND hWnd; 
// Get the HDC from the client 
m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC); 
// Get the HWND from the HDC 
hWnd = WindowFromDC(hDC); 
m_spInPlaceSite->ReleaseDC(hDC); 

注意:不要乱动那个hWnd因为这个东西不是你的。 

解决方案 »

  1.   

    目录我能过ATL生成的ActiveX控件都是从IOleInPlaceObjectWindowlessImpl派生出来的,难道说所有的ActiveX控制都不是子窗口吗?只是占用了父窗口一块区域而已。
      

  2.   

    在VC++中,当我将控件放到对话框中,控件区域成为白色,我在OnDraw里面并没有调用FillRect等函数,那么这块区域是由谁填充的呢?
      

  3.   

    我仔细看了一下,我写的这个控件的确是WindowLess的,其实很简单,基类CComControl的有两个成员变量,m_hWndCD控件的窗口句柄,m_bWndLess是否是无窗口的.
    除此以外,CComControl还有一个很奇怪的成员变量m_bWindowOnly.且看MSDN的解释
    m_bWindowOnly:Flag indicating the control should be windowed even if the container supports windowless controls
    难道说控件窗口化或不窗口化跟容器有关吗?非窗口组件为什么可以得到标准window消息呢?是容器窗口传递给它的吗?请各位大虾给小弟解释一二,一定加分。
      

  4.   

    我想你可能有点乱,这不是什么窗口化,而是如果是WindowLess的话,窗口背景透明,而非WindowLess的话,就是我们常说的窗口,默认是白色背景且不透明,这就是它们的区别。
      

  5.   

    不对,看msdn上说,为了减少系统资源消耗,对于那些简单的ActiveX的确是无窗口的,它由两个接口IOleInPlaceObjectWindowlessImpl(控件端)和IOleInPlaceSiteWindowless(容器端)共同模拟一个窗口的操作,甚至加速键消息。Windowless控件不能调GUI函数InvalidateRect以及DefWindowProc,因为它不是一个真正的窗口。这样说来通过GetDlgItem得到的那个HWND是什么?难道也是控件或容器模拟出来的吗?
      

  6.   

    非WindowLess窗口,默认的白色背景不透明,怎么改呢?