用CSplitterWnd动态分割窗口的时候,如何开始不需要拖动分割条,按左键显示分割条

bjliuqi 2008-12-16 11:06:08
用VC6 wizard创建的分割窗口的工程, 点一下 窗口中的分隔,需要移动鼠标,按左键才能显示分割条,现在我的问题是我想开始就像静态分割那样,点击一下分隔 就能立即出现分隔条,例如可以让他显示在窗口的中央。 谢谢。
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
toadzw 2008-12-17
  • 打赏
  • 举报
回复
这个试试。
1)建立个CSplitterWnd的派生类CMySptWnd。
class CMySptWnd : public CSplitterWnd
并定一个成员变量bool m_bIs;,
初始化为false

2)分割成上下两个窗口。

C/C++ code
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if(m_wndSplitter.CreateStatic(this,2,1)==NULL) //CMySptWnd m_wndSplitter;
return FALSE;

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView11View),CSize(0,0), pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CView11View),CSize(100,100),pContext);






3)定义函数:

C/C++ code
void CMySptWnd::SetSpl(CPoint pt)
{
enum HitTestValue
{
noHit = 0,
vSplitterBox = 1,
hSplitterBox = 2,
bothSplitterBox = 3, // just for keyboard
vSplitterBar1 = 101,
vSplitterBar15 = 115,
hSplitterBar1 = 201,
hSplitterBar15 = 215,
splitterIntersection1 = 301,
splitterIntersection225 = 525
};
if (m_bTracking)
{
// move tracker to current cursor position

pt.Offset(m_ptTrackOffset); // pt is the upper right of hit detect
// limit the point to the valid split range
if (pt.y < m_rectLimit.top)
pt.y = m_rectLimit.top;
else if (pt.y > m_rectLimit.bottom)
pt.y = m_rectLimit.bottom;
if (pt.x < m_rectLimit.left)
pt.x = m_rectLimit.left;
else if (pt.x > m_rectLimit.right)
pt.x = m_rectLimit.right;

if (m_htTrack == vSplitterBox ||
m_htTrack >= vSplitterBar1 && m_htTrack <= vSplitterBar15)
{
if (m_rectTracker.top != pt.y)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(0, pt.y - m_rectTracker.top);
OnInvertTracker(m_rectTracker);
}
}
else if (m_htTrack == hSplitterBox ||
m_htTrack >= hSplitterBar1 && m_htTrack <= hSplitterBar15)
{
if (m_rectTracker.left != pt.x)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(pt.x - m_rectTracker.left, 0);
OnInvertTracker(m_rectTracker);
}
}
else if (m_htTrack == bothSplitterBox ||
(m_htTrack >= splitterIntersection1 &&
m_htTrack <= splitterIntersection225))
{
if (m_rectTracker.top != pt.y)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(0, pt.y - m_rectTracker.top);
OnInvertTracker(m_rectTracker);
}
if (m_rectTracker2.left != pt.x)
{
OnInvertTracker(m_rectTracker2);
m_rectTracker2.OffsetRect(pt.x - m_rectTracker2.left, 0);
OnInvertTracker(m_rectTracker2);
}
}
}
else
{
// simply hit-test and set appropriate cursor

int ht = HitTest(pt);
SetSplitCursor(ht);
}
}



4)重载OnLButtonUp函数

C/C++ code
void CMySptWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect rc;
GetWindowRect(&rc);
if(point.x>rc.left && point.x<rc.right)//判断鼠标是否点在分割条上
{

if(m_bIs==false)
{
SetSpl(CPoint(0,(rc.bottom-rc.top)/2));
m_bIs = !m_bIs;
}
else
{
SetSpl(CPoint(0,0));
m_bIs = !m_bIs;
}
}

CSplitterWnd::OnLButtonUp(nFlags, point);
}


hityct1 2008-12-17
  • 打赏
  • 举报
回复
这个试试。
1)建立个CSplitterWnd的派生类CMySptWnd。
class CMySptWnd : public CSplitterWnd
并定一个成员变量bool m_bIs;,
初始化为false

2)分割成上下两个窗口。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if(m_wndSplitter.CreateStatic(this,2,1)==NULL) //CMySptWnd m_wndSplitter;
return FALSE;

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView11View),CSize(0,0), pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CView11View),CSize(100,100),pContext);




3)定义函数:

void CMySptWnd::SetSpl(CPoint pt)
{
enum HitTestValue
{
noHit = 0,
vSplitterBox = 1,
hSplitterBox = 2,
bothSplitterBox = 3, // just for keyboard
vSplitterBar1 = 101,
vSplitterBar15 = 115,
hSplitterBar1 = 201,
hSplitterBar15 = 215,
splitterIntersection1 = 301,
splitterIntersection225 = 525
};
if (m_bTracking)
{
// move tracker to current cursor position

pt.Offset(m_ptTrackOffset); // pt is the upper right of hit detect
// limit the point to the valid split range
if (pt.y < m_rectLimit.top)
pt.y = m_rectLimit.top;
else if (pt.y > m_rectLimit.bottom)
pt.y = m_rectLimit.bottom;
if (pt.x < m_rectLimit.left)
pt.x = m_rectLimit.left;
else if (pt.x > m_rectLimit.right)
pt.x = m_rectLimit.right;

if (m_htTrack == vSplitterBox ||
m_htTrack >= vSplitterBar1 && m_htTrack <= vSplitterBar15)
{
if (m_rectTracker.top != pt.y)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(0, pt.y - m_rectTracker.top);
OnInvertTracker(m_rectTracker);
}
}
else if (m_htTrack == hSplitterBox ||
m_htTrack >= hSplitterBar1 && m_htTrack <= hSplitterBar15)
{
if (m_rectTracker.left != pt.x)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(pt.x - m_rectTracker.left, 0);
OnInvertTracker(m_rectTracker);
}
}
else if (m_htTrack == bothSplitterBox ||
(m_htTrack >= splitterIntersection1 &&
m_htTrack <= splitterIntersection225))
{
if (m_rectTracker.top != pt.y)
{
OnInvertTracker(m_rectTracker);
m_rectTracker.OffsetRect(0, pt.y - m_rectTracker.top);
OnInvertTracker(m_rectTracker);
}
if (m_rectTracker2.left != pt.x)
{
OnInvertTracker(m_rectTracker2);
m_rectTracker2.OffsetRect(pt.x - m_rectTracker2.left, 0);
OnInvertTracker(m_rectTracker2);
}
}
}
else
{
// simply hit-test and set appropriate cursor

int ht = HitTest(pt);
SetSplitCursor(ht);
}
}

4)重载OnLButtonUp函数

void CMySptWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect rc;
GetWindowRect(&rc);
if(point.x>rc.left && point.x<rc.right)//判断鼠标是否点在分割条上
{

if(m_bIs==false)
{
SetSpl(CPoint(0,(rc.bottom-rc.top)/2));
m_bIs = !m_bIs;
}
else
{
SetSpl(CPoint(0,0));
m_bIs = !m_bIs;
}
}

CSplitterWnd::OnLButtonUp(nFlags, point);
}
arong1234 2008-12-16
  • 打赏
  • 举报
回复
CSplitterWnd没有此功能,除非你自己做一个出来
星羽 2008-12-16
  • 打赏
  • 举报
回复
点击一下分隔 是什么意思 - -

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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