现在有一主对话框,CMyTab类,m_tab。
有两个子对话框CTabPage1和CTabPage2。
这两个子框都有学号,姓名,性别三个edit框。程序打开时,默认显示子框1。并显示学号、姓名、性别的默认值。现在想定义三个全局变量学号,姓名,性别。问题一:
这三个全局变量如何在OnInitDialog里初始化?问题二:
这三个变量如何让子框1,和子框2显示?问题三:
如何实现在子框1修改这三个变量,在切换到子框2时,子框2会自动加载更新这三个变量?
在子框2修改时,子框1同样自动加载更新。PS:我是一个VC未入门的小子,各位大佬可以讲详细点吗?
比如在哪个文件的  哪个位置  添加什么变量,
在哪个文件的 哪个位置 添加 什么语句。网上找了很多资料啊,完全找不到那种小白级别的教程。
就像那种第一步做什么,第二部做什么那种教程我很喜欢,但是对于这个问题好像找不到啊。现在找到的那些都是讲得很笼统的,小白表示看不懂什么意思。就像那种直接讲用什么函数啊,我怎么用这个函数?
我直接用提示报错啊。肯定是因为使用位置不对,变量没定义之类的错误。
小白表示出现这种也不知道怎么办啊。
到底在什么位置该做什么事情?

解决方案 »

  1.   

    “现在想定义三个全局变量学号,姓名,性别。”
     放 CMyTab类,m_tab。里,子框1和子框2 初始化时 取 m_tab 中 定义的 变量(GetParent())
      

  2.   

    CString str1;
    CMyTab::CMyTab()
    {
    m_bHeadStyle=FALSE;
    str1="StrInMyTab";
    }
    // 
    CMyTab *pTab=(CMyTab *)GetParent();
    CString str=pTab->str1;
    m_Dlg1Edit1.SetWindowText(str);//"Big Char");
      

  3.   

    1.在主对话框,两个自对话框分别定义三个num,name,sex变量,分别在三个对话框的OnInitDialog里面进行初始化,初始化的值均是从配置文件ini里面进行读取,如:
    int num=GetPrivateProfileInt("XXX","numINI",-1,".\\X.ini");
    int name=GetPrivateProfileInt("XXX","nameINI",-1,".\\X.ini");
    int sex=GetPrivateProfileInt("XXX","sexINI",-1,".\\X.ini");2.参照1,三个对话框里获取对应值后显示在对应控件里
    3.在子框1设一个保存按钮,在修改值点击保存按钮后,在保存按钮对应函数里改写ini配置文件:CString temp;
    temp.Format("%s",num);
    WritePrivateProfileString("XXX","numINI",temp,".\\X.ini");
    temp.Format("%s",name);
    WritePrivateProfileString("XXX","nameINI",temp,".\\X.ini");
    temp.Format("%s",sex);
    WritePrivateProfileString("XXX","sexINI",temp,".\\X.ini");至于切换显示,在1里面OnInitDialog已经实现了
      

  4.   

    楼上能详细点吗?
    1:哪个叫主对话框?
    2:哪个叫自对话框?
    3:哪里有三个OnInitDialog,只有一个对话框的.CPP有OnInitDialog。
    麻烦能具体讲一下步骤吗?
    第一步先打开哪个文件? .CPP还是.h?
    第二步找到哪个函数或者哪个位置,添加什么代码?
    第三步第四步怎么做
      

  5.   

    2楼3楼这位大大。能讲详细点吗,卡不明白啊。什么东西 “ 放 CMyTab类,m_tab。里”?还有3楼的CString str1;在函数外面?全局变量?
    // 
    CMyTab *pTab=(CMyTab *)GetParent();
    CString str=pTab->str1;
    m_Dlg1Edit1.SetWindowText(str);//"Big Char");
    这些你也写在函数外面?放哪个函数里啊?能不能手把手教一下。
    1:先打开哪个文件,找到哪个位置,添加什么代码?
    2:再切换到哪个文件,再找到哪个位置,再添加什么代码?
      

  6.   

    你不是 有  一主对话框,CMyTab类,m_tab。吗
    把 公用 变量 放 m_tab 里,
    CString str1; //  CMyTab.h 公用变量
    CMyTab::CMyTab()
    {
    str1="StrInMyTab";// 公用变量 初始化
    }
    两个子对话框CTabPage1和CTabPage2。
     初始化 里
    CMyTab *pTab=(CMyTab *)GetParent();
    CString str=pTab->str1;
    m_Dlg1Edit1.SetWindowText(str);//"Big Char");
      

  7.   

    你不是有两个子对话框吗?那应该会有两个对应的对话框函数啊,两个对应的对话框函数里面分别有两个OnInitDialog(),如果没有,自己手动添加,添加方法百度有教程,这个是最基础的。然后我不知道你框架(两个子对话框的主体)要不要显示这三个值,要的话你在框架类CMAINFRAME里面CMAINFRAME:CMAINFRAME()进行和OnInitDialog函数一样的操作。不要的话就不用管了。具体代码上面我已经给过了,然后你只需要将每个对话框的num,name,sex的值显示到edit控件上,像name和sex上面我变量类型应该给错了,应该用CString,因为是字符串
      

  8.   

    在两个子对话框增加一个“保存”按钮,双击保存按钮自动生成一个函数,在该函数体内复制下列代码:
    注:IDC_EDIT1名称要对应
    [code=c]
    char temp[220]={0};
    GetPrivateProfileString("XXX","numINI",NULL,temp,220,".\\X.ini");
    SetDlgItemText(IDC_EDIT1,temp);
    GetPrivateProfileString("XXX","nameINI",NULL,temp,220,".\\X.ini");
    SetDlgItemText(IDC_EDIT2,temp);
    GetPrivateProfileString("XXX","sexINI",NULL,temp,220,".\\X.ini");
    SetDlgItemText(IDC_EDIT3,temp);
    [code]
      

  9.   

    11楼:
    我按照你说的,编译也过了。
    但是一点保存按钮,EDIT框里的数据全清空了。
    另外ini文件保存到哪里了?找不到。
    我把".\\X.ini"改成桌面的路径C:\Users\用户名\Desktop\也找不到ini文件。你的方法是不是这样:
    通过按钮事件,把edit框的数据写入到ini文件,然后其他子框就读取这个ini的数据?如果是这样,那么如何在切换tab标签的时候实现子框读取这个ini数据?
    我的理解是这个数据读取只发生在OnInitDialog里,只执行一次。
      

  10.   

    9楼:
    我按照你的方法。
    1:在主框MyTabDlg.h的public里添加了CString str1;
    2:在主框MyTabDlg.cpp的OnInitDialog里添加了str1="StrInMyTab";
    3:在子框TabPage1.cpp和TabPage2.cpp里添加了OnInitDialog函数,并在里面写了
    CMyTab *pTab=(CMyTab *)GetParent();
    CString str=pTab->str1;
    m_Dlg1Edit1.SetWindowText(str);//"Big Char");但是编译的时候提示:
    “CMyTab”: 未声明的标识符
    “pTab”: 未声明的标识符
    “CMyTab”: 未声明的标识符
    语法错误 : “)”
    “pTab”: 未声明的标识符
    “->str1”的左边必须指向类/结构/联合/泛型类型
    的错误。怎么回事?
    怎么处理。
      

  11.   

    ini存放在你的项目所在路径下,自己新建一个.ini文件。
    你清空是因为你没有对应的ini文件,所以这一句中GetPrivateProfileString("XXX","numINI",NULL,temp,220,".\\X.ini");你temp读取的是访问不到对应ini文件设置成null,所以你下一句SetDlgItemText(IDC_EDIT1,temp);就把对应的edit设置成空了。ini文件不是保存生成的,要你手动新建,上述代码是打开该ini文件对其中的值进行覆写。
    最后,你的理解没有问题,就是在OnInitDialog中读取,你切换打开其他子框,它生成的时候就会先调用OnInitDialog函数,自然而然,你在憋的地方保存的参数就通过ini文件传达到这个子框里面了。
      

  12.   

    更正一下,笔误,GetPrivateProfileString是读取ini,
    WritePrivateProfileString("XXX","nameINI",temp,".\\X.ini");是覆写ini对应值
      

  13.   

    15楼:
    我在程序位置建了一个txt,改名X.ini。
    然后把GetPrivateProfileString改成WritePrivateProfileString("XXX","nameINI",temp,".\\X.ini")
    打开ini文件,里面就显示
    [Info]
    numINI=
    nameINI=
    sexINI=点保存按钮,edit框依然是被清空,ini文件里也是空,而不是0。
      

  14.   

    刚弄了一下,可以正常读写ini文件了。刚打开运行程序的时候,两个子框都加载了ini的数据没问题。但是我在子框1更换数据后,点保存写入到ini。查看ini确实更改了数据。
    但是在切换tab标签的时候,子框2不会自动读取ini数据去更新edit,edit还是显示打开程序时加载的旧的ini数据。
      

  15.   


    你切换tab标签是一种什么样的操作?切换tab标签时,子框1和子框2还是打开显示的界面?还是子框都是关闭的界面?
      

  16.   


    像你这种情况,你试试点切换标签时,调用对应子框的OnInitDialog函数。再给它初始化一次,即调用新的ini数据
      

  17.   

    就是点TAB视图的上面那几个标签切换。
    代码如上。
      

  18.   

    在 m_page1.ShowWindow() 前case 0:
    m_page1Edit1.SetWindowText(m_tab.str1);//不了 再 m_tab 例 定义
    m_page1.ShowWindow(TRUE);
    ......
      

  19.   

    //不了 再 m_tab 例 定义
    CString str1=“性别”, 在 m_tab 例定义 , 需要派生 (CMyTab)
      

  20.   

    //不了 再 m_tab 例 定义
    是什么意思?例定义又是什么意思?
      

  21.   

    CString str1=“性别”, 在 m_tab 里定义 , 需要派生 (CMyTab)

    class CMyTab : public CTabCtrl
    {
    CString str1;
      

  22.   

    schlafenhamster大佬
    还是不是很明白。
    m_page1Edit1.SetWindowText(m_tab.str1);
    这个m_page1Edit1又是从哪里来的?新变量?在哪里定义?数据类型是什么?还有主对话框如何调用子框的OnInitDialog?
    具体代码是什么?添加在哪里?如果有新的变量又在哪里定义?
      

  23.   

    m_page1.Edit1.SetWindowText(m_tab.str1);
    把 page1中 edit1 关联成一个 变量 (即向导 加 变量,IDC_EDIT1)
    或者
    CWnd* pWnd=m_page1.GetDlgItem(IDC_EDIT1);
    pWnd->SetWindowText(m_tab.str1);
      

  24.   


    叫你 从 CTabCtrl 派生 一个CMyTab (向导 插入类 ,基类 CTabCtrl)
    即:
     class CMyTab : public CTabCtrl
    在 CMyTab 中 定义 公用 变量。
    2
    对话框中 CTabCtrl m_tab; 改为 CMyTab m_tab; 要加入 MyTab.h
      

  25.   

    不是 CMyTabDlg ! 这是 放 tab 的 对话框 !
    变量 在 CMyTab 的 tab 中 !
      

  26.   


    派生一个CMyTab是怎么操作?
    向导插入类在哪里,我添加东西一般都是右键的。
    我用的是VS2008。
    但是右键添加类里面的基类没有CTabCtrl类型选择。
      

  27.   

    “右键添加类里面的基类没有CTabCtrl类型选择”
    菜单 “insert“ -》newclass 。”base class“ 选 CTabCtrl
    我 只用VC6
      

  28.   

    找到方法了,问题已解决。//获取父窗口即tab控件指针
    CTabCtrl *tab=(CTabCtrl*)GetParent();
    //获取第一个子窗口指针,即Page1
    CWnd *cwnd=tab->GetWindow(GW_CHILD);
    //获取第一个子窗口后的窗口,即Page2
    CWnd *cwnd1=cwnd->GetWindow(GW_HWNDNEXT);//获取Page2上Text控件的值
    cwnd1->GetDlgItemText(IDC_EDIT1,str);