您的位置:首页 > 其它

在固定位置创建子窗口,点击父窗口自动隐藏子窗口

2010-12-08 20:38 731 查看
在固定位置创建子窗口,点击父窗口自动隐藏子窗口

邵盛松 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字符集下调试通过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: