CEditView类难道就如此特殊?

zhdleo 中国地质调查局发展研究中心 技术经理  2002-12-18 11:42:50
对于切分后窗口,都是要指向一个View类--假设为CLeftView,
我发现一个怪怪的问题:
如果这个视图类的基类指向的是一个CEditView类,
那么在这个CLeftView类的OnDraw函数里输出些东西,
比如:一个字符传,就根本不会显示。

可是如果这个视图类CLeftView的基类为CView或是CScrollView的
话,同样输出一个内容,就可以显示!

真的让人很奇怪!
难道CEditView类有什么特殊的地方,我平常并没有注意到?

谁给说说是什么原因?
...全文
126 点赞 收藏 12
写回复
12 条回复
zhdleo 2002年12月18日
不行呀!
编译是通过了,能运行。

但什么都没有显示。

void CMyLeftView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
CEdit& theEdit = this->GetEditCtrl();
theEdit.SetWindowText("!!!!!!!!!");
}

难道不对,?
回复 点赞
GoogleGeek 2002年12月18日
楼主
你怎么老做些分隔视图的程序!----不太符合界面规范的
回复 点赞
zhdleo 2002年12月18日
楼上,谢谢你的 方法!我马上去试试。

能不能这样理解:在这个CEditView创建一个别的类型view 对象,
通过转化使用!
GetEditCtrl()可以在一个CEditView得到CEdit。
那其他的呢?
比如:CSrollView里可就没有什么GetEditCtrl()。
怎么得到CEdit,,有类似GetEditCtrl的函数吗?
---------------------------------------------------

zhaolaoxin() 你说的:
CEditView不需要用到OnDraw()函数,直接针对CEdit控件操作。
怎么理解!我还是有些迷糊!

比如说我打开一个文件,要把内容显示在里面,不用在OnDraw()函数里写东西吗????
回复 点赞
EetyChen 2002年12月18日
看看CEditView的代码你就可以知道,其实在CEditView类中,内容的显示不是在OnDraw中,而是在ReadArchive中用SetHandle之类的函数来解决的
回复 点赞
isdong 2002年12月18日
CEdit& theEdit = GetEditCtrl();
theEdit.SetWindowText(str);
回复 点赞
zhaolaoxin 2002年12月18日
CEditView不需要用到OnDraw()函数,直接针对CEdit控件操作。
回复 点赞
zhdleo 2002年12月18日
如果真是这样的话,

那我就只能去改基类了,

那问题就更来了,因为里面有些只基于CEditView类的函数都不能再用了,
那可怎么是好???
回复 点赞
zhdleo 2002年12月18日
改了半天,就谁这最后的了:
----------------------------------------------------------
LRESULT CHexView::OnFindHexMessage(WPARAM wParam, LPARAM lParam)
{
CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lParam);
ASSERT(pDlg != NULL);

if (pDlg->IsTerminating())
{
pDlg = NULL;
this->bHexFirstSearchTime = TRUE;
}
else if ( pDlg->FindNext() )
{
if(bHexFirstSearchTime == TRUE)
{
CEdit &editCtrl=this->GetEditCtrl();
editCtrl.SetSel(0,0);//将搜寻起点设置在cedit 得开始部分
//由于现在的视图类CHexView的基类是CScrollView,
//上面两句就无法使用了,怎么解决???

//而且下面的FindText()也无法使用了,怎么办?
if(!FindText(pDlg->GetFindString(),TRUE,FALSE)) { this->bHexFirstSearchTime = TRUE;
//OnTextNotFound(pDlg->GetFindString());
MessageBox("FIND Have reached the END,Cann't find it!");
}
else
{
this->bHexFirstSearchTime=FALSE;
}
}
else
{ //下面同理
if(!FindText(pDlg->GetFindString(),TRUE,FALSE)) { this->bHexFirstSearchTime = TRUE;
//OnTextNotFound(pDlg->GetFindString());
MessageBox("FIND Have reached the END,Cann't find it!");
}
else
{
this->bHexFirstSearchTime=FALSE;
}
}
}
return 0;
}

-----------------------------
谁给出个主意呀?
回复 点赞
zhdleo 2002年12月18日
直接用了个:
this 是CSrollView类!
((CEdit*)this)->SetSel(0,0);
不知道。。。。。。
回复 点赞
zhdleo 2002年12月18日
改了半天,有点进展,

现在需要知道一个东西,

就是;
原来基类是CEditView时,查找里面做的一个设置到内容开始的部分
CEdit &editCtrl=this->GetEditCtrl();
editCtrl.SetSel(0,0);
当基类改变,不在是CEditView,而成了CSrollView的话,
就不能用this->GetEditCtrl();,
因为可没有CSrollView::GetEditCtrl().

不知道CSrollView下,有没有和GetEditCtrl功能一样的函数!

知道的可一定要说呀。:)
回复 点赞
GoogleGeek 2002年12月18日
too easy!
---------------------------
对于CEditView,不要再onDraw里画图,没有用的!
直接
pView->SetWindowText(str);
就ok了
-----------------------------------------------

CFrameWnd *pFrame=(CFrameWnd*)AfxGetMainWnd();
CView *pView=pFrame->GetActiveView();

if(pView)
{
pView->GetDocument()->SetModifiedFlag();
pView->SetWindowText(strCommandResult);
CEdit &editCtrl=((CEditView*)pView)->GetEditCtrl();
editCtrl.SetSel(0,0);
int linecount=editCtrl.GetLineCount();
editCtrl.LineScroll(linecount);//滚动视图到行尾
}
回复 点赞
zhdleo 2002年12月18日
我把我的作完了,交给同学完成剩下的打开文件分别到左右视图。

他说我的View的基类不对,有些问题,

我看了,就是我上面 说的,我现在只好找解决办法了。。。。。
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7889

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告