2016-09-27 46 views
2

我想用Cairo C/X11代碼畫成Tk 8.6 frame。我發現我可以通過將-background ""作爲選項傳遞給frame(因此基本上frame不知道要重繪什麼)來防止幀在發生Expose事件(例如,窗口大小更改)的情況下重繪本身。兩個問題:Tk框架:如何停用暴露事件的內部處理程序?

  • 是否有更好的方法來告訴frame不重繪本身,而是把它留給別人?

  • 我可以用我自己的C級別替換Tk的內部事件處理程序(對於Expose等)嗎? (目前我在Tcl上做了bind $frame <Expose> "myExposeHandler..."。)

感謝您的幫助!

(該-container yes選擇似乎沒有任何效果,順便說一句。)

+0

'-container yes'用於與頂層的'-use'選項集成,允許頂層_possibly在另一個process_中包含在一個小部件中。這絕對不是你想要的。 –

回答

2

-background ""選項是關閉幀的重畫的一個,並且通常用在你將手從框架的XID作爲提供給其他流程的手段。 (這曾經是人們將如何整合視頻播放器;我不知道這是多麼實際)。還有-container true選項,正如你發現的那樣,但這只是用於你想要嵌入頂級框架內的另一個Tk過程(它支持用於交換幾何管理器信息的特殊協議IIRC),這不是您想要的。但是,如果您已經在使用您自己的C代碼,那麼您也可以製作自己的Widget組件。然後,您將完全控制所有事件處理,並可以執行任何您想要的操作。在這種情況下,人們開始使用的通常地點是square widget in the Tk sources(這裏包含的時間太長)。這展示了很多關於Tk如何處理事件的事情,比如推遲更新直到「空閒」(即有效事件合併)和處理Tk的配置系統。關鍵在於你定義了一個widget記錄,其中包含所有可配置的字段以及其他任何你需要的東西來使這個widget工作(參見Square typedef),這是一個描述要配置哪些位的選項規範列表(請參閱靜態聲明optionSpecs),構造函數命令(SquareObjCmd),實例命令(SquareWidgetObjCmd),事件處理函數(SquareObjEventProc)和繪圖回調函數(SquareDisplay)。還有其他一些東西,比如如何刪除東西等,但我相信你會得到這些東西的竅門。然後你所要做的就是像Tcl命令一樣註冊constructor命令;對於任何擴展Tcl/Tk的代碼來說,這是通常的做法。

這樣做是多一點工作,但它會使您的真實代碼和Tcl之間的綁定更牢固。您需要決定您在實例命令中放置了多少複雜性; Tk自己的小部件從很簡單(messagebox小部件只比square示例小部件複雜一點)複雜到非常複雜(canvastext都是非常複雜的代碼片段)。