MFC 子窗口全屏显示扩展控件

          最近在编写视频播放器,需要播放子窗口在双击时全屏显示,再次双击时还原。在网上参考了很多文章,发现在自己动手做时总有很多不如意的地方,于是自己也写篇心得。

       作者用到的工具与平台:

             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、... ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值