我做了一个对话框程序DialogA,(ID为IDD_DIALOGA),DialogA上有一ButtonA按钮,左击ButtonA,弹出DialogB(ID为IDD_DIALOGB),但怎样获得DialogB的窗口指针呢?
我的ButtonA的Onlicked()代码如下:
void CDialogA::OnButtonA()
{
CDialog dlgg;
dlgg.DoModal(); CWnd* pDlg;
pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
pDlg->ShowMsg();//不能访问!!!! //实现如下:
}void CDialogB::ShowMsg()
{
AfxMessageBox("heelddd");
}编译出错: error C2039: 'ShowMsg' : is not a member of 'CWnd'我改成: pDlg=(CWnd*)AfxGetMainWnd()->Findow(NULL,"DialogB");
//"DialogB"为DialogB的标题。
编译出错:error C2039: 'Findow' : is not a member of 'CWnd'。怎样解决?
我的ButtonA的Onlicked()代码如下:
void CDialogA::OnButtonA()
{
CDialog dlgg;
dlgg.DoModal(); CWnd* pDlg;
pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
pDlg->ShowMsg();//不能访问!!!! //实现如下:
}void CDialogB::ShowMsg()
{
AfxMessageBox("heelddd");
}编译出错: error C2039: 'ShowMsg' : is not a member of 'CWnd'我改成: pDlg=(CWnd*)AfxGetMainWnd()->Findow(NULL,"DialogB");
//"DialogB"为DialogB的标题。
编译出错:error C2039: 'Findow' : is not a member of 'CWnd'。怎样解决?
解决方案 »
- Spin控件与Edit控件的结合使用
- 类型转换的问题
- 如何清空当前程序注册表
- 100分问CryptDeriveKey函数的实现原理:怎么算出最后的session key?
- 呵呵,麻烦大家帮忙看看这台机器能卖多少钱
- 在线????
- 50分求程序,关于treeview,在线等!在线给分!!
- 怎样在一个工程中加入另一个工程的对话框我已将此对话框的头文件与CPP加入到我的工程中但就是看不到,是不是还有什么东东呀?
- 请大使指教,我要做一个具有容错机志的中介件,用于Socket处理,具体如一台应用服务器有问题,自动跳到另一台应用服务器,并要维持消息状态?
- 如何判断系统用的是16位色,还是32位色还是其它
- richEdit控件如何设置指定文本样式?
- 求助:国际象棋骑士遍历问题
头文件加了,我想这已经比较具体了.
在A的**dlg中声明 CDialog *dlg;
构造中赋空。
button()
{
if (dlg==NULL)
{
dlg=new CDialog;
dlg->creat(IDD_DIALOGB,this);
}
dlg->showwindows(SW_SHOW);
不知能否帮你。
{
CDialogB *pdlgB = new CDialogB(this);
pdlgB->Create(IDD_DIALOGB,this); pdlgB->ShowWindow(SW_SHOW);}
DoModal()完了之后,对话框的资源释放了,你当然得不到它的指针了。
寒兄:
这是用非模态对话框吧,我用的是模态对话框。不过我来试试,谢谢!
CWnd* pDlg;
pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
pDlg->ShowMsg();//
这样好像会内存泄漏的。
BCB_FANS(四大名捕之追杀令)
当MessageBox(模态对话框)对话框显示的时候,主窗口将失去焦点,知道了这一点,问题就很简单了。下面是我的C++Builder代码。//替换主窗口的窗口过程(我不知道VC怎样办到这一点,反正原理就是这样)void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
TForm::WndProc(Message); //失去焦点之前
if(Message.Msg == WM_NCACTIVATE)
{
}
//失去焦点之后
else if(Message.Msg == WM_ACTIVATE)
{
if(LOWORD(Message.WParam) == WA_INACTIVE)
{
HWND hWnd;
char ClassBuf[64]; hWnd = (HWND)Message.LParam;
GetClassName(hWnd,ClassBuf,sizeof(ClassBuf)); //首先判断是否是MessageBox对话框,
if(AnsiString(ClassBuf) == "#32770")
{
//再判断这个窗口是否是本身程序的窗口(因为别的程序弹出窗口时,你的主窗口也同样失去焦点)
DWORD dwProcessID;
GetWindowThreadProcessId(hWnd,&dwProcessID);
if(dwProcessID == GetCurrentProcessId())
{
//移动窗口的位置
MoveWindow(.......);//或者调用 SetWindowPos(...)
//替换左边的标题栏图标(如果有的话)
SetClassLong(hWnd,GCL_HICON,(long)Image1->Picture->Icon->Handle); //重新设置按钮的文本(比如把确定改为“OK 007”)
HWND hTemp; hTemp = GetDlgItem(hWnd,1);
SetWindowText(hTemp,"New Text For Button"); //.........其他操作
}
}
}
}
}
dlgg.DoModal(); CWnd* pDlg;
pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
pDlg->ShowMsg();//不能访问!!!! //实现如下: 当然不能访问了。你的pDlg已经是CWnd类的,根本不是IDD_DIALONGB的。改成: pDlg=(CWnd*)AfxGetMainWnd()->Findow(NULL,"DialogB");
//"DialogB"为DialogB的标题。错误与上面的一样。
如果一定要访问,可以在XXXApp中定义非模态的指针。以后在什么地方都可以访问,然后初试化后不要显示。
弹出后点击关闭按扭就ShowWindow(WS_HIDE);
这样你就可以使用它的函数了。
我的成长有大家的关怀。
Thanks sincerely.