OCX控件全屏、恢复

本文实现了在OCX控件上双击鼠标,控件全屏,再次双击鼠标,控件恢复原始状态的功能。

1、首先需要创建一个MFC的OCX控件,比如:MFCActiveXControl1。

2、在头文件中增加全屏、恢复需要用到的成员变量
MFCActiveXControl1Ctrl.h
    // ------窗口全屏、恢复------
    BOOL m_bMouseDbClickFlag;   // 双击标识
    WINDOWPLACEMENT m_wpPrev;   // 双击之前的窗口状态
    HWND m_hwndParent;          // 保存父窗口

3、进入类视图标签页。选择MFCActiveXControl1Ctrl类。
之后进入属性标签页,并点击重写按钮(在上方的一排按钮中)。

4、找到PreCreateWindow,创建PreCreateWindow函数的实现。.h和.cpp中会自动创建该函数。
MFCActiveXControl1Ctrl.h
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

5、进入类视图标签页。选择MFCActiveXControl1Ctrl类。
之后进入属性标签页,并点击消息按钮(在上方的一排按钮中)。
选择WM_LBUTTONDBCLK,增加OnLButtonDblClk函数。
选择WM_WINDOWPOSCHANGING,增加OnWindowPosChanging函数。
MFCActiveXControl1Ctrl.h
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
    afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);

6、在MFCActiveXControl1Ctrl.h头文件中增加下面几个函数。
    ///< 取得显示器宽、高
    void GetMaxMonitorRect(LPRECT prc);
    ///< 最大化窗口
    int MaxiumWindow();
    ///< 恢复窗口
    int ResetWindowSize();

7、在cpp中实现上面的函数,MFCActiveXControl1Ctrl.cpp

///< 窗口创建之前进行的操作
BOOL CMFCActiveXControl1Ctrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("STATIC");
    cs.style = SS_NOTIFY | WS_VISIBLE | WS_CHILD;
    m_hwndParent = cs.hwndParent;
    return COleControl::PreCreateWindow(cs);
}
///< 鼠标左键双击事件(窗口最大化、恢复)
void CMFCActiveXControl1Ctrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    FireDblClick();
    m_bMouseDbClickFlag = !m_bMouseDbClickFlag;
    if (m_bMouseDbClickFlag)
    {
        MaxiumWindow();
    }
    else
    {
        ResetWindowSize();
    }
    COleControl::OnLButtonDblClk(nFlags, point);
}
///< 窗口位置变化时被调用(调用了SetWindowPos之后,框架会调用该函数)
void CMFCActiveXControl1Ctrl::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
    if (::GetParent(m_hWnd) != m_hwndParent)
    {
        CRect rc;
        GetMaxMonitorRect(&rc);
        lpwndpos->cx = rc.Width();
        lpwndpos->cy = rc.Height();
        lpwndpos->x = rc.left;
        lpwndpos->y = rc.top;
    }
    COleControl::OnWindowPosChanging(lpwndpos);
}
///< 取得显示器宽、高
void CMFCActiveXControl1Ctrl::GetMaxMonitorRect(LPRECT prc)
{
    HMONITOR hMonitor;
    MONITORINFOEX mi;
    RECT rc;
    hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
    mi.cbSize = sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);
    rc = mi.rcMonitor;
    *prc = rc;
}
///< 最大化窗口
int CMFCActiveXControl1Ctrl::MaxiumWindow()
{
    HWND hwnd = GetSafeHwnd();
    RECT rc;
    // 取得显示器的宽、高
    GetMaxMonitorRect(&rc);
    // 计算画面宽、高
    int nWidth = rc.right - rc.left;
    int nHeight = rc.bottom - rc.top;
    // 取得原始位置并保存
    m_wpPrev.length = sizeof(WINDOWPLACEMENT);
    ::GetWindowPlacement(m_hWnd, &m_wpPrev);
    // 窗口全屏
    SetParent(NULL);
    DWORD dwFlag = SWP_DRAWFRAME;
    BOOL bSucceed = ::SetWindowPos(m_hWnd, HWND_TOPMOST, rc.left, rc.top, nWidth, nHeight, dwFlag);
    return 1;
}
///< 恢复窗口
int CMFCActiveXControl1Ctrl::ResetWindowSize()
{
    if (NULL != m_hwndParent)
    {
        ::SetParent(m_hWnd, m_hwndParent);
        m_wpPrev.flags = SW_SHOWMAXIMIZED;
        ::SetWindowPlacement(m_hWnd, &m_wpPrev);
    }
    HWND hWnd = ::FindWindow("Shell_TrayWnd", NULL);
    HWND hStar = ::FindWindow("Button", NULL);
    ::ShowWindow(hWnd, SW_SHOW);
    ::ShowWindow(hStar, SW_SHOW);
    return 1;
}

8、修改警告错误
    HWND hWnd = ::FindWindow("Shell_TrayWnd", NULL);
    HWND hStar = ::FindWindow("Button", NULL);
这样写在字符集是Unicode的情况下会报错。改成下面这样即可
    HWND hWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
    HWND hStar = ::FindWindow(_T("Button"), NULL);
或者将字符集设置为未设置也行。

9、编译控件,可以使用网页调用控件。
在控件上双击,控件就会全屏,再次双击,恢复原始状态。



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页