1. 程式人生 > >獲取對話方塊控制代碼

獲取對話方塊控制代碼


簡介:

獲取主對話方塊和子對話方塊的控制代碼,子對話方塊通過FindWindow。我之所以會用這個函式,其實我是有這個需求,那就是我需要在一個對話方塊的通過AfxBeginThread建立的執行緒中呼叫另一個對話方塊函式。廢話少數,如下:


1.主對話方塊

在其它對話方塊或者執行緒呼叫時,目前有以下幾種常用的方法

1)通過獲取對話方塊的指標方式

CTcpAsynSDlg *pMainDlg = (CTcpAsynSDlg*)AfxGetApp()->GetMainWnd();
pMainDlg->m_hWnd;  //就是指向主對話方塊的控制代碼。

2)呼叫GetParent()

CWnd* pWnd=this->GetParent();

pWnd->m_hWnd;可以獲得父視窗控制代碼。

3)呼叫AfxGetMainWnd()

AfxGetMainWnd()-> m_hWnd;

AfxGetMainWnd(); 返回的是m_pMainWnd


2.子對話方塊

1)使用FindWindow()

CLogReadDlg* g_pLogReadDlgWnd;
	HWND hWnd = ::FindWindow(NULL,"日誌");
	//HWND hWnd = ::FindWindow("#32770","日誌");
	g_pLogReadDlgWnd = (CLogReadDlg*)FromHandle(hWnd);

順便通過FromHandle還可以獲得對話方塊指標。

2)詳解

MSDN:

HWND FindWindow( 
LPCTSTR lpClassName, 
LPCTSTR lpWindowName ); 
很多人誤以為第一個引數是類名之類的,其實是錯誤的,不要被變數名迷惑。

通過VC工具Spy++,如圖可以看到使用方法。所有的對話方塊視窗類名都是#32770。

所以也可以呼叫HWND hWnd = ::FindWindow("#32770","日誌");

但是這種不直觀,最簡單的方法是HWND hWnd = ::FindWindow(NULL,"日誌");第二個引數就是你的視窗名,簡單的理解就是對話方塊的標題。



3)注意

很多人對FindWindow()第一個引數沒有完全理解,建議使用HWND hWnd = ::FindWindow(NULL,"日誌"); 把第二個引數替換成你們自己的標題名即可。