不用splitter控件 简单实现对mfc对话框的分割的方法
直接贴上源代码主要部分吧
这个是基于对话框的工程 进行对话框的分割实现
只是相应了三个消息函数,看一下就会明白的
我空间资源里边有现成的工程代码可以下载运行
.cpp 文件
// spliteDlg.cpp : implementation file
//
#include "stdafx.h"
#include "splite.h"
#include "spliteDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CSpliteDlg dialog
CSpliteDlg::CSpliteDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSpliteDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSpliteDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_SplitCursor = LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CURSOR_SPLIT));
}
void CSpliteDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSpliteDlg)
DDX_Control(pDX, IDC_LIST, m_edit);
DDX_Control(pDX, IDC_TREE, m_tree);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSpliteDlg, CDialog)
//{{AFX_MSG_MAP(CSpliteDlg)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CSpliteDlg message handlers
#define SIZEBAR 2// Space BTW Tree and Edit
BOOL CSpliteDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect rect ;
GetClientRect( &rect );
// TODO: Add extra initialization here
CRect treepos ;
m_tree.GetClientRect( treepos );
m_tree.MoveWindow(0, 0, treepos.Width(), rect.Height() );
m_edit.MoveWindow(treepos.Width() +SIZEBAR , 0, rect.Width()-(treepos.Width() +SIZEBAR), rect.Height() );
return TRUE; // return TRUE unless you set the focus to a control
}
void CSpliteDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect treepos ;
m_tree.GetWindowRect( &treepos );
ScreenToClient( &treepos );
CRect editpos ;
m_edit.GetWindowRect( &editpos );
ScreenToClient( &editpos );
CRect rc;
rc.left = treepos.right;
rc.right = editpos.left;
rc.top = treepos.top;
rc.bottom = treepos.bottom;
CRect rect;
GetClientRect( &rect );
if ( rect.PtInRect(point) )
{
SetCursor(m_SplitCursor); //设置鼠标光标形状
if ( nFlags & MK_LBUTTON )
{
ResizeWindows(point.x, rect.right-rect.left);
}
}
else
{
if(m_bButtonDown)
{
m_bButtonDown = FALSE;
ReleaseCapture();
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CSpliteDlg::ResizeWindows( int CxBarAt, int len )
{
CRect treepos ;
m_tree.GetClientRect( &treepos );
CRect rect ;
GetClientRect( &rect );
if(CxBarAt <= 1)
CxBarAt = 1;
if(CxBarAt >= len - 1)
CxBarAt = len - 1;
// 移动tree窗口
m_tree.MoveWindow( 0,0, CxBarAt-SIZEBAR, rect.Height() );
// 移动edit窗口
m_edit.MoveWindow(CxBarAt, 0, rect.right-CxBarAt, rect.Height());
}
void CSpliteDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bButtonDown = TRUE;
CRect treepos ;
m_tree.GetWindowRect( &treepos );
ScreenToClient( &treepos );
CRect editpos ;
m_edit.GetWindowRect( &editpos );
ScreenToClient( &editpos );
CRect rect;
rect.left = treepos.right;
rect.right = editpos.left;
rect.top = treepos.top;
rect.bottom = treepos.bottom;
// CRect rect;
// GetClientRect( &rect );
if ( rect.PtInRect(point) )
{
SetCursor(m_SplitCursor);
}
SetCapture();
CDialog::OnLButtonDown(nFlags, point);
}
void CSpliteDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bButtonDown=FALSE;
ReleaseCapture();
CDialog::OnLButtonUp(nFlags, point);
}
void CSpliteDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if((IsWindow(m_tree.m_hWnd)) && (IsWindow(m_edit.m_hWnd)))
{// get sizes; width of tree never changed
CRect rcTree;
m_tree.GetClientRect(&rcTree);
CRect rcEdit;
m_edit.GetClientRect(&rcEdit);
// 移动tree控件
rcTree.bottom=cy;
m_tree.MoveWindow(&rcTree,TRUE);
// 移动edit控件
rcEdit.left=rcTree.right+SIZEBAR;
rcEdit.right=cx;
rcEdit.top=0;
rcEdit.bottom=rcTree.bottom;
m_edit.MoveWindow(&rcEdit,TRUE);
}
}
.h 头文件
// spliteDlg.h : header file
//
#if !defined(AFX_SPLITEDLG_H__5C7DA2C0_E37E_426A_A7D3_E1DC7DFD2766__INCLUDED_)
#define AFX_SPLITEDLG_H__5C7DA2C0_E37E_426A_A7D3_E1DC7DFD2766__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/
// CSpliteDlg dialog
class CSpliteDlg : public CDialog
{
// Construction
public:
CSpliteDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSpliteDlg)
enum { IDD = IDD_SPLITE_DIALOG };
CListCtrl m_edit;
CTreeCtrl m_tree;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSpliteDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CSpliteDlg)
virtual BOOL OnInitDialog();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void ResizeWindows(int CxBarAt, int len );
private:
HCURSOR m_SplitCursor;
BOOL m_bButtonDown;
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SPLITEDLG_H__5C7DA2C0_E37E_426A_A7D3_E1DC7DFD2766__INCLUDED_)