Scrollbar为什么出不来?共150分!!

Cuteric 2002-08-02 11:14:14
本来是想创建一个比Frame大的可以Scroll的视图,但如果不是在MainFrame而是在自己创建的一个FrameWnd中调用就会出问题。如何是好?

代码:
void CMainFrame::OnTest()
{ CTestWnd* pTest = new CTestWnd;
pTest->Create(NULL,NULL);
pTest->ShowWindow(SW_SHOWNORMAL); }
.....
class CTestView:CScrollView;
...
CTestView m_TestView;
...
int CTestWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_TestView.Create(NULL,NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 1, 1), this, AFX_IDW_PANE_FIRST, NULL))
return -1;
return 0; }
......
void CTestView::OnInitialUpdate()
{ CScrollView::OnInitialUpdate();
SetScrollSizes(MM_TEXT, CSize(2000,2000)); }

可是好像没什么用,滚动条还是出不来。为何???

如果是在MainFrame的OnCreate中直接创建一个CScrollView,如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (!m_TestView.Create(NULL,NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 1, 1), this, AFX_IDW_PANE_FIRST, NULL))
return -1;
return 0; }(其它不变)

就是可以的。
经我调试,第一种方式根本没调用CTestView的OnInitialUpdate.

高手一定帮忙,周一要交差,又要加班了 :(
剩余的分在http://www.csdn.net/expert/topic/919/919723.xml?temp=.6657373
如果不够,还可再加。
...全文
92 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ThisTimeThree 2002-08-05
  • 打赏
  • 举报
回复
这是说你可以用Create,CreateEx或LoadFrame创建窗口(只CFrameWnd类), pContext 是CCreateContext类指针,其成员变量指定相关连的文档,视图和Frame等, 这个参数可以是NULL,我不知道你是否在CWinApp::OnInitialUpdate()中添加了一个CDocTemplate对象,如果这个对象的View类不是CTestView就不行,如果是就可以。如果你有两个以上CDocTemplate对象,第一个的Doc,View和资源不是所须的,估计(确切讲是猜测,你自己可试一下)pContext是NULL就不一定能行。(估计LoadFrame根据参数确定用哪个CDocTemplate对象,不认为他能自己创建一个吧。[当然这也可能])
romanticist 2002-08-03
  • 打赏
  • 举报
回复
CScrollbar m_Scrollbar;
m_Scrollbar.Create(.....)

Cuteric 2002-08-03
  • 打赏
  • 举报
回复
各位老大帮帮忙
GoogleGeek 2002-08-03
  • 打赏
  • 举报
回复
to:搂住:
让我再仔细的想一想!
Cuteric 2002-08-03
  • 打赏
  • 举报
回复
各位:

问题我已经解决,但我不知道为什么。

我原来在CMainFrame::OnTest()不是这样写的么:
void CMainFrame::OnTest()
{ CTestWnd* pTest = new CTestWnd;
pTest->Create(NULL,NULL);
pTest->ShowWindow(SW_SHOWNORMAL); }

结果我不用pTest->Create(NULL,NULL)
改用pTest->LoadFrame(NULL,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,NULL);
就可以实现在CTestWnd下对CTestView进行滚动了,为什么呢?

我看MSDN中有这样两句:
The framework calls LoadFrame when it creates a frame window using a document template object.

The framework uses the pContext argument to specify the objects to be connected to the frame window, including any contained view objects. You can set the pContext argument to NULL when you call LoadFrame.可我不太懂。
Cuteric 2002-08-03
  • 打赏
  • 举报
回复
psusong(我心飞扬):我看了一下《深入浅出》,在283页候说了,第八个参数如果不具备Doc/View结构,就不必指定pContext参数。
我这个例子没有用Doc/View,因为没有使用Doc只是使用了View,难道我在要加上整个D/V的支持么?
Cuteric 2002-08-03
  • 打赏
  • 举报
回复
psusong(我心飞扬):我还没试,待会我试试,如果不行,就得麻烦你将工程发给我了。eric_zhong@msn.com 深入浅出我也有的,怎么就没看到呢?该打该打。
不是我不用doc/view,实在是还没怎么掌握d/v的精髓,您有没有比较好的建议?
GoogleGeek 2002-08-03
  • 打赏
  • 举报
回复
to:搂住
你的创建方法:pTest->Create(NULL,NULL);根本没有涉及到你自己的类:CTestView,你只要看一下《深入浅出》
或者msdn:
CFrameWnd::Create
BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL );
最后一个参数与具体地的视图创建有关!
。本人已经采用迂回的方法将你的功能实现出来了
具体的做法是:
2、添加两个类:
class CTestView : public CScrollView
class CTestWnd : public CMDIChildWnd
//PS.:本人为MDI
1、添加一个自定义的文档模板
先添加资源:IDR_NEWFRAMETYPE
用资源编辑器加入相应的资源定义:
ICON:IDR_NEWFRAMETYPE
MENU:IDR_NEWFRAMETYPE
STRING:
IDR_NEWFRAMETYPE \nNewFrame\nNewframe\n
并且在相应的主框架菜单和主视图菜单中增加相应的用于切换视图的菜单项:
ID_NEW_FRAME New frame with scrollview

class CNewFrameApp : public CWinApp
{
public:
CMultiDocTemplate * m_pMainTemplate;
CMultiDocTemplate * m_pNewTemplate;//用于保存自定义的文档模办
..
}
BOOL CNewFrameApp::InitInstance()
{
...
m_pMainTemplate = new CMultiDocTemplate(
IDR_NEWFRATYPE,
RUNTIME_CLASS(CNewFrameDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CNewFrameView));
AddDocTemplate(m_pMainTemplate);

m_pNewTemplate = new CMultiDocTemplate(
IDR_NEWFRAMETYPE,
RUNTIME_CLASS(CNewFrameDoc),
RUNTIME_CLASS(CTestWnd), // user_defined frame
RUNTIME_CLASS(CTestView));//user_defined view with scrollbar!
AddDocTemplate(m_pNewTemplate);

...
}

void CNewFrameApp::OnFileNew()
{
// TODO: Add your command handler code here
//avoid displaying the new file dialog box!
this->m_pMainTemplate->OpenDocumentFile(NULL);
}
3、
void CMainFrame::OnNewFrame()
{
// TODO: Add your command handler code here
CNewFrameApp *pApp=(CNewFrameApp*)AfxGetApp();
//use user_defined frame and view
pApp->m_pNewTemplate->OpenDocumentFile(NULL);

}

-----------
需要的话可以将我的工程发给你!
我是用了一个下午的时间才解决此问题的,刚开始被你的方法引入了一个误区!
我们为什么不好好的利用doc/view呢?
跳出三届外,不再五行中!
ThisTimeThree 2002-08-03
  • 打赏
  • 举报
回复
也就是CMainWnd的 Create(NU...并不起作用,你看到的是框架生成的视
ThisTimeThree 2002-08-03
  • 打赏
  • 举报
回复
我觉得主要问题不是在楼上所说的.结构错了,CView用的是动态产生,即CreateObject,不明白你的编译怎末通过的, 一般讲应该,建议搞明白CFrameWnd::OnCreateClient那里才是产生View的好地方.建议生成并在CWinApp derived class 中添加一CDocTemplate类,( 自定SDI,还是MDI,以及CDocument,CTestWnd,CMyView)
CDocTempalte *pDocT = AfxGetApp()->GetNextDocTemplate(pos);
pDocT->CreateNewFrame(
);
pDocT->InitialUpdateFrame(pFrame);...
你的CView类根本就没父类建议弄清Doc/View结构.

wuxuan 2002-08-03
  • 打赏
  • 举报
回复
gz
jtls 2002-08-03
  • 打赏
  • 举报
回复
SetScrollSizes(MM_TEXT, CSize(2000,2000)); 这里的值设得太大了,改小点
speakboy 2002-08-02
  • 打赏
  • 举报
回复
先看我的吧!
http://www.csdn.net/expert/topic/918/918603.xml?temp=.2668573

16,471

社区成员

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

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

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