百叶窗式面板组

上传人:子 文档编号:42030198 上传时间:2018-05-31 格式:DOC 页数:5 大小:28.50KB
返回 下载 相关 举报
百叶窗式面板组_第1页
第1页 / 共5页
百叶窗式面板组_第2页
第2页 / 共5页
百叶窗式面板组_第3页
第3页 / 共5页
百叶窗式面板组_第4页
第4页 / 共5页
百叶窗式面板组_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《百叶窗式面板组》由会员分享,可在线阅读,更多相关《百叶窗式面板组(5页珍藏版)》请在金锄头文库上搜索。

1、百叶窗式面板组百叶窗式面板组百叶窗式面板组作者:风林利用百叶窗式面板组可增大窗口的可利用面积,而且把常用工具放在窗口中比放在菜单中使用更方便,现在一些大型软件如Photoshop、Dreamweaver 等都采用了这种方式。在这些软件中,百叶窗式面板组都做成了可停靠的窗口,我没有这种能力,只能做成固定位置的控件组,使用时只能用在对话框或具有 CFormView 的视图中,整个制作很粗糙,希望高手能加以改造。本程序的核心思路是调整控件的位置和显示/隐藏控件,当一个面板被收起或展开时,只要把它下面的控件都隐藏或显示出来,再调整各面板控件位置,这样整个面板组就像百叶窗一样可以收放自如了。显示/隐藏控

2、件:CWnd *pWnd;pWnd = GetDlgItem( 控件 ID 号 );pWnd-ShowWindow( nShow );GetDlgItem()函数用于获取控件的指针;ShowWindow()函数用于显示/隐藏控件,当 nShow 为 SW_SHOW 时,显示控件,为 SW_HIDE 时隐藏控件。修改控件位置:CWnd *pWnd;pWnd = GetDlgItem( 控件 ID 号 );pWnd-SetWindowPos( NULL,x,y,0,0,SWP_NOZORDER | SWP_NOSIZE );SetWindowPos()函数把控件移到窗口的(x,y)处,大小不变这个

3、程序的设计难点在控制控件的位置上,应该尽量采用相对位置。在这里只要抓住在各种情况下标题条的位置就可以了,标题条下的各控件位置都是相对于标题条的,当标题条位置改变时,重新计算一下控件位置就可以了。我定义了一个数组变量 CPoint m_TitlePt3存放三个标题条的位置,其值在收放面板时进行设定。面板 1 的标题条是固定的,只要设置好初值就行了;面板 2 的标题条是相对于面板 1 的标题条的,有两种可能:当面版 1 展开时,其 y 坐标=标题条 1.y+面板 1 高度,即:m_TitlePt1.y = m_TitlePt0.y+m_BoxHeight0;当面版 1 收起时,其 y 坐标=标题条

4、 1.y+标题条 1 高度,即:m_TitlePt1.y = m_TitlePt0.y+m_TitleHeight;面板 3 的标题条是相对于面板 2 的标题条的,也有两种可能:当面版 2 展开时,其 y 坐标=标题条 2.y+面板 2 高度,即:m_TitlePt2.y = m_TitlePt1.y+m_BoxHeight1;当面版 2 收起时,其 y 坐标=标题条 2.y+标题条 2 高度,即:m_TitlePt2.y = m_TitlePt1.y+m_TitleHeight;以下就是计算面板 3 各部分位置的函数:void CCurtainBoxDlg:CalculateControlP

5、os3()m_TitlePt2.x = m_BoxRext.left; /标题条位置(左上角坐标)if( b_Mark2 )/面板 2 是展开的m_TitlePt2.y = m_TitlePt1.y+m_BoxHeight1;else/面板 2 是收起的m_TitlePt2.y = m_TitlePt1.y+m_TitleHeight;m_ControlPt30 = CPoint( m_TitlePt2.x+5, m_TitlePt2.y+m_TitleHeight+7 );/控件位置m_ControlPt31 = CPoint( m_TitlePt2.x+85, m_TitlePt2.y+m

6、_TitleHeight+7 );m_ControlPt32 = CPoint( m_TitlePt2.x+5, m_TitlePt2.y+m_TitleHeight+35 );面板下各控件位置是经反复调节确定的。其它两个面板用类似方法计算。计算好位置后,就可以重新定位位置了,以下为设置面板 3 各部分位置的函数:void CCurtainBoxDlg:SetBox3Pos()CWnd *pWnd = GetDlgItem( IDC_TITLE3 );pWnd-SetWindowPos( NULL, m_TitlePt2.x, m_TitlePt2.y,0, 0, SWP_NOSIZE | S

7、WP_NOZORDER );/调整标题栏位置int i;for( i=0; iSetWindowPos( NULL, m_ControlPt3i.x, m_ControlPt3i.y,0, 0, SWP_NOSIZE | SWP_NOZORDER );/调整控件位置其中,BOX3_NUMBER 为面板 3 中控件数,m_Box3ID存放控件 ID 号的数组,其值在初始化时已设置。解决了控件位置后,就该考虑单击标题条后的调整问题了。由于标题条是一种自绘的按钮(详见自己动手做按钮一文) ,可直接用 ClassWizard 添加它们的响应函数,这里我用了三个 BOOL 变量监视标题条状态:BOOL

8、b_Mark1;/面板 1 状态:true-展开、false-收缩BOOL b_Mark2;/面板 2 状态BOOL b_Mark3;/面板 3 状态当单击一个标题条时,首先修改它的状态变量,再根据新状态,计算和设置各控件位置,再重绘整个控件组就行了。还有一个问题,为了节省空间,我只允许同时展开两个面板,所以当展开一个面板时,若其它两个面板处于打开状态就应该先关闭一个。以下为单击面板 3 的标题条时的响应函数:void CCurtainBoxDlg:OnTitle3() if( m_Title3.ClickBut() )b_Mark3 = !b_Mark3;if( b_Mark1 m_Titl

9、e1.SetButStatus(BUT_STATUS_RIGHT);ShowBox1( SW_HIDE);if( b_Mark3 )ShowBox3( SW_SHOW );elseShowBox3( SW_HIDE );InvalidateBox();/刷新面板组m_Title3.ClickBut()是自绘的标题条按钮的成员函数,用于判定单击处是否为标题条的文字部分(参见 CTitleBox 类) ;b_Mark3 = !b_Mark3 为更改面板 3 的状态;其下是若三个面板都是展开的,则关闭面板 1;ShowBox3()为显示/隐藏面板 3 中各控件的函数,定义为:void CCurtai

10、nBoxDlg:ShowBox3(int nShow)CWnd *pWnd;for( int i=0; iShowWindow( nShow );InvalidateBox()调用计算和设置控件位置函数刷新面板组:void CCurtainBoxDlg:InvalidateBox()CalculateControlPos1();/计算面板 1 各控件位置SetBox1Pos();/重新设置面板 1 各控件位置CalculateControlPos2();/计算面板 2 各控件位置SetBox2Pos();/重新设置面板 2 各控件位置CalculateControlPos3();/计算面板 3 各控件位置SetBox3Pos();/重新设置面板 3 各控件位置InvalidateRect( /重绘面板背景以消除残留印记以上为百叶窗式面板组的设计思路,完整代码参见示例程序。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号