2011-02-10

Tk fullscreen

方法一
wm overrideredirect . 1
wm geometry . [winfo screenwidth .]x[winfo screenheight .]+0+0
wm attributes . -topmost 1
方法二 (Tk 8.5)
wm attributes . -fullscreen 1 -topmost 1
最近寫的一個程式要透過 optcl 抓 ie 來全螢幕顯示網頁,進入全螢幕時隱藏 toolbar,跳離全螢幕後顯示 toolbar。因為在全螢幕下 tk 沒辦法抓到 ie 的 event,所以設計成全螢幕時將 toolbar 高度改為1,然後在上面 bind event。以下是簡單的範例,按下放大視窗按鈕會全螢幕,在最底下滑鼠左鍵點兩下會跳離全螢幕。(註: 因 wm protocol 中沒有視窗放大的 protocol,這裡採用 bind Configure event 並判斷視窗目前狀態是否為 zoomed 來偵測按下視窗放大按鈕的動作。)
package require optcl

optcl::new -window .fmeBrowser "http://www.google.com"
frame .fmeSub -bd 0 -relief groove -height 1 
pack .fmeBrowser -fill both -expand 1
pack .fmeSub -fill x 

bind .fmeSub <Double-1> {
  wm state . normal
}

bind . <Configure> {
  if { "%W" eq [winfo toplevel "%W"] &&  [wm state . ] eq "zoomed"} {
    wm attributes . -fullscreen 1 -topmost 1
  } else {
    wm attributes . -fullscreen 0 -topmost 0
  }
}
如果要塞滿多顆螢幕的時候會發現用方法二只能在一顆螢幕上全螢幕顯示,此時得先抓出全部的長寬再用 wm geometry 設定。以下是用 twapi 取得各螢幕的位置後再拿最右和最下的值當作長寬,如果事先已知道執行時螢幕的總長寬也可以寫成變數比較簡單。
package require twapi

foreach display [::twapi::get_multiple_display_monitor_info] {
  lappend listx [lindex [lindex $display 1] 2]
  lappend listy [lindex [lindex $display 1] 3]
}

wm overrideredirect . 1
wm geometry . [lindex [lsort $listx] end]x[lindex [lsort $listy] end]+0+0
wm attributes . -topmost 1

沒有留言:

張貼留言