對話框背景設置

讓一個對話框顯示背景通常有兩種做法:使用圖片控件、在WM_PAINT消息中畫圖。

用圖片控件非常簡單,但功能功能不強大,不能對圖片拉申等。

在WM_PAINT中畫圖,相對複雜,但可以做很多特殊處理(如對圖片拉申、圖片取反等等)。

那麼下面就對兩種方法略述。

1、用圖片控件

在對話框中加入Picture控件,屬性頁中General->Type設爲Bitmap, Image中選中相關聯的圖片資源號。

這樣就編譯運行,你就會發現它己經可以了。

耶,不對,圖片覆蓋了其它控件!怎麼辦?

哈哈,這是由於你的Picture控件是後面放上去的。這樣它會顯示在最上層,所以有些控件看不到了。有兩種方法可以解決:

、選中所有控件Ctrl+A, 然後取消對圖片控件的選擇,將其它控件剪切Ctrl+X,再粘帖 Ctrl+C, 編譯運行或Ctrl+T看看,是不是可以了?

、在.rc文件中找到此對話框的定義,此處以例子中的一對話框爲例。

IDD_DLG_USE_STATIC DIALOGEX 0, 0, 266, 201

STYLE DS_MODALFRAMEWS_POPUPWS_VISIBLEWS_CAPTIONWS_SYSMENU

EXSTYLE WS_EX_APPWINDOW

CAPTION "DlgUseStatic"

FONT 9, "宋體"

BEGIN

bmp.GetBitmap;

在內存中創建一個位圖兼容設備

CDC dcMemory;

dcMemory.CreateCompatibleDC;

將圖片選入兼容設備

CBitmap *pOldBmp=dcMemory.SelectObject;

將兼容設備的內容copy到屏幕設備中,實現真正的Paint

dc.BitBlt;

將設備還原

dcMemory.SelectObject;

這樣圖片便顯示在主對話框上。

特殊處理:

是不是經常有人提到某些加快圖形顯示、減少閃爍?處理什麼WM_ERASEBKGND消息?

確實是這樣,應爲每個窗體重畫時,它先會發WM_ERASEBKGND消息,讓窗體用設置好的刷子將窗體需要重畫的區域刷一次,然後纔會發送WM_PAINT消息,將需要的再畫上去。這樣就可以保證不會有殘留的圖形。但這樣就會在短暫的時間內出現灰色背景,如果執行比較慢,就會讓人感覺到。因此如果你確定不需要清除原有的背景,那麼你就可以在OnEraseBkgnd中直接返回TRUE,或者直接在這裏面繪圖。

但一定要注意,不擦除背景時弄不好會帶來上些麻煩事,源碼中有此演示(由於一開始設置爲不擦除背景,所以窗體創建時,沒有畫圖的部分將顯示爲原來屏幕上的圖象)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章