如何重载CSplitterWnd类,实现分割栏上有铵钮的功能?
RT。
最好能提供实现的源码。
我找了,可是在网上没有找到。
问题点数:100、回复次数:52Top
1 楼laiyiling(陌生人[MVP])回复于 2006-04-29 10:55:35 得分 0
参考
http://dev.csdn.net/develop/article/28/28424.shtm
改变大小后就可以随便创建控件了,指定parent windowTop
2 楼lixiaosan(小三)回复于 2006-04-29 11:02:18 得分 0
从CSplitterWnd派生一个类来处理Top
3 楼sycnick(李小虾)回复于 2006-04-29 11:03:19 得分 0
派生,恩Top
4 楼lixiaosan(小三)回复于 2006-04-29 11:06:55 得分 0
http://www.codeproject.com/splitter/toolbar_splitter.aspTop
5 楼lixiaosan(小三)回复于 2006-04-29 11:09:34 得分 0
http://www.codeguru.com/Cpp/W-D/splitter/
Top
6 楼xjl1980_81(什么都不会)回复于 2006-04-29 11:50:06 得分 0
好像没有类似的具体实例?
上面的几个地址没有实现我的意思?
我想要类似于Foxmail那样的效果。Top
7 楼chib(天宇)回复于 2006-04-29 15:26:12 得分 0
同意小三
Top
8 楼xjl1980_81(什么都不会)回复于 2006-04-29 15:44:28 得分 0
小三
所说的
http://www.codeproject.com/splitter/toolbar_splitter.asp
没有DEMO的。
Top
9 楼lypdl()回复于 2006-04-29 15:52:04 得分 0
谁能详细的讲解一下么!!!!!!Top
10 楼lypdl()回复于 2006-04-29 15:59:38 得分 0
我想这里没有能解决的高手拉!!!!!Top
11 楼lypdl()回复于 2006-04-29 16:01:12 得分 0
中国vc++的高手太少拉,悲哀呀,Top
12 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:06:22 得分 0
同样关注此问题
谁回答了可以顺便到这领分
http://community.csdn.net/Expert/topic/4713/4713460.xml?temp=.175213
我知道是派生CSplitterWnd画分隔条。
可是具体怎么搞?
另外不但是有把手。而且要鼠标经过把手时还是鼠标箭头。
在分隔条其他地方才是==Top
13 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:09:03 得分 0
这种东西没必要用CSplitterWnd,直接处理鼠标消息就可以了Top
14 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:17:03 得分 0
总的在分隔条中间有个按钮提示吧!
为什么大家都是侃侃而谈却没一个人给个具体的思路?Top
15 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:21:41 得分 0
BEGIN_MESSAGE_MAP(CChatroomDlg, CDialog)
//{{AFX_MSG_MAP(CChatroomDlg)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()
void CChatroomDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_bInWindow)
{
//鼠标指针从窗口外进入窗口的时候,设定一个离开监控,并且将窗口类的鼠标指针设为空
TRACKMOUSEEVENT TrackEvent;
ZeroMemory(&TrackEvent, sizeof(TRACKMOUSEEVENT));
TrackEvent.cbSize = sizeof (TRACKMOUSEEVENT);
TrackEvent.dwFlags = TME_LEAVE;
TrackEvent.hwndTrack = m_hWnd;
_TrackMouseEvent(&TrackEvent);
m_bInWindow = TRUE;
if (GetClassLong(m_hWnd, GCL_HCURSOR))
SetClassLong(m_hWnd, GCL_HCURSOR, NULL);
}
CDialog::OnMouseMove(nFlags, point);
if (nFlags & MK_LBUTTON)
{
HandleSize(point);
}
else
{
HandleCursor(point);
}
}
void CChatroomDlg::HandleCursor(CPoint point)
{
//中间的工具条
if (PtInRect(&m_BackInfo.rcMid, point))
{
m_eSizeMode = SizeMid;
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));
}
else
{
m_eSizeMode = SizeNULL;
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
}
}
int CChatroomDlg::HandleSize(CPoint point)
{
CPoint ptScreen = point;
ClientToScreen(&ptScreen);
CRect rc, rcWindow;
//根据上一点坐标确定偏移的SIZE
CSize size = ptScreen - m_ptLast;
if (size.cx ==0 && size.cy== 0)
return 0;
rc = m_BackInfo.rc;
int up = m_BackInfo.iUP;
GetWindowRect(rcWindow);
if (m_eSizeMode = SizeMid)
m_BackInfo.iUP += size.cy;
//边界检查
if (rc.Width() < 300 || rc.Height() < 300 || rc.bottom - m_BackInfo.sizeTopLeft.cy - m_BackInfo.iUP - m_BackInfo.sizeMidLeft.cy - m_BackInfo.sizeBottomLeft.cy < 28)
{
m_BackInfo.iUP = up;
return -1;
}
m_ptLast = ptScreen;
ResetCtrlPos();
Invalidate(FALSE);
UpdateWindow();
return 0;
}
LRESULT CChatroomDlg::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
//将窗口类指针设为原来的
SetClassLong(m_hWnd, GCL_HCURSOR, (long)LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
m_bInWindow = FALSE;
return 0;
}Top
16 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:28:21 得分 0
没发现创建分割条按钮:<Top
17 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:33:16 得分 0
晕,对话框资源就可以搞定啊Top
18 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:36:00 得分 0
同样的事情可以有不同的做法,所谓CSplitterWnd实际上就是一种模式,当你自己要定制的东西越来越多,这种模式就会越来越不适合你,或许放弃它是一种更好的选择Top
19 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:45:00 得分 0
高手看问题的思路就是不一样啊。
但是定制自己的东西是建立在有一定基础上的阿。
对话框程序可以直接加按钮。
单文档呢,怎么在分割条中间做个按钮阿:<Top
20 楼tomtom123(abc)回复于 2006-04-30 00:36:16 得分 0
MARKTop
21 楼lypdl()回复于 2006-04-30 08:02:19 得分 0
我就想在csplitter上作怎么办,???有高手会么???Top
22 楼lypdl()回复于 2006-04-30 13:09:51 得分 0
怎么样没人会拉!!!!
Top
23 楼lypdl()回复于 2006-04-30 14:26:18 得分 0
我就想在csplitter上作怎么办,???有高手会么???Top
24 楼cut9(切瓜玩)回复于 2006-05-07 13:32:58 得分 0
markTop
25 楼coolzdp(unreal张师傅)回复于 2006-05-07 22:29:03 得分 0
upTop
26 楼coolzdp(unreal张师傅)回复于 2006-05-07 22:29:18 得分 0
楼主找到了别忘了ps我一个3qTop
27 楼shmily1280(锄禾)回复于 2006-05-08 08:38:22 得分 0
学习之
人肉UPTop
28 楼xjl1980_81(什么都不会)回复于 2006-05-08 09:10:37 得分 0
我也没有找到。
有人找到了吗?
从SplitterWnd派生出的。Top
29 楼lypdl()回复于 2006-05-08 10:58:58 得分 0
我也没有找到。
有人找到了吗?
从SplitterWnd派生出的。Top
30 楼email_jhb()回复于 2006-05-08 11:52:39 得分 0
我也想知道怎么做。不过上面的高手们讲的话太哲学、太抽象了。我都听不太懂。有没有实践过的?Top
31 楼xjl1980_81(什么都不会)回复于 2006-05-08 13:37:58 得分 0
是呀。最好能有个从SplitterWnd派生的Sample。
等待中Top
32 楼SoLike(思危)回复于 2006-05-09 17:16:11 得分 0
哈哈,现在人真是幸福,有问题可以上CSDN发帖子。
俺学VC的时候,除了看MSDN,什么都得自己动手做。Top
33 楼SoLike(思危)回复于 2006-05-09 17:33:22 得分 0
刚才动了下手,2分钟搞定,给邮箱或QQ、MSN什么的,传你,俺明天要去北京出差了,上网不便啊Top
34 楼email_jhb()回复于 2006-05-10 06:59:21 得分 0
email_jhb@yahoo.com.cn
Top
35 楼xjl1980_81(什么都不会)回复于 2006-05-10 08:50:17 得分 0
xujianlong1980@163.comTop
36 楼ribut9225(幽灵庄主)回复于 2006-05-10 09:14:11 得分 0
ribut9225@163.com
谢谢
同享啊Top
37 楼SoLike(思危)回复于 2006-05-10 17:14:14 得分 0
发了Top
38 楼email_jhb()回复于 2006-05-10 19:03:19 得分 0
可以,不过没看到分割条上有按钮,另外拖动分割条后,视图上会产生一些脏块,是什么原因?Top
39 楼SoLike(思危)回复于 2006-05-10 19:47:34 得分 0
拖动就出现了,重绘有问题,俺坐车去了,回来再说吧Top
40 楼lypdl()回复于 2006-05-11 10:08:28 得分 0
lypdl@163.com
给我一份好么???Top
41 楼lypdl()回复于 2006-05-11 16:34:35 得分 0
怎么没回音拉?????
谁传给我一个好么???
lypdl@163.com
Top
42 楼coolzdp(unreal张师傅)回复于 2006-05-11 16:39:12 得分 0
zdp-110@163.com
谢谢大哥别忘了阿Top
43 楼lypdl()回复于 2006-05-12 08:08:09 得分 0
怎么没回音拉?????
谁传给我一个好么???
lypdl@163.com
Top
44 楼coolzdp(unreal张师傅)回复于 2006-05-15 10:58:31 得分 0
upTop
45 楼lypdl()回复于 2006-05-15 15:34:40 得分 0
怎么没回音拉?????
谁传给我一个好么???
lypdl@163.comTop
46 楼coolzdp(unreal张师傅)回复于 2006-05-15 18:01:50 得分 0
我找到例子了.很不错
谁要在此留言开贴给我分我给他Top
47 楼njg_jh(糨糊)回复于 2006-05-15 18:08:03 得分 0
// MySplitterWnd.cpp : implementation file
//
#include "stdafx.h"
#include "SplitterWnd.h"
#include "MySplitterWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMySplitterWnd
IMPLEMENT_DYNCREATE(CMySplitterWnd, CSplitterWnd)//CMDIChildWnd)
CMySplitterWnd::CMySplitterWnd()
{
//{{设置Splitter的宽度
m_cxSplitter = m_cySplitter = 50;
m_cxSplitterGap = m_cySplitterGap = 50;
//}}
}
CMySplitterWnd::~CMySplitterWnd()
{
}
BEGIN_MESSAGE_MAP(CMySplitterWnd, CSplitterWnd)//CMDIChildWnd)
//{{AFX_MSG_MAP(CMySplitterWnd)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMySplitterWnd::StopTracking(BOOL bAccept)
{
BOOL bTracking = m_bTracking;
CSplitterWnd::StopTracking(bAccept);
if(bTracking)
{
AdjustButton();
}
}
void CMySplitterWnd::RecalcLayout()
{
CSplitterWnd::RecalcLayout();
AdjustButton();
}
/////////////////////////////////////////////////////////////////////////////
// CMySplitterWnd message handlers
int CMySplitterWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CSplitterWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_bt.Create("BT", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(0,0,0,0), this, 1);
return 0;
}
void CMySplitterWnd::AdjustButton()
{
if(m_bt.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
rect.left += m_cxBorder;
//column split bars
for (int col = 0; col < m_nCols - 1; col++)
{
rect.left += m_pColInfo[col].nCurSize + m_cxBorderShare;
rect.right = rect.left + m_cxSplitter;
// rect.left = rect.right + m_cxBorderShare;//如果有多个Splitter的话,在这句之前移动Button
}
//此例子只演示了column split bars
// row split bars
/* GetClientRect(rect);
rect.top += m_cyBorder;
for (int row = 0; row < m_nRows - 1; row++)
{
rect.top += m_pRowInfo[row].nCurSize + m_cyBorderShare;
rect.bottom = rect.top + m_cySplitter;
rect.top = rect.bottom + m_cyBorderShare;
}
*/
CRect rcBt;
rcBt.top = rect.Height() / 2 - 100 + rect.top;
rcBt.bottom = rcBt.top + 200;
rcBt.left = rect.left + 10;
rcBt.right = rect.right - 10;
m_bt.MoveWindow(&rcBt);
}
}Top
48 楼njg_jh(糨糊)回复于 2006-05-15 18:08:26 得分 0
#if !defined(AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_)
#define AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySplitterWnd.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CMySplitterWnd frame with splitter
#ifndef __AFXEXT_H__
#include <afxext.h>
#endif
class CMySplitterWnd : public CSplitterWnd//CMDIChildWnd
{
DECLARE_DYNCREATE(CMySplitterWnd)
public:
CMySplitterWnd(); // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMySplitterWnd)
protected:
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMySplitterWnd();
// Generated message map functions
//{{AFX_MSG(CMySplitterWnd)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
protected:
void AdjustButton();
CButton m_bt;
virtual void StopTracking(BOOL bAccept);
public:
virtual void RecalcLayout();
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_)Top
49 楼lemonxinmei330()回复于 2006-05-16 11:17:47 得分 0
justin@probenetwork.comTop
50 楼T97102003(池塘里的水手)回复于 2006-05-16 11:42:33 得分 0
t97102003@163.com
thankTop
51 楼lypdl()回复于 2006-05-16 12:01:12 得分 0
lypdl@163.comTop
52 楼livjian(想翅膀的猪)回复于 2006-05-16 12:31:39 得分 0
livjian@163.com
THANKSTop




