Chinaunix首页 | 论坛 | 博客
  • 博客访问: 744029
  • 博文数量: 769
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:37
文章分类

全部博文(769)

文章存档

2011年(1)

2008年(768)

我的朋友

分类:

2008-10-15 16:41:04

利用百叶窗式面板组可增大窗口的可利用面积,而且把常用工具放在窗口中比放在菜单中使用更方便,现在一些大型软件如Photoshop、Dreamweaver等都采用了这种方式。在这些软件中,百叶窗式面板组都做成了可停靠的窗口,我没有这种能力,只能做成固定位置的控件组,使用时只能用在对话框或具有CFormView的视图中,整个制作很粗糙,希望高手能加以改造。


本程序的核心思路是调整控件的位置和显示/隐藏控件,当一个面板被收起或展开时,只要把它下面的控件都隐藏或显示出来,再调整各面板控件位置,这样整个面板组就像百叶窗一样可以收放自如了。

显示/隐藏控件:
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)处,大小不变

这个程序的设计难点在控制控件的位置上,应该尽量采用相对位置。在这里只要抓住在各种情况下标题条的位置就可以了,标题条下的各控件位置都是相对于标题条的,当标题条位置改变时,重新计算一下控件位置就可以了。

我定义了一个数组变量CPoint m_TitlePt[3]存放三个标题条的位置,其值在收放面板时进行设定。
面板1的标题条是固定的,只要设置好初值就行了;
面板2的标题条是相对于面板1的标题条的,有两种可能:
当面版1展开时,其y坐标=标题条1.y+面板1高度,即:m_TitlePt[1].y = m_TitlePt[0].y+m_BoxHeight[0];


当面版1收起时,其y坐标=标题条1.y+标题条1高度,即:m_TitlePt[1].y = m_TitlePt[0].y+m_TitleHeight;


面板3的标题条是相对于面板2的标题条的,也有两种可能:
当面版2展开时,其y坐标=标题条2.y+面板2高度,即:m_TitlePt[2].y = m_TitlePt[1].y+m_BoxHeight[1];
当面版2收起时,其y坐标=标题条2.y+标题条2高度,即:m_TitlePt[2].y = m_TitlePt[1].y+m_TitleHeight;
以下就是计算面板3各部分位置的函数:


void CCurtainBoxDlg::CalculateControlPos3()
{
 m_TitlePt[2].x = m_BoxRext.left; //标题条位置(左上角坐标)
 if( b_Mark2 ) //面板2是展开的
  m_TitlePt[2].y = m_TitlePt[1].y+m_BoxHeight[1];
 else   //面板2是收起的
  m_TitlePt[2].y = m_TitlePt[1].y+m_TitleHeight;
 m_ControlPt3[0] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+7 ); //控件位置
 m_ControlPt3[1] = CPoint( m_TitlePt[2].x+85, m_TitlePt[2].y+m_TitleHeight+7 );
 m_ControlPt3[2] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+35 );
}

面板下各控件位置是经反复调节确定的。其它两个面板用类似方法计算。
计算好位置后,就可以重新定位位置了,以下为设置面板3各部分位置的函数:

void CCurtainBoxDlg::SetBox3Pos()
{
 CWnd *pWnd = GetDlgItem( IDC_T99vLE3 );
 pWnd->SetWindowPos( NULL, m_TitlePt[2].x, m_TitlePt[2].y,
      0, 0, SWP_NOSIZE | SWP_NOZORDER );  //调整标题栏位置
 int i;
 for( i=0; i {
  pWnd = GetDlgItem( m_Box3ID[i] );
  pWnd->SetWindowPos( NULL, m_ControlPt3[i].x, m_ControlPt3[i].y,
     0, 0, SWP_NOSIZE | SWP_NOZORDER );  //调整控件位置
 }
}
其中,BOX3_NUMBER为面板3中控件数,m_Box3ID[]存放控件ID号的数组,其值在初始化时已设置。

解决了控件位置后,就该考虑单击标题条后的调整问题了。

[1]  

【责编:Ken】

--------------------next---------------------

阅读(312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~