关于回调函数的一个问题

pgcat 2004-11-10 07:45:06
程序里的一个子窗体需调用一回调函数,但当程序返回后该窗体类本来已经赋值的成员变量都清空或者由构造函数重新赋值,不知道是怎么回事情 。

如窗体类 CaDlg 中
oninitdialog 本来已经将 m_x 初始化,
在调用一回调后
LRESULT CALLBACK WndProc1( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

//CaDlg* dlg=new CaDlg();
switch( uMsg )
{
case WM_LBUTTONDOWN:
//((CaDlg* )AfxGetMainWnd())->ProcessLButtonDown( hwnd );
//AfxGetMainWnd()
//((CaDlg* )((CMainDlg*)(::AfxGetApp ()->GetMainWnd ()))->GetMyWnd())->OnInitDialog ();
((CaDlg* )((CMainDlg*)(::AfxGetApp ()->GetMainWnd ()))->GetMyWnd())->ProcessLButtonDown (hwnd);
//dlg->ProcessLButtonDown (hwnd);
//delete dlg;
return 0;
}

本来我直接用AfxGetMainWnd() 但想了下这是主窗体句柄
就转了几个弯子取的该子窗体句柄,然后调用成员函数aDlg::ProcessLButtonDown(),这时候发现以前初始化的变量都清空或者由构造函数重新赋值 谢谢 帮忙看看,分还有 :)
...全文
154 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pgcat 2004-11-11
  • 打赏
  • 举报
回复
问题解决了 :)
我初始化了2次实例 多谢大家
pgcat 2004-11-11
  • 打赏
  • 举报
回复
我把代码贴出来
在CFileExplorDlg::OnNMDblclkList1中实例化CaDlg
实例化代码是
CaDlg* playDlg=new CaDlgDlg(this);
playDlg->DoModal();
delete playDlg;

CaDlg 的回调函数:
LRESULT CALLBACK WndProc1(
HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );//实例CaDlg的消息重载处理过程

徽调类容:
LRESULT CALLBACK WndProc1( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

CaDlg* dlg=new CaDlg();
switch( uMsg )
{
case WM_LBUTTONDOWN:
//((CaDlg* )AfxGetMainWnd())->ProcessLButtonDown( hwnd );
dlg->ProcessLButtonDown (hwnd);
delete dlg;
return 0;
case WM_PAINT:
。。。 。。。
}
ProcessLButtonDown()函数重新处理左键消息
void CaDlg::ProcessLButtonDown(HWND hwnd)
{
int i =0;
PRECT pRect;
switch(m_x) //m_x 在实例化时OnInitDialog()初始化成功 赋值为16,但回调处理消息进入这个函数后 m_x的值就变成了构造函数中初始的4
{
case 1:
Proc1();
break;
case 4:
Proc2();
break;
case 9:
... ...
}
}
我也觉得子窗体句柄有问题,但我现在这样new 有问题吗?
多谢楼上几位大哥慷慨解疑:)
Zark 2004-11-11
  • 打赏
  • 举报
回复
问题没有说清楚,所以大家都在猜.

楼主需要说明:

1. CaDlg是在哪里实例化的?
2. 实例化后是在哪里调DoModal()的?
3. WndProc1是谁的WNDPROC,它和CaDlg的实例间是什么关系?

楼主应该知道:
1. 只有等DoModal()后,OnInitDialog()才用被调用,你的m_x才会被初始化.
2. 在你"转了几个弯子取的该子窗体句柄"时,你所取得的"子窗体句柄"并不一定是你想像中要用的那个子窗口实例的句柄.
pgcat 2004-11-10
  • 打赏
  • 举报
回复
ProcessLButtonDown () 肯定没问题

我也觉得应该窗体句柄有问题

所以我才会 new 了一段出来
CaDlg* dlg=new CaDlg();
dlg->ProcessLButtonDown ();
delete dlg;
这样取句柄应该行吧

但还是不对!!!!555

各位大虾帮帮忙 小弟谢过 要分好说 :)
名牌大灰狼 2004-11-10
  • 打赏
  • 举报
回复
支持老大flyelf
gaoshengqiang 2004-11-10
  • 打赏
  • 举报
回复
GetMyWnd()是怎么写的?
ProcessLButtonDown ()又是怎么写的?
说不定这两个东东有问题
pgcat 2004-11-10
  • 打赏
  • 举报
回复
m_x 是 CaDlg的成员变量 就算是int 吧
在oninitdlg赋值
回调后被清空了

回调函数在令外一个类
I_Love_CPP 2004-11-10
  • 打赏
  • 举报
回复
m_x是谁的变量,或者说是干什么的?
flyelf 2004-11-10
  • 打赏
  • 举报
回复
CaDlg* dlg=new CaDlg(); ???
此处的dlg不是原来已经初始化了的对话框了

16,472

社区成员

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

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

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