拆分窗口,如何固定一个子窗口的大小?

cnss 2005-03-19 01:00:57
------------------------------|
| | |
| | B |
| | |
| A | |
| |-----------------|
| | C |
| | |
------------------------------|

一个SDI程序,我静态拆分成ABC三个子窗口.问题是:
其中B为一个FormView,我想让B子窗口的大小固定为该FormView的大小.A和C的大小根据总窗口的大小和B的固定大小自动调整,拆分线不可拖动.
请问怎样实现呢?
...全文
543 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnss 2005-03-22
  • 打赏
  • 举报
回复
是啊,但我想得到设计时的FormView大小

现在的办法感觉就是凑合
BigFanOfCpp 2005-03-22
  • 打赏
  • 举报
回复
既然分隔条已经固定了,FormView的大小就不会变了.
swimmingfish2004 2005-03-22
  • 打赏
  • 举报
回复
MARK
cnss 2005-03-21
  • 打赏
  • 举报
回复
不可拖动的CSplitterWnd早就实现了,现在就是想得到FormView的原始大小
zhucde 2005-03-21
  • 打赏
  • 举报
回复
重载CSplitterWnd

对其中可以拖动的地方进行修改.

你看一下CSplitterWnd类的代码就知道了,有多种方法.
cnss 2005-03-21
  • 打赏
  • 举报
回复
注释部分是拷过来的,不必参考
cnss 2005-03-21
  • 打赏
  • 举报
回复
这两个函数得到的是调用时的宽度和高度,我要得到的是设计时的宽度和宽度
我现在是用的固定值,手工试出来的,如下:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);

//必须有此步!实现稳健性检查,因为在主窗口创建时将首先触发消息wm_size
//而此时的分割窗口还没有创建完成,从而将引发异常!
HWND hWnd1 = m_wndSplitter1.GetSafeHwnd();
HWND hWnd2 = m_wndSplitter2.GetSafeHwnd();
if( hWnd1==NULL || !IsWindow(hWnd1) || hWnd2==NULL || !IsWindow(hWnd2) )
return;

//计算理想的分割窗口的大小!
CRect ClientRect;
GetClientRect(&ClientRect);
CSize size = ClientRect.Size();

//改变第一个分割窗口(固定大小窗口)第一列的大小,
//第二列不需要设置大小
m_wndSplitter1.SetColumnInfo(0, size.cx-300, size.cx-300);
m_wndSplitter2.SetRowInfo(0, 248, 248);

//重新计算窗口布局
m_wndSplitter1.RecalcLayout();
m_wndSplitter2.RecalcLayout();

// TODO: Add your message handler code here
}

我需要的是用什么函数来计算300和248两个数值
TianChong 2005-03-21
  • 打赏
  • 举报
回复
怎么会不行呢?请说清楚点.
cnss 2005-03-20
  • 打赏
  • 举报
回复
顶,现在的问题是怎样得到B在设计时的大小,并且根据当时程序总窗口的大小和拆分条宽度计算拆分条的位置.
cnss 2005-03-20
  • 打赏
  • 举报
回复
这两个函数不行啊
xuzheng318 2005-03-20
  • 打赏
  • 举报
回复
CSplitterWnd::GetRowInfo ,GetColumnInfo
I_Love_CPP 2005-03-20
  • 打赏
  • 举报
回复
顶,现在的问题是怎样得到B在设计时的大小,并且根据当时程序总窗口的大小和拆分条宽度计算拆分条的位置.
----------------------------------------------
CSplitterWnd::GetRowInfo ,GetColumnInfo
cnss 2005-03-19
  • 打赏
  • 举报
回复
这些到处都可以搜到,已经实现了,关键是不知道怎样通过FormView的大小调置B窗口的大小.
Kudeet 2005-03-19
  • 打赏
  • 举报
回复
不能使用原有的CSplitterWnd来定义m_wndSplitter对象,

而是要从CSplitterWnd类派生一个自己的切分类——CMySplitterWnd

然后用这个CMySplitterWnd类在MainFrm.h中定义m_wndSplitter对象。

接着,添加自己派生类的这样两个消息函数
void CMySplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
//CSplitterWnd::OnLButtonDown(nFlags, point);//把原有的这行注释掉
//也就是说让这个函数什么也不做。
}

void CMySplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{
//CSplitterWnd::OnMouseMove(nFlags, point);//注释掉
}

这样方可实现固定位置。

原来直接用CSplitterWnd来定义m_wndSplitter对象,就无法从载
上面两个消息函数,并让其正确相应(这是原因所在)。


================================================
//CMySplitter.h
#pragma once
#include "stdafx.h"

class CMySplitter : public CSplitterWnd
{
DECLARE_DYNCREATE(CMySplitter)

protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);

DECLARE_MESSAGE_MAP()
};
================================================
//CMySplitter.cpp

#include "CMySplitter.h"

IMPLEMENT_DYNCREATE(CMySplitter, CSplitterWnd)

BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
// 直接返回
return;
}

BOOL CMySplitter::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// 当光标进入分割窗口时,不允许改变样子
return FALSE;
}

void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
//跳过调用CSplitterWnd::OnMouseMove,因为他会引起光标的改变
CWnd::OnMouseMove(nFlags, point);
}

cnss 2005-03-19
  • 打赏
  • 举报
回复
up

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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