怎样从setTimer回调函数中得到 指向调用setTimer的窗口指针

onion____ 2011-07-02 12:50:38
CDialog CTESTDlg中的线程函数:
UINT CTESTDlg::Thread( LPVOID pParam )
{
SetTimer(TIMER, nTime, func);
return 0;
}

void CALLBACK func(HWND hWnd, UINT nMsg, UINT_PTR nTimerid, DWORD dwTime)
{
//想得到 CDialog *Dlg指向 CTESTDlg 如何完成?
}
...全文
120 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
你把它转换成CTESTDlg类型
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
HWND hWnd不是吗
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 simoreg 的回复:]

以下是MFC中的标准做法,很值得一学
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == hWnd);
[/Quote]

谢谢!
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xianglitian 的回复:]

引用 12 楼 bsknight 的回复:

引用 9 楼 xianglitian 的回复:

引用 8 楼 wltg2001 的回复:

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧

对,不能这样,其实你可以直接……
[/Quote]

谢谢 我放弃这种方法了。 自己用sleep来控制时间间隔好了
simoreg 2011-07-02
  • 打赏
  • 举报
回复
以下是MFC中的标准做法,很值得一学
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == hWnd);
向立天 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bsknight 的回复:]

引用 9 楼 xianglitian 的回复:

引用 8 楼 wltg2001 的回复:

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧

对,不能这样,其实你可以直接用句柄操作。

对呀
通过句柄发消息不比操作……
[/Quote]
用自定义消息
你要的操作整理成消息函数
当需要操作时通过句柄发消息给主线程即可
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hezhe1008 的回复:]

为什么非要在线程里用timer 直接添加timer消息不行吗
[/Quote]

我需要一个定时器 每隔一段时间发送一个数据包
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
为什么非要在线程里用timer 直接添加timer消息不行吗
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wltg2001 的回复:]

要不这样吧,
CCTESTDlg dlg;
dlg.Attach(hWnd);试试看。
[/Quote]

dlg.Attach(hWnd); 这句运行时报错
wltg2001 2011-07-02
  • 打赏
  • 举报
回复
要不这样吧,
CCTESTDlg dlg;
dlg.Attach(hWnd);试试看。
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
在CTESTDlg加个自定义消息试试
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]

引用 8 楼 wltg2001 的回复:

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧

对,不能这样,其实你可以直接用句柄操作。

对呀
通过句柄发消息不比操作指针安全多了
[/Quote]

我想操作窗口类里的成员函数 用句柄怎样使用?
比如 CTESTDlg里有成员函数 m_Num 怎样通过句柄赋值?
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wltg2001 的回复:]

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧

对,不能这样,其实你可以直接用句柄操作。
[/Quote]

[Quote=引用 8 楼 wltg2001 的回复:]

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd

我想操作窗口类里的成员函数 用句柄怎样使用?

比如 CTESTDlg里有成员函数 m_Num 怎样通过句柄赋值?
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hezhe1008 的回复:]

CTESTDlg dlg = (CTESTDlg)hWnd这样行贝。。。试试吧
[/Quote]

我用的是CWND的重载SETTIMER
向立天 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wltg2001 的回复:]

引用 5 楼 bsknight 的回复:
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧

对,不能这样,其实你可以直接用句柄操作。
[/Quote]
对呀
通过句柄发消息不比操作指针安全多了
wltg2001 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bsknight 的回复:]
引用 4 楼 hezhe1008 的回复:

CTESTDlg* dlg = (CTESTDlg*)hWnd



一个是句柄 一个是窗口类。。不能这样吧
[/Quote]
对,不能这样,其实你可以直接用句柄操作。
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
第一个参数你没写啊
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
CTESTDlg dlg = (CTESTDlg)hWnd这样行贝。。。试试吧
onion____ 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hezhe1008 的回复:]

CTESTDlg* dlg = (CTESTDlg*)hWnd
[/Quote]


一个是句柄 一个是窗口类。。不能这样吧
呔妖怪来嘛 2011-07-02
  • 打赏
  • 举报
回复
CTESTDlg* dlg = (CTESTDlg*)hWnd
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧