当前位置:C++技术网 > 资讯 > 对话框的编程及对话框中实现伸缩部分区域

对话框的编程及对话框中实现伸缩部分区域

更新时间:2015-07-28 18:26:00浏览次数:1+次

    我们应该在某些地方看过,有些按钮能实现对话框的伸缩功能,对此,我也比较感兴趣,在我第四遍学习MFC中,为了验证自己对对话框编程的理解特地写下这篇文章,不足之处,望大家指出,我定改正并予以感激,好!进入正题.......

            伸展后伸展前    

     如图所示,我们要实现的就是类似这样的功能,首先,我们先在VC6.0编译器中打开新的工程,然后创建一个新的对话框,打开菜单按钮,在“帮助”后面点击右键,选择属性,将名称改为对话框,点击弹出按钮,设置ID号为IDC_DAILOG,再在新建的对话框中双击,建立一个基于对话框的类响应我们新建的对话框,设为CTextDlg,然后再在我们兴建的菜单项及对话框点击右键,建立类向导和消息响应,选择view类,然后再编译器中代码如下:

CTestDlg dlg;
	dlg.DoModal();
并在头文件中包含TextDlg.h,就建立了一个模态对话框,在对话框中拉入一个按钮控件,将其名称改为“收缩<<”,ID号改为IDC_BTN_EDIT
,在拉入一个图像控件,将其改为分割线,并将其ID改为IDC_SEPARATOR,右键单击“收缩<<“控件,在TextDlg类中建立类向导,写入代码如下:


void CTestDlg::OnBtnEdit() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BTN_EDIT,str),str=="收缩<<")
	{
		SetDlgItemText(IDC_BTN_EDIT,"伸展>>");

	}
	else
	{
		SetDlgItemText(IDC_BTN_EDIT,"收缩<<");
	}

	static CRect rectLarge;
	static CRect rectSmall;

	if(rectLarge.IsRectEmpty())
	{
		CRect Separatorrect;
		GetWindowRect(&rectLarge);
		GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&Separatorrect);
		
		rectSmall.left=rectLarge.left;
		rectSmall.top=rectLarge.top;
		rectSmall.right=rectLarge.right;
		rectSmall.bottom=Separatorrect.bottom;
	}
	if(str=="收缩<<")
	{
		SetDlgItemText(IDC_BTN_EDIT,"伸展>>");
		SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),
			SWP_NOMOVE | SWP_NOZORDER);
	}
	else
	{
		SetDlgItemText(IDC_BTN_EDIT,"收缩<<");
		SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),
			SWP_NOMOVE | SWP_NOZORDER);
	}
}
既然标题里有设备坐标,那自然涉及到了设备坐标函数,那好,我们讲解一下,上述代码中用到的设备坐标为void GetWindowRect(LPRECT lpRect) ,不要被表面意思曲解,该函数实现以屏幕坐标的形式获得整个用户窗口的大小,同样还有BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);以及ScreenToClient(.....),都是实现设备坐标中的屏幕坐标与用户坐标之间的转化