在固定位置创建子窗口,点击父窗口自动隐藏子窗口
邵盛松 2010年12月8日星期三
一 前言
下载地址http://download.csdn.net/source/2892918
在父窗口上点击按钮,在按钮的下方创建子窗口,按钮和子窗口左对齐。处理父窗口的WM_MOVE消息,子窗口跟随父窗口移动。
二 函数说明
有几个函数先说明一下
GetWindowRect()返回窗口的屏幕坐标的矩形区域
屏幕坐标是窗口上的某一点相对于屏幕左上角的偏移
GetClientRect()返回客户区坐标的矩形区域
客户区坐标是窗口上的某一点相对于该窗口客户区左上角的偏移
有的函数需要使用屏幕坐标,有的函数使用客户区坐标,使用这些函数时需要两种坐标的转换
两种坐标的转换需要ScreenToClient()函数和ClientToScreen()函数
ScreenToClient()屏幕坐标转客户区坐标
ClientToScreen()客户区坐标转屏幕坐标
移动窗口函数MoveWindow(),当移动非子窗口的时候,需要使用的是屏幕坐标;当移动子窗口的时候,需要使用父窗口的客户区坐标。
三 实现
新建一个基于对话框的应用程序
以下为代码的说明
CPositionDlg类是父窗口类
CDlgChild类是子窗口类
1子窗口部分
子窗口的属性如下设置
Style设置为 Popup
Border设置为Resizing
2父窗口部分
1 )在父类中声明一个指向子窗口的成员指针变量和布尔型变量
CDlgChild *m_pDlg;
bool m_bStart;
2)在构造函数中初始化声明的成员变量
m_pDlg=NULL;
m_bStart=false;
3)在父窗口初始化时创建子窗口
创建完窗口之后并不马上显示
m_pDlg=new CDlgChild();
m_pDlg->Create(IDD_DIALOG_CHILD,this);
4)单击按钮显示并移动子窗口
子窗口的位置在按钮的下方,左边对齐
void CPositionDlg::OnBnClickedButtonCreate()
{
// TODO: 在此添加控件通知处理程序代码
HandleChild();
m_bStart=true;
}
5)HandleChild()窗口显示函数如下
void CPositionDlg::HandleChild()
{
CRect rectButton;
GetDlgItem(IDC_BUTTON_CREATE)-> GetWindowRect(&rectButton);
CRect rectChild;
m_pDlg->GetWindowRect(rectChild);
m_pDlg->ShowWindow(SW_SHOW);
m_pDlg->MoveWindow(rectButton.left,rectButton.bottom,rectChild.Width(),rectChild.Height(),TRUE);
}
6)子窗口的隐藏
重载PreTranslateMessage实现了想要的效果
BOOL CPositionDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd != m_pDlg->m_hWnd)
{
m_pDlg->ShowWindow(SW_HIDE);
}
return CDialog::PreTranslateMessage(pMsg);
}
7)父窗口的移动处理
WM_MOVE在WM_INITDIALOG之前触发,该标志的作用是在没有点击按钮之前不执行OnMove中的内容,
void CPositionDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
// TODO: 在此处添加消息处理程序代码
if (m_pDlg!=NULL && m_bStart==true)
{
HandleChild();
}
}
以上程序在 VC++2005 Unicode字符集下调试通过