获取对话框句柄


简介:

获取主对话框和子对话框的句柄,子对话框通过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,"日志");
把第二个参数替换成你们自己的标题名即可。

猜你喜欢

转载自blog.csdn.net/C_gyl/article/details/66475291
今日推荐