VC关于置顶窗口的方法小结
2013-10-13 00:30
281 查看
转摘自:http://blog.csdn.net/wirror800/article/details/4002381
将窗体置顶的方法有:
//将窗体置顶的API函数
::SetWindowPos(m_hWndTop,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
//MFC
pDlg->SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
说明:
&CWnd::wndTopMost 是当前的最顶层窗口,调用函数,会把m_hWndTop或pDlg 置于&CWnd::wndTopMost上面
自然就变成了最顶层
&CWnd::wndTopMost 是个静态成员变量 不知是本主程序的还是整个Windows系统的?
所有对话框创建时,由系统自动更新的一个变量
我用(&CWnd::wndTopMost )->GetSafeHwnd(),能取到个有效的句柄,但调用SetWindowPos()却无效。
用::GetForegroundWindow()可以。
GetForegroundWindow() 所取到的一定是当前顶层的 但要注意 若你在界面程序里,比如按钮触发后调用他,获取
到的将是你正操作的界面。
如下代码:
void CTestTimerDlg::OnBnClickedButton1()
{
pdlgFir = new TestTopMostDlg();
pdlgFir->Create(IDD_DIALOG1,this);
//dlg.DoModal();
//此处获得的是TestTopMostDlg句柄
m_hWndTop = ::GetForegroundWindow();
//m_hWndTop = (CWnd::wndTopMost).GetSafeHwnd();
//bRetu = FALSE;
}
void CTestTimerDlg::OnBnClickedButton2()
{
//此处获得的将是CTestTimerDlg 句柄
//m_hWndTop = ::GetForegroundWindow();//(&(CWnd::wndTopMost))->GetSafeHwnd();
pDlg = new CTestSecondDlg();
pDlg->Create(IDD_DIALOG2,this);
BOOL bRetu=FALSE;
//pdlgFir->GetSafeHwnd()
bRetu = ::SetWindowPos(m_hWndTop,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
}
更关键的一点,同一个主程序里的两个子窗口都设置了 Topmost 则相互不起作用,即两个子对话框都可以通过获得焦点
而置顶。但二个子对话框 对于其他程序可以一起置顶。
参数 类型及说明
hwnd HWND,欲定位的窗口句柄
hWndInsertAfter HWND,置于hwnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一: HWND_BOTTOM 将窗口置于其它所有窗口的底部
HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响
HWND_TOP 将窗口置于它所有窗口的顶部
HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态
wFlags:
UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框
SWP_FRAMECHANGED 发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送
SWP_HIDEWINDOW 隐藏窗口
SWP_NOACTIVATE 不激活窗口
SWP_NOCOPYBITS 屏蔽客户区域
SWP_NOMOVE 保持当前位置(X和Y参数将被忽略)
SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序
SWP_NOREDRAW 窗口不自动重画
SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同
SWP_NOSENDCHANGING 防止这个窗口接受WM_WINDOWPOSCHANGING消息
SWP_NOSIZE 保持当前大小(cx和cy会被忽略)
SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略)
SWP_SHOWWINDOW 显示窗口
将窗体置顶的方法有:
//将窗体置顶的API函数
::SetWindowPos(m_hWndTop,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
//MFC
pDlg->SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
说明:
&CWnd::wndTopMost 是当前的最顶层窗口,调用函数,会把m_hWndTop或pDlg 置于&CWnd::wndTopMost上面
自然就变成了最顶层
&CWnd::wndTopMost 是个静态成员变量 不知是本主程序的还是整个Windows系统的?
所有对话框创建时,由系统自动更新的一个变量
我用(&CWnd::wndTopMost )->GetSafeHwnd(),能取到个有效的句柄,但调用SetWindowPos()却无效。
用::GetForegroundWindow()可以。
GetForegroundWindow() 所取到的一定是当前顶层的 但要注意 若你在界面程序里,比如按钮触发后调用他,获取
到的将是你正操作的界面。
如下代码:
void CTestTimerDlg::OnBnClickedButton1()
{
pdlgFir = new TestTopMostDlg();
pdlgFir->Create(IDD_DIALOG1,this);
//dlg.DoModal();
//此处获得的是TestTopMostDlg句柄
m_hWndTop = ::GetForegroundWindow();
//m_hWndTop = (CWnd::wndTopMost).GetSafeHwnd();
//bRetu = FALSE;
}
void CTestTimerDlg::OnBnClickedButton2()
{
//此处获得的将是CTestTimerDlg 句柄
//m_hWndTop = ::GetForegroundWindow();//(&(CWnd::wndTopMost))->GetSafeHwnd();
pDlg = new CTestSecondDlg();
pDlg->Create(IDD_DIALOG2,this);
BOOL bRetu=FALSE;
//pdlgFir->GetSafeHwnd()
bRetu = ::SetWindowPos(m_hWndTop,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
}
更关键的一点,同一个主程序里的两个子窗口都设置了 Topmost 则相互不起作用,即两个子对话框都可以通过获得焦点
而置顶。但二个子对话框 对于其他程序可以一起置顶。
参数 类型及说明
hwnd HWND,欲定位的窗口句柄
hWndInsertAfter HWND,置于hwnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一: HWND_BOTTOM 将窗口置于其它所有窗口的底部
HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响
HWND_TOP 将窗口置于它所有窗口的顶部
HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态
wFlags:
UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框
SWP_FRAMECHANGED 发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送
SWP_HIDEWINDOW 隐藏窗口
SWP_NOACTIVATE 不激活窗口
SWP_NOCOPYBITS 屏蔽客户区域
SWP_NOMOVE 保持当前位置(X和Y参数将被忽略)
SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序
SWP_NOREDRAW 窗口不自动重画
SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同
SWP_NOSENDCHANGING 防止这个窗口接受WM_WINDOWPOSCHANGING消息
SWP_NOSIZE 保持当前大小(cx和cy会被忽略)
SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略)
SWP_SHOWWINDOW 显示窗口
相关文章推荐
- VC关于置顶窗口的方法小结
- VC关于置顶窗口的方法小结
- VC关于置顶窗口的方法小结
- VC关于置顶窗口的方法小结
- VC关于置顶窗口的方法小结
- VC中置顶窗口的方法
- VC++编程获取窗口句柄的方法小结
- Delphi 窗口置顶的方法
- VC中关于创建一个新的线程的方法
- java多线程----关于join方法的注意点,以及守护线程的小结
- 关于office第一次打开跳出安装窗口的问题我找到、解决方法了
- 关于获得MFC窗口其它类指针的方法
- vc中关于屏幕闪烁问题解决的小结
- 关于获得MFC窗口其它类指针的方法(CSDN)
- VC中禁用“脚本错误调试”窗口的解决方法
- VC++ 对话框工程MFC中父窗口和子窗口传值方法
- 关于winForm窗体禁用关闭按钮的使用方法及禁用最大化、最小化窗口
- vc中播放mp3文件的方法小结
- 关于VC2008编译出现错误“error C2664: ” 的处理方法: