最近在编写视频播放器,需要播放子窗口在双击时全屏显示,再次双击时还原。在网上参考了很多文章,发现在自己动手做时总有很多不如意的地方,于是自己也写篇心得。
作者用到的工具与平台:
vin7 64位;
visual studio 2005;
一、新建对话框工程:DlgTest;在工程中添加以CStatic 为基类的全屏扩展控件类CFullScreenDlg,为其添加成员变量
private:
bool m_bIsFullScreen; // 全屏状态,false 非全屏, true 全屏。要初始化其为false
WINDOWPLACEMENT m_wpmSave;
CWnd * m_pParent;;
1、重载CFullScreenDlg类的虚函数PreTranslateMessage用于响应鼠标双点事件。
BOOL CFullScreenDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_LBUTTONDBLCLK)
{
FullScreen();
}
return CStatic::PreTranslateMessage(pMsg);
}
2、FullScreen函数的实现
void CFullScreenDlg::FullScreen(void)
{
if (m_bIsFullScreen)
{
SetParent(m_pParent);
ModifyStyle(WS_POPUP, WS_CHILD);
SetWindowPlacement(&m_wpmSave);
m_bIsFullScreen = false;
}
else
{
m_pParent = GetParent();
GetWindowPlacement(&m_wpmSave);
int cx = ::GetSystemMetrics(SM_CXSCREEN);
int cy = ::GetSystemMetrics(SM_CYSCREEN);
ModifyStyle(WS_CHILD,WS_POPUP);
SetParent(NULL);
MoveWindow(0, 0, cx, cy);
m_bIsFullScreen = true;
}
}
3、重载CFullScreenDlg类的虚函数PreCreateWindow,添加对话框创建时的风格 SS_NOTIFY(因我们创建的全屏控件类基类为CStatic,而其默认并不接收鼠标消息,作者在这卡了大半天时间才在网上找到原因的)
BOOL CFullScreenDlg::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= SS_NOTIFY;
return CStatic::PreCreateWindow(cs);
}
到此我们的全屏扩展控件已创建完成了。
二、创建我们的扩展全屏控件实例:
1、在主对话框的初始化函数OnInitDialog中创建实例
CRect rt;
GetDlgItem(IDC_STC_FULL)->GetWindowRect(&rt); // 拖拉了一个我们扩展控件显示位置的参考CStatic,设置其为隐藏,省得写位置坐标
ScreenToClient(&rt);
m_pStcFull = new CFullScreenDlg;
if(m_pStcFull)
m_pStcFull->Create("", WS_CHILD | WS_VISIBLE | WS_BORDER, rt, this);
启动对话框就可以实现双击全屏,再次双击还原的子控件效果了。
本文完整vs2005工程下载地址:
http://download.csdn.net/detail/qusuo/8845689
本文参考了网络资源
1、http://blog.sina.com.cn/s/blog_6aeaee7e0100u5ef.html
2、... ...