获取对话框句柄


简介:

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值