不用splitter控件 简单实现对mfc对话框的分割的方法

来源:互联网 发布:linux设置中文编码 编辑:程序博客网 时间:2024/06/13 09:15

不用splitter控件  简单实现对mfc对话框的分割的方法

直接贴上源代码主要部分吧

这个是基于对话框的工程 进行对话框的分割实现

只是相应了三个消息函数,看一下就会明白的

我空间资源里边有现成的工程代码可以下载运行

.cpp 文件

// spliteDlg.cpp : implementation file//#include "stdafx.h"#include "splite.h"#include "spliteDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CSpliteDlg dialogCSpliteDlg::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 Win32m_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_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSpliteDlg message handlers#define SIZEBAR          2// Space BTW Tree and EditBOOL CSpliteDlg::OnInitDialog(){CDialog::OnInitDialog();// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small iconCRect rect ;GetClientRect( &rect );// TODO: Add extra initialization hereCRect 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 defaultCRect 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 defaultm_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 defaultm_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 hereif((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 dialogclass CSpliteDlg : public CDialog{// Constructionpublic:CSpliteDlg(CWnd* pParent = NULL);// standard constructor// Dialog Data//{{AFX_DATA(CSpliteDlg)enum { IDD = IDD_SPLITE_DIALOG };CListCtrlm_edit;CTreeCtrlm_tree;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSpliteDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected: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_MSGDECLARE_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_)


 

原创粉丝点击