1. 程式人生 > >windows將窗體置頂的方法總結

windows將窗體置頂的方法總結

將窗體置頂的方法有:

//將窗體置頂的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 則相互不起作用,即兩個子對話方塊都可以通過獲得焦點
而置頂。但二個子對話方塊 對於其他程式可以一起置頂。