VC技术 - 怎样在一个对话框中获取另一个对话框中的变量值(转载)
2010-12-20 20:11
1.按钮表面显示数字(下面说的都是整数,以对话框上的控件为例)
定义一个字符串变量CString str;
格式化str.Format("%d",n);n为要显示的数字.
从按钮的ID获得他的指针并显示GetDlgItem(ID)->SetWindowText(str);
2.实现按钮控件数组
就是ID参与运算,假如有十个按钮,先查看资源头文件Resource.h这十个按钮ID的编号是不是连续,不是就修改他,如#define IDC_BUTTON1 1006表示第一个按钮的ID是IDC_BUTTON1 ,对应的可以参与数学运算的编号是1006,使这10个按钮的编号连续,第10个按钮的编号为1015.现在这十个按钮就可以当数组使用了
比如依次在按钮上显示1-10十个数字可以这么做
CString str;
for(int i=1;i<=10;i++)
{
str.Format("%d",i);
GetDlgItem(i+1005)->SetWindowText(str);
}
用这种方法实现阳历万年历100行代码就可以搞定.
3.在网上一个人说他建立了对话框A,又添加了一个对话框B,他在A中定义了Int a;,问怎样在B中使用a.
其实这是最简单的问题,也就是C++基本语句,只要在你使用a时,前面加上一句extern a;就搞定了;如果象a这样的比较多,不妨在A中定义一个数组,比如s[50],设法使s[1]=a;s[2]=....,在其他文件需要的时候extern s[50];就搞定了,或者自创一个头文件,把需要传送的全局变量都在那上面定义,需要的时候包含这个头文件就搞定了.
4.网上一个人说他建立了对话框A,又添加了一个对话框B,他用非模态方式显示B,可是B总是遮盖A.怎么解决?
回答这个问题的人很多,而且都是长篇大论,我总觉得那些人在误导初学者,其实解决这个问题不需要加任何代码,只要改变参数就行了,一般创建非模态对话框常见的模式如下(而且,那位先生提的问题的代码也是如此):
if(qd)
{
qd->SetActiveWindow();//如果对话框存在就激活它
qd->ShowWindow(SW_SHOW);
//CWnd::ShowWindow (SW_SHOW);
}
else//否者创建它
{
qd=new dlg1(this);
//qd->Create(IDD_DIALOG1,this);//此句使非模态对话框总是在前
qd->Create(IDD_DIALOG1,GetDesktopWindow());//此句使非模态对话框可以前后
}//IDD_DIALOG1是B对话框的ID
其中qd是在A头文件中定义的B类指针,形式好象CB *qd;.CB是你在创建B对话框类时所取的类名.
实际上只要将this换成GetDesktopWindow()就行了,就这么简单!
5.回答下面这个问题的人更多,而且更长篇大论,什么调用API函数解决等等,问题如下:网上一个人说他建立了对话框A,又添加了一个对话框B,在B中如何使用A中的控件值.
其实这也是简单的问题:
假如你为B对话框取的类名是CB,那么CB头文件中有一如此形式的构造函数:
CB::CB(CWnd* pParent =NULL)
其中的pParent就是指向其父窗口A的指针,用这个指针可以获得父窗口A的控
件值,方法如下:
在CB类头文件中定义一个窗口类指针,比如p,如:
CB::CB(CWnd* pParent =NULL)
{
...........
public:
CWnd* p;
...........
}
在CB构造函数中给p赋值(CB的cpp文件中):
CB::CB(CWnd* pParent /*=NULL*/)
: CDialog(CB::IDD, pParent)
{
p=pParent;
}
有了p就象你有了使用你女朋友使用权一样,你要想怎样就怎样! 比如提取A中一个编辑框中的数字可以这样做:int tq=p->GetdlhItemInt(IDC_EDIT1);
这里假设IDC_EDIT1为那个编辑框的ID.
6.CString强制类型转换成char*型,读取编辑框中数字
下面是我所编"双球分析程序"中一个编辑框中数据改变,而相应改变一个数组值,以便获得用户不同输入
.这段程序演示了CString强制类型转换成char*型,用c++流进行数据的输入
void dlg2::OnChangeEdit2()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
for(int i=0;i<=34;i++){ed2[i]=0;}
CString str12;
GetDlgItemText(IDC_EDIT2,str12);//得到编辑框中字符串,将值赋给str12
int js12=0;
LPCTSTR pp2 = str12;//强制类型转换,将CString转换成char*
char str2[70];
for(int iii2=0;iii2<20;iii2++){pp2++;str2[iii2]=*pp2;}
istrstream s2(str2);//设置数据流
int a12;
while(s2>>a12)//此循环从数据流中读入整数
{
cstring转为int
js12++;
cin>>a12;//也可以cin>>a12>>ed12[js1];
ed2[js12]=a12;
}
}////////////////////////////////////////////////////////
7.清除编辑框内容
m_edk1.SetSel(0,-1);//选择编辑框全部正文
//m_edk1.ReplaceSel("");//用空字符替换所选字符
m_edk1.Clear();//删除所选的字符
m_edk1是编辑框控件的变量,在用类向导添加时候把它设成控制类型,也可以用GetDlgItem(ID)->代替
m_edk1实现.
8.富编辑框读入文件
m_rich1.SetFileName ("d:\\ss.txt");//读入D盘下文件
m_rich1.SetFileName ("ss.txt");//读入程序自带文件
如果将"d:\\ss.txt"文件复制在你设计的程序文件中,我把它叫做自带文件,自带文件的好处是可以随程序
安装文件一起安装,而不需要用户重新建立数据文件,如果有网络资源,可以设置接口(函数)通过网络随时更新它!
m_rich1是CRichtext类型变量,同7.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。