VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 725|回复: 7

获取窗口句柄

[复制链接]
18_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-21 12:28:30 | 显示全部楼层 |阅读模式
3驿站币
MFC中在tabcontrol 控件下两个选项卡分别对应一个对话框窗口设为A和B,我要在A里做个按钮里面写是Settimer,然后Ontimer写在B对话框来响应,我听说可以用API函数的Settimer函数,在该函数里面的第一个参数写B对话框的句柄就可以,这样能行吗?如果可以那么怎么获取B对话框句柄呢,我在网上找了几个总不能用,请帮我详细写一下吗?我刚接触编程真的不懂,这个东西整了快两天了。

最佳答案

查看完整内容

想复杂了,等系统帮你做,是不行地。其实很简单, 第一种方法:你在page1添加一个私有变量CPAGE2*p2的指针。再做一个方法set(CPAGE2*p),在父类把这个类实例page11.set进入。再到里面用,不就有了。 第二种方法:添加一个方法把父类实例传到A窗口,A窗口通过父找到B。 第三种方法:父类里申明一个静态变量g,父构造函数中,保存g=this,想访问A,B都不是问题。父类名::p->page1或父类名::p->page2. 第四种方法:SDK方法,保存类实 ...




上一篇:关于c++Socket通信问题,想接收数据的时候按照指定的开始和结束进行接收
下一篇:SQL表设计
75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-21 12:28:31 | 显示全部楼层
本帖最后由 xx_player 于 2019-5-23 10:22 编辑

想复杂了,等系统帮你做,是不行地。其实很简单,
第一种方法:你在page1添加一个私有变量CPAGE2*p2的指针。再做一个方法set(CPAGE2*p),在父类把这个类实例page11.set进入。再到里面用,不就有了。
第二种方法:添加一个方法把父类实例传到A窗口,A窗口通过父找到B。
第三种方法:父类里申明一个静态变量g,父构造函数中,保存g=this,想访问A,B都不是问题。父类名::p->page1或父类名::p->page2.
第四种方法:SDK方法,保存类实例指针到各自的窗口SetLongPtr(hWnd,GWLP_USERDATA,类指针),因为窗口是全局句柄,所以都可以访问到,用GetLongPtr取。
在你这里不需要弄这复杂。用第一种,父建好page1,page2,就page1.set(&page2)或page2.set(&page1).
在类中添加方法,保存变量应该不是问题吧。
思路,父就是主窗口cpp,它是根,从根开始传,逐级保存在子对象的父变量长。子通过父找到上层,上层通过父又找到更上层,如此反复。
想访问哪个就访问哪个,不能访问,是你没保存。那就没法。
可以在父初始化时,把父对象的指针传到各子对象里。

获取窗口句柄


75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-5-22 13:13:34 | 显示全部楼层
能搞2天,已经很不错,有时一个问题,我们都还想一个星期,甚至个把月。才彻底明白了。
就跟给别人装机一样,一会,一会,几个小时,一天过去,可能就还是一会。但是肚子确实就饿了。
时间对你来说不重要,重要的是把问题弄明白。
你的问题不在于在哪个窗口,而在于没明白定时器
首先看SDK定时器定义:
UINT_PTR SetTimer(
  HWND      hWnd,
  UINT_PTR  nIDEvent,
  UINT      uElapse,
  TIMERPROC lpTimerFunc
);
第一个参数是窗口句柄
第二个参数是定时器ID
第三个参数是响应时间,按毫秒计算
第四个参数是响应函数。
当第四个参数为NULL时,通过窗口的WM_TIMER消息响应. 第一个参数指明窗口。
当第四个参数不为NULL时,通过第四个参数的来响应消息。这是第一个参数可以设为NULL,也可以设置一个窗口。
此时与窗口就没什么关系,第四个参数是全局函数。

再看MFC定时器定义:
UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent,UINT nElapse,void(__stdcall*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD));
区别就是MFC没窗口句柄,而是CWND类。
CWND取窗口句柄,不是很简单,比如当前CWND实例,只要
this->GetSafeHwnd();就获取了。

第三回答你的问题
你建了页控件,并绑定对话框,变量肯定知道。
你要把定时器响应函数绑到哪个窗口,就用哪个变量,不就行了。
比如你页对话框分别为m_dlg1,m_dlg2, 要绑定m_dlg2窗口上
就这样:
        int nIDEvent = 1;
        int nElapse = 1000;
        m_dlg2.SetTimer(nIDEvent, nElapse, NULL);

不过这样还不能产生动作。因为第三个餐宿为NULL,表示用窗口消息,
得添加WM_TIMER消息响应及处理函数OnTimer.

如果担心它收不到消息,它是子窗。就不用消息试试。
        m_dlg2.SetTimer(nIDEvent, nElapse, MyTimerProc);
再添加全局或静态函数
VOID CALLBACK MyTimerProc(
    HWND hwnd,           // handle to window for timer messages
    UINT message,         // WM_TIMER message
    UINT idTimer,           // timer identifier
    DWORD dwTime)     // current system time
{


}

获取窗口句柄




18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-5-22 17:16:17 | 显示全部楼层
xx_player 发表于 2019-5-22 13:13
能搞2天,已经很不错,有时一个问题,我们都还想一个星期,甚至个把月。才彻底明白了。
就跟给别人装机一 ...

谢谢你细致的回答,还有点不明白,窗口的类对象就是指的你上面提到的m_dlg变量吧,我是在主对话窗口的cpp文件里定义了两个页面的类对象,CPAGE1  page1;CPAGE2  page2;我在1页面写ontimer用来响应,我在2页面放置按钮写入,page1.Settimer(1,3000,NULL);,但是之前定义的page1这个类对象是在主对话框的cpp里,如何引入到PAGE2.cpp里面呢,因为直接写page1.Settimer(1,3000,NULL);,page1没定义。
18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-5-22 17:27:28 | 显示全部楼层
xx_player 发表于 2019-5-22 13:13
能搞2天,已经很不错,有时一个问题,我们都还想一个星期,甚至个把月。才彻底明白了。
就跟给别人装机一 ...

谢谢你细致的回答,还有一点不明白,窗口的类对象就是和你说的m_dlg是一回事把,我是在主窗口的cpp文件中定义的A 和B两个对话框的类对象,CPAGE1  page1;CPAGE2  page2;我在A窗口的CPP文件里写ontimer响应,我是在B窗口的CPP文件里写的是page1.Settimer(1,2000,NULL),但是 page1 这个类对象没在B对话框的CPP里,所以page1没定义, 所以怎样把这个类对象引入到B对话框的CPP中呢?
87_avatar_middle
最佳答案
11 
在线会员 发表于 2019-5-23 08:40:42 | 显示全部楼层
B对话框句柄获得
BOOL B::OnInitDialog()
{

HWND hWnd=this->GetSafeHwnd() //获得本窗口句柄

return TRUE;
}
18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-5-25 15:29:48 | 显示全部楼层
cqzj70 发表于 2019-5-23 08:40
B对话框句柄获得
BOOL B::OnInitDialog()
{

你好,我再问一下,如果要在B对话框的cpp中获得A对话框窗口的句柄怎样写呢?
87_avatar_middle
最佳答案
11 
在线会员 发表于 2019-5-25 18:39:57 | 显示全部楼层
相同的方式,如果要交互,可把这个获得的句柄设为静态变量 static HWND aHwnd=NULL ;   这样就能在B对话框获得 A的句柄。A::aHwnd;
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-24 16:00

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表