现在的位置: 首页 > 综合 > 正文

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

2013年12月11日 ⁄ 综合 ⁄ 共 1788字 ⁄ 字号 评论关闭

 

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

 

邵盛松 2010128日星期三

 

前言

 

下载地址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_MOVEWM_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字符集下调试通过

 

 

抱歉!评论已关闭.