单视图文档程序中 如何在自定义类中调用其他类的控件指针及其变量

qq_29720391 2017-10-18 10:56:22
创建一个单文档程序,创建了一个对话框类CLogin 在主框架CFrame运行前运行当作一个登陆对话框窗口, 并对主框架CFrame进行分割窗口,分成三个视图类 CRightView,CTopView,CLeftView, 现在要在自定义类myRD中调用 CLogin、CRightView、CTopView、CLeftView中的一些控件及其变量,应该如何操作取其指针并获得其变量(如编辑框中输入的数据),求给出具体的操作过程和代码 谢谢!
...全文
451 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
"生成的对话框CLogin类" 后 1。myRD中 通过 findwindow 找到这个对话框 2. 声明一个CLogin的全局指针类 CLogin *g_loginDlg
直接引用FindWindow(CLogin,NULL) 就能找到这个对话框? 然后引用生成的全局指针g_loginDlg->调用?
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 4 楼 jszj 的回复:
你的CLogin是弹出来的吧? 1. 在myRD文件中添加对4个类的头文件包含,添加对mainframe.h的包含 2. mainframe类添加获取三3个view类的接口,每个接口的代码大致为 return (CTopView*)m_splitter->GetPanel(1,1); 3. 在myRD中: ((CMainFrame*)theApp.m_pMainFrame)->GetTopView()-> 这样调用3个view类中的函数 4. CLogin是弹出的窗口,比较方便的方法是声明一个CLogin的全局指针类 CLogin *g_loginDlg = NULL,在CLogin的OnInitDialog中对该变量进行附值 为this,在关闭的函数中附值为NULL 5. 在myRD中通过g_loginDlg-> 的方法来调用CLogin的函数
CLogin类是派生的CDialog 所以没有用初始化函数哦。自己重载一个初始化函数?
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
"生成的对话框CLogin类" 后 1。myRD中 通过 findwindow 找到这个对话框 2. 声明一个CLogin的全局指针类 CLogin *g_loginDlg
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
在MainFrame 中 定义: CRightView* CMainFrame::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); CRightView* pView = DYNAMIC_DOWNCAST(CRightView, pWnd); return pView; } //// CLeftView* CMainFrame::GetLeftPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 0); CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView,pWnd); return pView; } 使用: CMainFrame *pMain=(CMainFrame*)AfxGetMainWnd(); CRightView *pRight=pMain->GetRightPane();
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
在MainFrame 中 定义: CRightView* CMainFrame::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); CRightView* pView = DYNAMIC_DOWNCAST(CRightView, pWnd); return pView; } //// CLeftView* CMainFrame::GetLeftPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 0); CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView,pWnd); return pView; } 使用: CMainFrame *pMain=(CMainFrame*)AfxGetMainWnd(); CRightView *pRight=pMain->GetRightPane();
谢谢,利用这个方法确实能在不同视图间调用互相的控件, 不过请问下对话框的控件如何调用呢? 我是在CFrame主框架生成之前生成的对话框CLogin类,相当于一个登陆对话框
red-fly 2017-10-18
  • 打赏
  • 举报
回复
你的CLogin是弹出来的吧? 1. 在myRD文件中添加对4个类的头文件包含,添加对mainframe.h的包含 2. mainframe类添加获取三3个view类的接口,每个接口的代码大致为 return (CTopView*)m_splitter->GetPanel(1,1); 3. 在myRD中: ((CMainFrame*)theApp.m_pMainFrame)->GetTopView()-> 这样调用3个view类中的函数 4. CLogin是弹出的窗口,比较方便的方法是声明一个CLogin的全局指针类 CLogin *g_loginDlg = NULL,在CLogin的OnInitDialog中对该变量进行附值 为this,在关闭的函数中附值为NULL 5. 在myRD中通过g_loginDlg-> 的方法来调用CLogin的函数
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
"现在要在自定义类myRD中调用 CLogin、CRightView、CTopView、CLeftView中的一些控件及其变量" 必须通过 CLogin、CRightView、CTopView、CLeftView 类的实例 来 调用 (非静态成员)
能否写出代码给出一个具体例子呢?谢谢了
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
"现在要在自定义类myRD中调用 CLogin、CRightView、CTopView、CLeftView中的一些控件及其变量" 必须通过 CLogin、CRightView、CTopView、CLeftView 类的实例 来 调用 (非静态成员)
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
谢谢 解决了, 用生成的全局指针调用对话框的控件
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:
pWndDlg=FindWindow("#32770","对话框"); 就可以 其实 是 pWndDlg=CWnd::FromHamdle(FindWindow("#32770","对话框"));
好像必须得是HWnd句柄,否则就会出现AccessViolationException异常,可能和我托管的类有关
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
pWndDlg=FindWindow("#32770","对话框"); 就可以 其实 是 pWndDlg=CWnd::FromHamdle(FindWindow("#32770","对话框"));
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
例子: void CTestDlg::OnFind() { float sNum; // TODO: Add your control notification handler code here pWndDlg=FindWindow("#32770","对话框"); if(pWndDlg==0) { AfxMessageBox("对话框没找到!"); return; } pWndEdit1000=pWndDlg->GetDlgItem(0x03E8);// Edit ID 0x003E8 char txt[40]; pWndEdit1000->SendMessage(WM_COPY,0,0);// COPY 数据到剪贴板 GetCBtext(txt);//剪贴板上的数据赋值给 txt[40], // 下面送入新的值 sNum= m_Edit; //C++程序界面 EDIT 输入(第一个输入框) sNum=sNum * xNum[0][m_iCount]; // 乘上系数, 1.0 --0.1 共10个系数,每按一次"寻找窗口" 按钮,系数改变一次 pWndEdit1000->SendMessage(WM_SETFOCUS,0,0);//输入框得到焦点 pWndEdit1000->SendMessage(EM_SETSEL,0,-1); // 选中输入框 // sNum=1111.22f; char text[40]; sprintf(text,"%7.2f",sNum);// 浮点数据变成字符 SetCBtext(text);// 送到剪贴板 pWndEdit1000->SendMessage(WM_PASTE,0,0);//PASTE 到 其他.exe 程序界面的输入框 // 新值已送入到 其他.exe 程序界面的输入框 m_iCount++; // " 寻找窗口"一次,计数增1,最多10 次. if (m_iCount>9) m_iCount=0; }
FIndWindow() 是Hwnd句柄吧? 我用cwnd窗口类转换不了吧?
red-fly 2017-10-18
  • 打赏
  • 举报
回复
引用 7 楼 qq_29720391 的回复:
[quote=引用 4 楼 jszj 的回复:] 你的CLogin是弹出来的吧? 1. 在myRD文件中添加对4个类的头文件包含,添加对mainframe.h的包含 2. mainframe类添加获取三3个view类的接口,每个接口的代码大致为 return (CTopView*)m_splitter->GetPanel(1,1); 3. 在myRD中: ((CMainFrame*)theApp.m_pMainFrame)->GetTopView()-> 这样调用3个view类中的函数 4. CLogin是弹出的窗口,比较方便的方法是声明一个CLogin的全局指针类 CLogin *g_loginDlg = NULL,在CLogin的OnInitDialog中对该变量进行附值 为this,在关闭的函数中附值为NULL 5. 在myRD中通过g_loginDlg-> 的方法来调用CLogin的函数
CLogin类是派生的CDialog 所以没有用初始化函数哦。自己重载一个初始化函数?[/quote] 是的,用向导很容易就生成了重载函数。如果你的CLogin是用的时候才创建,用完就删除了,那不重载而是直接放到它的构造函数里对g_loginDlg附值为this也行
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
变量 CWnd *pWndEdit1000; CWnd *pWndDlg;
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
例子: void CTestDlg::OnFind() { float sNum; // TODO: Add your control notification handler code here pWndDlg=FindWindow("#32770","对话框"); if(pWndDlg==0) { AfxMessageBox("对话框没找到!"); return; } pWndEdit1000=pWndDlg->GetDlgItem(0x03E8);// Edit ID 0x003E8 char txt[40]; pWndEdit1000->SendMessage(WM_COPY,0,0);// COPY 数据到剪贴板 GetCBtext(txt);//剪贴板上的数据赋值给 txt[40], // 下面送入新的值 sNum= m_Edit; //C++程序界面 EDIT 输入(第一个输入框) sNum=sNum * xNum[0][m_iCount]; // 乘上系数, 1.0 --0.1 共10个系数,每按一次"寻找窗口" 按钮,系数改变一次 pWndEdit1000->SendMessage(WM_SETFOCUS,0,0);//输入框得到焦点 pWndEdit1000->SendMessage(EM_SETSEL,0,-1); // 选中输入框 // sNum=1111.22f; char text[40]; sprintf(text,"%7.2f",sNum);// 浮点数据变成字符 SetCBtext(text);// 送到剪贴板 pWndEdit1000->SendMessage(WM_PASTE,0,0);//PASTE 到 其他.exe 程序界面的输入框 // 新值已送入到 其他.exe 程序界面的输入框 m_iCount++; // " 寻找窗口"一次,计数增1,最多10 次. if (m_iCount>9) m_iCount=0; }
qq_29720391 2017-10-18
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
if(FindWindow("#32770","CLogin")) 对话框类名 ("#32770", 标题 是 对话框的标题
调用自己声明的全局变量需要实例化或者初始化? 不然无法解析。 麻烦你能给出具体的调用对话框的代码嘛?
schlafenhamster 2017-10-18
  • 打赏
  • 举报
回复
if(FindWindow("#32770","CLogin")) 对话框类名 ("#32770", 标题 是 对话框的标题

16,471

社区成员

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

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

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