怎么样动态切换窗体风格?
目的:想实现一窗体在作为单独窗口状态和作为另一窗体子控件状态两者间自由切换。
区别:两状态间区别如下:
状态 |
风格 |
父窗体 |
单独窗口 | 含有WS_POPUP风格 | 无(NULL) |
子控件 | 含有WS_CHILDWINDOW风格 | 有 |
可见,要切换两者状态需改变窗体风格,以及设置父窗口的有无,用到的接口函数如下
1. LONG_PTR SetWindowLong(
HWND hWnd,// handle to window
int nIndex,// offset of value to set
LONG dwNewLong // new value
);
指定nIndex为GWL_STYLE进行窗体风格的设置;
2. CWnd* CWnd::SetParent( CWnd* pWndNewParent );
设置窗体父窗口
主要代码如下:
////////////////////////////////////////////////////////////////////////////////////////////////////////
// m_pParentWnd为成员变量,用于保存窗体父窗口指针
CEmbedDlg::OnSwitchState()
{
if (GetParent() != NULL)
{ // 当前为子控件状态
m_pParentWnd = GetParent();
// 改变窗体风格,移除WS_CHILDWINDOW风格,添加WS_POPUP
LONG lNewStyle = GetWindowLong(m_hWnd, GWL_STYLE);
lNewStyle &= ~WS_CHILDWINDOW;
lNewStyle |= WS_POPUP;
SetWindowLong(m_hWnd, GWL_STYLE, lNewStyle);
// 设置父窗口为NULL
SetParent(NULL);
}
else
{ // 当前为独立窗体状态
// 改变窗体风格
LONG lNewStyle = GetWindowLongPtr(m_hWnd, GWL_STYLE);
lNewStyle &= ~WS_POPUP;
lNewStyle |= WS_CHILDWINDOW;
SetWindowLong(m_hWnd, GWL_STYLE, lNewStyle);
// 设置父窗口为原父窗口
SetParent(m_pParentWnd);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
PS: 若想通过鼠标拖动实现窗口状态的切换,可考虑处理WM_EXITSIZEMOVE消息,休息一下
本文地址:http://www.45fan.com/dnjc/72521.html