我们应该在某些地方看过,有些按钮能实现对话框的伸缩功能,对此,我也比较感兴趣,在我第四遍学习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(.....),都是实现设备坐标中的屏幕坐标与用户坐标之间的转化