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、编译控件,可以使用网页调用控件。
在控件上双击,控件就会全屏,再次双击,恢复原始状态。