ATL控件 總結

ATL 無窗口 ActiveX 控件中,得到容器窗口句柄的方法

CComPtr < IOleClientSite > spClientSite;
GetClientSite( &spClientSite );
CComQIPtr < IOleInPlaceSite > spSite = spClientSite;

HWND hwnd;
spSite->GetWindow( &hwnd );


很多人都知道由控件ID獲得控件窗口句柄可以通過函數GetDlgItem來實現:

The GetDlgItem function retrieves a handle to a control in the specified dialog box.

HWND GetDlgItem(
  HWND hDlg,       // handle to dialog box
  int nIDDlgItem   // control identifier
);
 
但通過窗口句柄得到控件ID就不是那麼多人知道了。(迷之聲:yo,是你不知道吧,不要自以爲是了)
(bilicon:哈哈,也許是吧)
 
通過句柄得到控件ID我們可以用函數GetDlgCtrlID來實現:
 

The GetDlgCtrlID function retrieves the identifier of the specified control.

int GetDlgCtrlID(
  HWND hwndCtl   // handle to control
);


Title

如何得到用 ATL 作的控件的窗口句柄,試了幾個都無效,怎麼回事?

Q

這ATL編成還真費勁,我用vs7做了個ATL控件,同時要導入一個別的繪圖用的dll,但是該dll中的庫函數全都需要窗口句柄,我試了控件類中的m_hWnd,m_hWndCD,GetWindow(HWND *phwnd)成員得到的句柄都無效,把它們的數值想辦法顯示出來後,發現全是0,我又用m_spInPlaceSite->GetWindow(&hwndParent),得到了控件的父窗體句柄,但是控件本身的句柄還是沒有辦法得到,弄了一天了,沒有結果,太鬱悶了,望高手相救。

A

windowless的控件沒句柄(這是ATL Full Control的默認選項)

創建控件的時候在屬性頁中選擇不透明就可以了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章