如题:
m_View.Create(LPCTSTR("CCrystalReportViewer9"),LPCTSTR("asdf..."),WS_VSCROLL | WS_HSCROLL | WS_CHILD | WS_VISIBLE ,rect ,this,NULL); 
第4个参数用来设定水晶报表在文档视图中显示的大小。但是没有办法对大小进行调整,当我将整个软件的窗口双击成最大化后,水晶报表显示的区域还是刚开始创建的那么大,
希望可以随着外面大小的调整而改变。

解决方案 »

  1.   

    响应视图类的OnSize消息,调用控件的Movewindow函数。
      

  2.   

    响应WM_SIZE消息,然后可以用MoveWindow等来动态调整大小..
      

  3.   

    void MoveWindow(int x, int y, int nWidth, int nHeight,
    BOOL bRepaint = TRUE);
    我的水晶报表是从这里得到的:
    CRect rect; 
    GetClientRect(&rect); 
    那么这里面void MoveWindow(int x, int y, int nWidth, int nHeight,
    BOOL bRepaint = TRUE);
    参数要怎样设置呢??
      

  4.   

    函数原型:BOOL MoveWindow(HWND hWnd,int x.int y,int nWidth,int nHeight,BOOL BRePaint);参数:hWnd:窗口句柄。x:指定窗口的新位置的左边界。Y:指定窗口的新位置的顶部边界。nWidth:指定窗口的新的宽度。nHaight:指定窗口的新的高度。bRepaint:确定窗口是否被刷新。如果该参数为TRUE,窗口接收一个WM_PAINT消息;如果参数为FALSE,不发生任何刷新动作。它适用于客户区,非客户区(包括标题栏和滚动条),及由于移动子窗口而露出的父窗口的区域。如果参数为FALSE,应用程序就必须明确地使窗口无效或重画该窗口和需要刷新的父窗口。返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。备注:如果bRepaint为TRUE,系统在窗口移动后立即给窗口过程发送WM_PAINT消息(即由MoveWindow函数调用UPdateWindow函数)。如果bRepaint 为FALSE,系统将WM_PAINT消息放在该窗口的消息队列中。消息循环只有在派遣完消息队列中的其他消息时才派遣WM_PAINT消息。
      

  5.   


    我的vc里只提供了两种:
    void MoveWindow(int x, int y, int nWidth, int nHeight,
    BOOL bRepaint = TRUE);
    void MoveWindow(LPCRECT lpRect, BOOL bRepaint = TRUE);
    帮助文件里是这么写的:
    BOOL MoveWindow(
       int x,
       int y,
       int nWidth,
       int nHeight,
       BOOL bRepaint = TRUE 
    ) throw();
    BOOL MoveWindow(
       LPCRECT lpRect,
       BOOL bRepaint = TRUE 
    ) throw();
    为什么?我不能输入窗体句柄为什么?
      

  6.   

    我找到了,句柄那个在里面那一层,但是我不能直接调用啊。而且我是在CAppView::OnDraw
    里面调用这个函数,句柄要怎样的出来呢??
      

  7.   

    你的控件没有对象变量么?m_View是什么?就用m_View.MoveWindow这样调用,不要在OnDraw中调用。
      

  8.   

    我是在文档视图模式下,就是menu下,不是在dialog下,所以没有控件。
      

  9.   

    ……晕,没有控件,你这个m_View是什么?
      

  10.   

    我直接调用的MoveWindow
    没有用m_View啊。刚才我说了,不是在dialog下,所以就没有控件水晶报表是加在文档模式下,放在了OnDraw里面了
    void CMyAppView::OnDraw(CDC* pDC/*pDC*/)
    {
    CRect rect; 
    GetClientRect(&rect); 
    m_View.Create(LPCTSTR("CCrystalReportViewer9"),LPCTSTR("asdf..."),WS_VSCROLL | WS_HSCROLL | WS_CHILD | WS_VISIBLE ,rect ,this,NULL); //这里创建了水晶报表的视图窗口,也设置了大小
    m_Application.CreateInstance (__uuidof(Application)); 

    这里是对水晶报表的设置
    …}但是这样做的时候,就没有办法让水晶报表的显示区域随着文档菜单的大小而改变了。于是就找大家的方法,加了MoveWindow,可以在走OnDraw的时候走这个函数,调整大小:
    MoveWindow( 0,0,( rect.right - rect.left ),( rect.bottom - rect.top ),TRUE);但加了这个明显不对。
    哎。大侠多看看这贴子啊,都快下班了。
      

  11.   

    更乱了,都说了不要在OnDraw中MoveWindow,你还有Create,程序不死么?我只问你,这个m_View是什么?还有m_Application,够乱的。
      

  12.   

    OnDraw里Create没死,因为只让Create走了一次。
    “响应视图类的OnSize消息,调用控件的Movewindow函数。”
    是这个吗?怎样响应视图类的OnSize消息??
      

  13.   

    主要是BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间加什么?
    h文件中怎么声明?
    cpp文件中怎样定义?
    我现在是这样做的响应:
    cpp中
    BEGIN_MESSAGE_MAP(CMy0View, CView)
    ……
    ON_COMMAND(OnSize ,cview)
    END_MESSAGE_MAP()void CMy0View::OnSize(UINT nType, int cx, int cy)
    {
    CMy0View My0View;    CWnd::OnSize(nType, cx, cy);    // Resize tree control to fill the whole view.    CMy0View.MoveWindow(0, 0, cx, cy, TRUE);}
    h文件中饭添加:
    afx_msg void OnSize(UINT nType, int cx, int cy);
    但是这样编译不过去的。
    不太会写这个啊error C2440: “类型转换”: 无法从“void (__thiscall CMy0View::* )(UINT,int,int)”转换为“WORD”
    error C2440: “类型转换”: 无法从“void (__thiscall CMy0View::* )(UINT,int,int)”转换为“WORD”
    error C2552: “AFX_MSGMAP_ENTRY::nID”: 不能用初始值设定项列表初始化非聚合
    error C2078: 初始值设定项太多
    error C2065: “cview”: 未声明的标识符
      

  14.   

    终于好啦,谢谢大家! 
    我是这样做的: 
    (1)cpp中 : 
    BEGIN_MESSAGE_MAP(CMy0View, CView) 
    …… 
        ON_WM_SIZE() //要加这个响应 
    END_MESSAGE_MAP() 然后定义函数: 
    void CMy0View::OnSize(UINT nType, int cx, int cy) 

    CMy0View My0View; 
    CRect rect; 
    if(RPT_Viewer_flag != 0) 

    GetClientRect(&rect); 
    CWnd::OnSize(nType, cx, cy); // Resize tree control to fill the whole view. m_View.MoveWindow(0, 0, (rect.right-rect.left), (rect.bottom - rect.top), TRUE);//这个是水晶报表的CCrystalReportViewer9 m_View;之前在h文件中定义的         } 
    } (2)h文件中声明 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    结贴了!