请教一个关于单文档基于cformview的问题

jizhubeng9895 2017-03-15 05:00:13
就是我在单文档里面,想在file view里,点击某一个节点的时候,对对话框里的控件进行相应的操作,我尝试了下,已经可以确认到我点击了某个节点了,但是比如我SetDlgItemText(IDC_EDIT1,"1"); 却不行。具体代码二楼。
...全文
442 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
这是 分割窗口。 左边 是 treeview(即你的 CfileView) ,右边 是 xxxView。界面像explore。 所以 void CFileView::OnSelChanged(NMHDR *pNmHdr, LRESULT *pResult) 里,置 右边 view里的 edit 就不行了 , 你先要 取得 右窗口 对象: 在 CMainFrame 里加: CxxxView* CMainFrame::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); CxxxView* pView = DYNAMIC_DOWNCAST(CxxxView, pWnd); return pView; } //// CFileView* CMainFrame::GetLeftPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 0); CFileView* pView = DYNAMIC_DOWNCAST(CFiletView,pWnd); return pView; } 这样用(左边窗口 void CFileView::OnSelChanged里:) CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd(); CxxxView* pView=pMain->GetRightPane(); pView->SetDlgItemText(IDC_EDIT1,_T("11111"));
jizhubeng9895 2017-03-17
  • 打赏
  • 举报
回复
引用 30 楼 schlafenhamster 的回复:
那你的 cfileview 是什么 ?

建立工程的时候,可选择生成的文件视图。其实我可以自己添加一个tree ctrl控件实现功能,但是想着自动生成的那个可以自由移动就想着用这个。
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
那你的 cfileview 是什么 ?
jizhubeng9895 2017-03-17
  • 打赏
  • 举报
回复
引用 28 楼 schlafenhamster 的回复:
在 CFileView 的 OnInitialUpdate()中: SetDlgItemText(IDC_EDIT1,_T("11111")); == this->SetDlgItemText(IDC_EDIT1,_T("11111")); this 就是 CFileView
等下。我被搞懵了。cfileview里没有OnInitialUpdate呀。 OnInitialUpdate在xxxview.cpp里
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
在 CFileView 的 OnInitialUpdate()中: SetDlgItemText(IDC_EDIT1,_T("11111")); == this->SetDlgItemText(IDC_EDIT1,_T("11111")); this 就是 CFileView
jizhubeng9895 2017-03-17
  • 打赏
  • 举报
回复
引用 26 楼 schlafenhamster 的回复:
把 eidt 部分的 代码 传上来!
edit部分是指。。哪部分 起作用的不就是二楼的那些代码吗。其他还要哪部分
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
把 eidt 部分的 代码 传上来!
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
class CFileView : public CFormView class CFormView : public CScrollView class CScrollView : public CView class CView : public CWnd
jizhubeng9895 2017-03-17
  • 打赏
  • 举报
回复
引用 21 楼 tajon1226 的回复:
cwnd->SetDlgItemText() 实际上相当于 sdk SetDlgItemText(hwnd, ) 所以,你要操作某个Edit,你要先找到该控件对应的父窗口类对象 这里你的edit是属于CFormView,CFormView也是继承CWnd的,所以你要找到它的指针, pView->SetDlgItemText就对了 没有什么Dialog的,你可以大略去看下MFC源码和了解下win32编程,就不会犯这种常识错误了。
你说得挺对的。这个edit应该是属于cformview的,但是我获取不了他的指针?我看了好多方法,你说的这个是在创建窗口初始化的时候就获取他的指针保存起来是吧?我前面用的是用findwindow然后通过那个对话框的标题?(那个好像的确是个对话框啊,虽然edit是属于cformview)获取对话框的句柄,然后setdlgitemtext,这个明明只要有控件所在对话框的句柄,有对话框id,就可以显示啊,但是为啥在fileview里就运行不成功?因为不同类吗?还是啥原因,搞不懂啊。QAQ
jizhubeng9895 2017-03-17
  • 打赏
  • 举报
回复
引用 21 楼 tajon1226 的回复:
cwnd->SetDlgItemText() 实际上相当于 sdk SetDlgItemText(hwnd, ) 所以,你要操作某个Edit,你要先找到该控件对应的父窗口类对象 这里你的edit是属于CFormView,CFormView也是继承CWnd的,所以你要找到它的指针, pView->SetDlgItemText就对了 没有什么Dialog的,你可以大略去看下MFC源码和了解下win32编程,就不会犯这种常识错误了。
我用了你的第二个方法尝试了下,第三步 CFileView.cpp 中 #include "FormView.h 我发现我这里没有你说的formview.h啊,是那个xxxview.h吗,xxx是我的工程名。我尝试了一下在fileview.cpp里引用了xxxview.h,结果报错了。 public: CSingelText6Doc* GetDocument() const; 在这句话报错
xiaohuh421 2017-03-17
  • 打赏
  • 举报
回复
把你的代码贴出来吧, 光这样大家都在猜, 帮不了你太多.
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
cwnd->SetDlgItemText() 实际上相当于 sdk SetDlgItemText(hwnd, ) 所以,你要操作某个Edit,你要先找到该控件对应的父窗口类对象 这里你的edit是属于CFormView,CFormView也是继承CWnd的,所以你要找到它的指针, pView->SetDlgItemText就对了 没有什么Dialog的,你可以大略去看下MFC源码和了解下win32编程,就不会犯这种常识错误了。
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
第二种办法,全局变量 h文件中 formview.h extern CMyFormView *g_pMyFormView; formview.cpp CMyFormView *g_pMyFormView = NULL; OnInitialUpdate { g_pMyFormView = this; } CFileView.cpp 中 #include "FormView.h " xxFunction { g_pMyFormView ->SetDlgItemText }
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
感觉楼主没有理解C++啊,隐含的this指针要理解!!!1 CFileView::XXFunction() { SetDlgItem相当于 this->SetDlgItem } 而你的Edit控件是放在CFormView上的,这样怎么行呢。 下面单词有可能拼错,思路差不多,如果打错了你自己百度。 第一步你要获取你的View指针, CMyFormView *pView = (CMyFormView *)AfxGetMainFrame()->GetActivityView(); pView ->SetDlgItemText(); /
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
例子

// notepad.c
#include<windows.h>
#include<stdio.h>
#include<process.h>


BOOL CALLBACK EnumChildProc(HWND wnd, LPARAM lParam)
{
static int i=0;
	char WindowName[52]={0};
	GetWindowText(wnd,WindowName,sizeof(WindowName));
	printf("HWND: %d;name: %s\n",wnd,WindowName);
// if name="替换(&R)" class 按钮	
	if (i==7)
	{
		SendMessage(wnd,WM_SETTEXT,0,(LPARAM)"Demo");
		return 0;
	} 
	i++;
	return 1;
}

int main(int argc, char* argv[])
{
	HWND wnd=FindWindowEx(NULL,NULL,NULL,"替换");
	if (wnd != NULL)
	{
		EnumChildWindows(wnd,EnumChildProc,0);
	}
	system("pause");
	return 0;
}
schlafenhamster 2017-03-17
  • 打赏
  • 举报
回复
如果使用 findwindow 必须 一个一个找到 类 名为 “edit” ID为 IDC_EDIT1 的控件。
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
引用 24 楼 jizhubeng9895 的回复:
[quote=引用 21 楼 tajon1226 的回复:] cwnd->SetDlgItemText() 实际上相当于 sdk SetDlgItemText(hwnd, ) 所以,你要操作某个Edit,你要先找到该控件对应的父窗口类对象 这里你的edit是属于CFormView,CFormView也是继承CWnd的,所以你要找到它的指针, pView->SetDlgItemText就对了 没有什么Dialog的,你可以大略去看下MFC源码和了解下win32编程,就不会犯这种常识错误了。
你说得挺对的。这个edit应该是属于cformview的,但是我获取不了他的指针?我看了好多方法,你说的这个是在创建窗口初始化的时候就获取他的指针保存起来是吧?我前面用的是用findwindow然后通过那个对话框的标题?(那个好像的确是个对话框啊,虽然edit是属于cformview)获取对话框的句柄,然后setdlgitemtext,这个明明只要有控件所在对话框的句柄,有对话框id,就可以显示啊,但是为啥在fileview里就运行不成功?因为不同类吗?还是啥原因,搞不懂啊。QAQ[/quote] CFileView是继承CPannel的,是一个独立的子窗口。 CxxView是继承CFormView,也一个独立的子窗口。 CMFCToolbar也是一个独立的子窗口 状态栏也是一个独立的子窗口 菜单栏也是一个独立的子窗口 CMainFrame是继承CFrame,是上面它们的父窗口,相当于一个容器, 分别按条理地规范地放着上面的子窗口。 你在CFileView这个子窗口对象里 去操作CxxView另外一个子窗口的对象控件? 这。。。。 findwindow你是找不到CxxView的标题了。。。。 单文档的标题是在CMainFrame上显示的。
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
在你的 fileview.cpp 中不include"xxview.h"也是可以的。 你只要得到view指针就可以了,cview是继承于cwnd,这个指针信息已经包含了hwnd句柄 可以直接调 pview->SetDlgItemText就好了, 例外:但是如果你在 xxxView.h中定义了新的函数,上面的做法是调不了的。
走好每一步 2017-03-17
  • 打赏
  • 举报
回复
引用 23 楼 jizhubeng9895 的回复:
[quote=引用 21 楼 tajon1226 的回复:] cwnd->SetDlgItemText() 实际上相当于 sdk SetDlgItemText(hwnd, ) 所以,你要操作某个Edit,你要先找到该控件对应的父窗口类对象 这里你的edit是属于CFormView,CFormView也是继承CWnd的,所以你要找到它的指针, pView->SetDlgItemText就对了 没有什么Dialog的,你可以大略去看下MFC源码和了解下win32编程,就不会犯这种常识错误了。
我用了你的第二个方法尝试了下,第三步 CFileView.cpp 中 #include "FormView.h 我发现我这里没有你说的formview.h啊,是那个xxxview.h吗,xxx是我的工程名。我尝试了一下在fileview.cpp里引用了xxxview.h,结果报错了。 public: CSingelText6Doc* GetDocument() const; 在这句话报错[/quote] 我只是给个思路,你不要一根筋.. xxx工程名,就是xxxview.h。 在这句话报错,错误你可以贴出来,说一半大家也猜不到是什么错误。
xiaohuh421 2017-03-16
  • 打赏
  • 举报
回复
因为你这个编辑框对象, 肯定是不属于CFileView类的, 你说的它在某个对话框中. 假设你的对话框类对象有一个指针. pDlg 那么你就可以这样写 pDlg->SetDlgItemText(IDC_EDIT1,_T("1"));
加载更多回复(17)

16,472

社区成员

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

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

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