是整個應用程式,并不是某一個表單,因為整個程式有多個表單,在這幾個表單內切換焦點都還是在這個應用程式中的.
uj5u.com熱心網友回復:
應用程式何來焦點一說?焦點是針對視窗而言的。你到底想實作啥?uj5u.com熱心網友回復:
我為了保證程式的某些表單的前后順序,所以程式有些表單是fsStayOnTop的,但是必須在焦點切換到其它應用程式的時候改為fsNormal,不然會擋住其它應用程式,當切換到本應用程式時再設定回來.
uj5u.com熱心網友回復:
這個需求的話,將表單調到頂層后立即取消fsStayOnTop屬性,是不是可以?
uj5u.com熱心網友回復:
應用程式何來焦點一說?焦點是針對視窗而言的。你到底想實作啥?
我為了保證程式的某些表單的前后順序,所以程式有些表單是fsStayOnTop的,但是必須在焦點切換到其它應用程式的時候改為fsNormal,不然會擋住其它應用程式,當切換到本應用程式時再設定回來.
這個需求的話,將表單調到頂層后立即取消fsStayOnTop屬性,是不是可以?
應該不可以吧,因為有多個視窗需要設定fsStayOnTop,他們之間有可能互相切換的.而且還有更嚴重的問題,比如從其它應用程式上切換過來的時候,也要有獲取焦點事件,重新設回fsStayOnTop.
uj5u.com熱心網友回復:
大致的效果
uj5u.com熱心網友回復:
自己頂一下.uj5u.com熱心網友回復:
在你的應用中不要把視窗置頂,你可以采用模式視窗來實作你要的效果。uj5u.com熱心網友回復:
在你的應用中不要把視窗置頂,你可以采用模式視窗來實作你要的效果。
要置頂的并不是一個視窗,像那圖中就有3個,視頻一個,圖片一個,天氣一個(實際情況可能是任意個,所以你說的方法沒法解決這個問題).這3個視窗底下那個視窗就是模式視窗顯示的.
uj5u.com熱心網友回復:
這個問題我在一個專案中遇到過,當時使用了這樣的代碼:
// 將表單臨時調到最前面的用法:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if ( FormStyle != fsStayOnTop )
{
TFormStyle tFormStyle=FormStyle; // 開始之前記住原始設定
FormStyle=fsStayOnTop; // 讓視窗總是在最前面(調到最前面,會一直有效,可能造成模式表單彈出后界面疑似鎖定的情況)
FormStyle=tFormStyle; // 恢復原始設定
}
}
uj5u.com熱心網友回復:
若果表單本身是fsStayOnTop,那么Application->BringToFront(); // 將應用程式置于激活狀態并且擁有焦點
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if ( FormStyle != fsStayOnTop )
{
TFormStyle tFormStyle=FormStyle; // 開始之前記住原始設定
FormStyle=fsStayOnTop; // 讓視窗總是在最前面(調到最前面,會一直有效,可能造成模式表單彈出后界面疑似鎖定的情況)
FormStyle=tFormStyle; // 恢復原始設定
}else{
Application->BringToFront(); // 將應用程式置于激活狀態并且擁有焦點
}
}
完整代碼,你測驗一下看好不好用
這個關鍵點是讓最后一共視窗顯示在最前面,同時不影響其它后來視窗的顯示
uj5u.com熱心網友回復:
寫Application->OnActivate和Application->OnDeactivate事件處理。uj5u.com熱心網友回復:
若果表單本身是fsStayOnTop,那么Application->BringToFront(); // 將應用程式置于激活狀態并且擁有焦點
并不是所有視窗都是fsStayOnTop,只是部分視窗是這樣.
uj5u.com熱心網友回復:
若果表單本身是fsStayOnTop,那么Application->BringToFront(); // 將應用程式置于激活狀態并且擁有焦點
并不是所有視窗都是fsStayOnTop,只是部分視窗是這樣.
所以我的代碼里面記錄了表單原始的狀態,完成后還原:
TFormStyle tFormStyle=FormStyle; // 開始之前記住原始設定
FormStyle=fsStayOnTop; // 讓視窗總是在最前面
FormStyle=tFormStyle; // 恢復原始設定
uj5u.com熱心網友回復:
我額代碼放在FormActivate事件里可能會更好一些uj5u.com熱心網友回復:
我額代碼放在FormActivate事件里可能會更好一些
這個只是保證視窗永遠在最上面而已,比如用戶切換到其它軟體,那這個軟體就把別的軟體擋住了,還是回到這個帖子的主題上面.
uj5u.com熱心網友回復:
樓主的三個視窗都是模態顯示出來的?你能不能搞一個簡單的示例代碼,發我信箱我幫你看看,注明你的開發工具版本和作業系統版本。
uj5u.com熱心網友回復:
樓主的三個視窗都是模態顯示出來的?
你能不能搞一個簡單的示例代碼,發我信箱我幫你看看,注明你的開發工具版本和作業系統版本。
不是,那三個視窗都是普通的視窗,只不過設定為fsStayOnTop.現在要做到的效果是,用戶如果切換到別的軟體的時候,這三個視窗就不能是fsStayOnTop了,因為這樣會擋住別的軟體,所以想在用戶切換軟體的時候動態設定fsStayOnTop和fsNormal.
uj5u.com熱心網友回復:
可以在空閑時遍歷所有自己程式的視窗,檢查自己的視窗是否有焦點,但這坡費時間。還是從每個表單自身出發比較的理想uj5u.com熱心網友回復:
不是說了嗎,寫Application->OnActivate和Application->OnDeactivate事件處理。簡單說,要點在于你不能在事件處理中直接設定FormStyle屬性,這會導致反復激活視窗,要用SetWindowPos去設定Application->Handle或者某個表單的Handle,根據不同的情況(激活或者不激活)把hWndInsertAfter設定為HWND_TOPMOST或者HWND_NOTOPMOST /HWND_BOTTOM。VCL表單的FormStyle一直保持fsStayOnTop就可以。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/115953.html
標籤:基礎類
