1. 程式人生 > >Halcon flush_graphic與視窗閃爍控制

Halcon flush_graphic與視窗閃爍控制

最近在讀Halcon學習網上的一個大神的例程,功能是通過hWindowControl控制元件在C#中實現滑鼠互動、Hobject物件的記憶、重繪和刪除、影象的縮放等等非常實用的操作。
這篇文章講不了這麼多,只是發現了一點點有用的東西,所以記錄下來。
這個有用的東西就是
set_system(“flush_graphic”, “false”)與視窗閃爍之間的關係。
首先描述一下場景:
有時候,我們需要在視窗或者控制元件中顯示影象,以及某些region、contour,甚至是互動時才會出現的ROI選擇框。
但是隨著操作的頻繁進行,我們在重繪視窗內容的時候,會出現並不希望出現的閃爍,比如說我希望讓繪製的多個contour物件能夠一次性顯示,而不是每一個新的contour物件顯示時,都去重新整理一次視窗。
我之前一直冥思苦想,不知道怎麼去控制這個問題。
讀了大神的程式之後(還沒讀完),get到一點新知:當控制使用flush_graphic引數時,可以解決這個問題。
上例程:

read_image (Image, 'fabrik')
dev_display (Image)
* 將flush_graphic引數設定為"false"
set_system ('flush_graphic', 'false')
dev_set_color ('cyan')
gen_rectangle2_contour_xld (Rectangle, 300, 200, 0, 100.5, 20.5)
* 繪製並顯示第一個contour物件Rectangle
dev_display (Rectangle)
dev_set_color ('yellow')
gen_circle_contour_xld (ContCircle,
200, 200, 100, 0, 6.28318, 'positive', 1) * 繪製第二個contour物件 ContCircle set_system ('flush_graphic', 'true') * 通過一次顯示,將之前繪製的多個物件同時顯示出來 dev_display (ContCircle)

在這裡插入圖片描述
可以看到,當不希望逐物件重新整理時,就把flush_graphic引數設定為false,這時候,不論你在畫布上繪製了多少物件,都不會去重新整理視窗。
而當flush_graphic引數重置為true時,可以通過對其中一個物件的顯示,把前序繪製的所有物件全部一次性顯示在視窗上,這樣就可以減少視窗的重新整理次數,從而解決不恰當的“閃爍”問題(其實不恰當的閃爍只是因為在不符合人類認知習慣的時候重繪了螢幕,因此這個方法實際上是按照人類的認知習慣統一了系統重新整理視窗的時機)。
Ps:忘了補充一點,這個操作只對windows系統有效,如果是unix或者linux,則由於視窗顯示重新整理的機制不同,該方法無效。