急需高手指点:回调函数里的数据显示在对话框的问题??

时间:2022-09-06 13:55:19
     本人在对话框里写了一个回调函数,目的是为了调用DLL里的函数,把DLL里的数据显示在本对话框。我的程序如下:

 
 static void CALLBACK Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide);//这是在对话框类里定义的回调函数.

  void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
 theApp.ReceiveData(m_stockCode,[img=http://][/img]m_orderPrice,m_orderSide);//调用应用程序中自定义的函数
}

在应用程序里的ReceiveData函数如下:
  void CCallChartDemoApp::ReceiveData(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
pDemoDlg = new CCallChartDemoDlg;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
         pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)
}
我就是想让对话框上的static控件显示tempBuf里的数据,可是显示不出来。结果出错。不管怎么做,程序执行到最后一步就出错。我查看,tempBuf是拿到了数据,可就是在pDemoDlg里显示不出来,不知道怎么回事?我试图用SendMessage发送消息给对话框来实现,还是解决不了。我把对话改为非模态对话框,还是同样的问题。希望高手指点,感激万分!!!
         

23 个解决方案

#1


tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据
后加pDemoDlg->CreateIndirect(...).
不过看起来代码问题比较多.

#2


就是最后每到这里pDemoDlg->m_Static.SetWindowText(tempBuf)就运行不下去了。不知道什么原因?

#3


看到对话框了吗?没看到的话需要用CreateDialog来创建.

#4


pDemoDlg = new CCallChartDemoDlg;
 对话框创建了吗?没创建肯定会出错了。。。

#5


创建了,我用的是  new ...Create()...ShowWindow() 方法创建的。

#6


pDemoDlg = new CCallChartDemoDlg;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)


你这里pDemoDlg只是new出一个对象,并没有创建窗体啊
pDemoDlg->m_Static当然不可用

你可以用这个判断
::IsWindow(pDemoDlg->m_Static.GetSafeHwnd())

#7


问题是:窗体之前就有的,我只不过想把数据传过去!

#8


引用 7 楼 crazyhuman 的回复:
问题是:窗体之前就有的,我只不过想把数据传过去!

但是你这个pDemoDlg是新的啊 有没和那个窗体相关联 
pDemoDlg->Create(IDD,this);

#9


在回调函数中增加字段 void *param
在回调函数中将param转换成你的对话框指针
CMyDialog *pDlg = (CMyDialog*)param;
if( null == pDlg ) reutrn ;
else
{
pDlg->SetWindowText("这是回调函数传回来的数据");
}

#10


按你说的方法也不行哥哥,我刚试过了,pDemoDlg 我就是用之前那个对话框的类创建的,用Create(IDD,this) 是重新创建一个窗体,而且this指针这里根本不能用(静态回调函数)。

#11


zhouyongku:
   按你的方法去处理,CMyDialog *pDlg = (CMyDialog*)param;这里出现内存问题,程序在这里就执行不下去了。

#12


调试下看这里pDemoDlg是不是空指针

#13


是空指针啊,程序执行到那里就不走了!

#14


我也不知道你的 void *param = NULL ;这个是用来干什么的?是接受数据?

#15


引用 13 楼 crazyhuman 的回复:
是空指针啊,程序执行到那里就不走了!

空指针说明没创建成功 当然不能对static赋值

#16


那怎么弄?

#17


终于看明白了.
把void CCallChartDemoApp::ReceiveData(char* m_stockCode, char* m_orderPrice, char* m_orderSide)这个函数从CallChartDemoApp.cpp和CallChartDemoApp.h中删除.
按下面修改CCallChartDemoDlg::Chart_DisPaly.


void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
this->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = this->buffer;//tempBuf是拿到了数据。
  this->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)
}




#18


靠,还是搞错了,是static,你要吧CCallChartDemoDlg指针传进来.

void CALLBACK CCallChartDemoDlg::Chart_DisPaly(CCallChartDemoDlg * lpThis,char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
pDemoDlg = lpThis;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)
}


#19


问题是不能给Chart_DisPaly函数增加CCallChartDemoDlg *lpThis这个参数。Chart_DisPaly 是固定的。

#20


不行哥哥,还是出错~

#21


Chart_DisPaly的函数指针接口是固定的,那个接口的参数都是固定的。

#22


在CallChartDemoApp.h声明类成员变量CCallChartDemoDlg *m_lpCCallChartDemoDlg;
找到创建CCallChartDemoDlg的地方,可能在CCallChartDemoApp::InitInstance()里.

CCallChartDemoDlg dlg;
m_pMainWnd = &dlg;//其实你完全可以用这个.
m_lpCCallChartDemoDlg = &dlg;//保存下来.
       
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}

然后按你开始的想法:



void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
pDemoDlg = theApp.m_lpCCallChartDemoDlg;//或者theApp.m_pMainWnd;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)

}



#23


哥哥,你太厉害了,这个问题终于解决了!感谢你了哥哥。不嫌弃的话弟弟我愿和你交个朋友!我的QQ:
641727358

#1


tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据
后加pDemoDlg->CreateIndirect(...).
不过看起来代码问题比较多.

#2


就是最后每到这里pDemoDlg->m_Static.SetWindowText(tempBuf)就运行不下去了。不知道什么原因?

#3


看到对话框了吗?没看到的话需要用CreateDialog来创建.

#4


pDemoDlg = new CCallChartDemoDlg;
 对话框创建了吗?没创建肯定会出错了。。。

#5


创建了,我用的是  new ...Create()...ShowWindow() 方法创建的。

#6


pDemoDlg = new CCallChartDemoDlg;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)


你这里pDemoDlg只是new出一个对象,并没有创建窗体啊
pDemoDlg->m_Static当然不可用

你可以用这个判断
::IsWindow(pDemoDlg->m_Static.GetSafeHwnd())

#7


问题是:窗体之前就有的,我只不过想把数据传过去!

#8


引用 7 楼 crazyhuman 的回复:
问题是:窗体之前就有的,我只不过想把数据传过去!

但是你这个pDemoDlg是新的啊 有没和那个窗体相关联 
pDemoDlg->Create(IDD,this);

#9


在回调函数中增加字段 void *param
在回调函数中将param转换成你的对话框指针
CMyDialog *pDlg = (CMyDialog*)param;
if( null == pDlg ) reutrn ;
else
{
pDlg->SetWindowText("这是回调函数传回来的数据");
}

#10


按你说的方法也不行哥哥,我刚试过了,pDemoDlg 我就是用之前那个对话框的类创建的,用Create(IDD,this) 是重新创建一个窗体,而且this指针这里根本不能用(静态回调函数)。

#11


zhouyongku:
   按你的方法去处理,CMyDialog *pDlg = (CMyDialog*)param;这里出现内存问题,程序在这里就执行不下去了。

#12


调试下看这里pDemoDlg是不是空指针

#13


是空指针啊,程序执行到那里就不走了!

#14


我也不知道你的 void *param = NULL ;这个是用来干什么的?是接受数据?

#15


引用 13 楼 crazyhuman 的回复:
是空指针啊,程序执行到那里就不走了!

空指针说明没创建成功 当然不能对static赋值

#16


那怎么弄?

#17


终于看明白了.
把void CCallChartDemoApp::ReceiveData(char* m_stockCode, char* m_orderPrice, char* m_orderSide)这个函数从CallChartDemoApp.cpp和CallChartDemoApp.h中删除.
按下面修改CCallChartDemoDlg::Chart_DisPaly.


void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
this->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = this->buffer;//tempBuf是拿到了数据。
  this->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)
}




#18


靠,还是搞错了,是static,你要吧CCallChartDemoDlg指针传进来.

void CALLBACK CCallChartDemoDlg::Chart_DisPaly(CCallChartDemoDlg * lpThis,char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
pDemoDlg = lpThis;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)
}


#19


问题是不能给Chart_DisPaly函数增加CCallChartDemoDlg *lpThis这个参数。Chart_DisPaly 是固定的。

#20


不行哥哥,还是出错~

#21


Chart_DisPaly的函数指针接口是固定的,那个接口的参数都是固定的。

#22


在CallChartDemoApp.h声明类成员变量CCallChartDemoDlg *m_lpCCallChartDemoDlg;
找到创建CCallChartDemoDlg的地方,可能在CCallChartDemoApp::InitInstance()里.

CCallChartDemoDlg dlg;
m_pMainWnd = &dlg;//其实你完全可以用这个.
m_lpCCallChartDemoDlg = &dlg;//保存下来.
       
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}

然后按你开始的想法:



void CALLBACK CCallChartDemoDlg::Chart_DisPaly(char* m_stockCode, char* m_orderPrice, char* m_orderSide)
{
CString bufCode(m_stockCode);
CString bufPrice(m_orderPrice);
CString bufSide(m_orderSide);
CString tempBuf;
pDemoDlg = theApp.m_lpCCallChartDemoDlg;//或者theApp.m_pMainWnd;
pDemoDlg->buffer = bufCode + "|" + bufPrice + "|" + bufSide;//数据拿到啦
tempBuf = pDemoDlg->buffer;//tempBuf是拿到了数据。
  pDemoDlg->m_Static.SetWindowText(tempBuf);//pDemoDlg为对话框指针(这里出错,执行不下去了)

}



#23


哥哥,你太厉害了,这个问题终于解决了!感谢你了哥哥。不嫌弃的话弟弟我愿和你交个朋友!我的QQ:
641727358