zoukankan      html  css  js  c++  java
  • VC关于置顶窗口的方法小结

    转摘自: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 显示窗口 


  • 相关阅读:
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    程序员加班奇遇
    Spring Boot导出jar包发布
    Eclipse工具栏太多,自定义工具栏,去掉调试
    ${pageContext.request.contextPath}的解释以及和request.contextPath的区别
    request 获取各种路径
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637246.html
Copyright © 2011-2022 走看看