總是會在論壇裡看到類似這樣的問題,「如何通過按鈕更換一幅」,「怎樣將顯示在對話方塊中」,「mfc的picturectrl怎樣操作」等等,不一而足。面對這類問題我一般都會建議通過cwnd派生乙個自定義控制項來自行處理,不過這話說起來容易,可是這個控制項要如何實現呢?所以經常會想不妨做個例子和大家分享一下,當然如果大家有什麼更好的辦法我也可以從中學習借鑑。但問題又來了,這類例子簡單實現其實就是乙個函式的問題——onpaint,但要做的精緻些要處理的方面又太多,容易喧賓奪主。怎麼才能找個折中的方案呢,什麼樣題材的例子更具代表性呢?這兩天逛論壇乙個帖子給了我啟示,做個訊號燈的控制,即可以說明問題又簡單實用,大家還可以舉一反三,這應該是個不錯的主意,於是做了乙個demo,寫了這篇文章。
這回做了乙個gif的效果圖,我做了乙個三態的狀態燈,分別實現的正常(綠色)、警告(紅色)和不可用(灰色)的狀態表示。狀態切換是通過單選按鈕實現的,當然這個可以通過任何我們想要的方式控制。大家可以看得出來,這個例子做的比較粗糙,其實就是更換三張不同的,為了突出主要功能我沒有新增不必要的修飾,比如鏤空的處理等。
落實到具體實現,正如前文所說我是通過cwnd派生出了乙個csignallampctrl來實現自定義控制項,然後就是在這個類的onpaint裡繪製點陣圖了。說到這我插一句,起初我剛做介面程式設計的時候每每遇到問題就會把需求往mfc的標準控制項上靠,找乙個最接近的過載自繪一下,如果沒有接近的就統統過載cstatic實現。可後來發現,靜態控制項也有很多的特殊處理,為了實現「靜態」static有很多處理是我們做一般控制項時不需要的,所以在使用這種控制項的時候就會產生很多不必要的麻煩。所以後來我開始嘗試通過自定義控制項解決問題,而且越來越適應這種方式。自定義控制項雖然沒有一些現成可用的訊息,但是它給了我們最大的控制權和自由度,使我們可以做到隨心所欲沒有束縛。
使用自定義控制項只需要注意乙個小細節,控制項的屬性編輯器裡可以看到class項,這裡要填寫控制項的類名。同時這個類名要進行註冊,所以在我的類中可以找到registerctrlclass,它的具體實現**為
[cpp]view plain
copy
void
csignallampctrl::registerctrlclass()
我通常將它放到控制項的建構函式中以便使用時自動進行註冊。
關於這個例子其實也沒有什麼需要特別說明的,onpaint函式很簡單,就是繪製一張位圖,我的點陣圖都是放到資源中的,當然通過檔案讀進來顯示也沒有問題。而且通過cimage或gdi+我們也可以顯示非位圖的影象,這個有興趣的讀者可以自行嘗試。onpaint的**如下
[cpp]view plain
copy
void
csignallampctrl::onpaint()
可以注意到載入點陣圖的時候是通過乙個變數nidbitmap實現的,這裡存放欲顯示的點陣圖的資源id,切換位圖就是切換這個id,我做了乙個函式setstate來實現
[cpp]view plain
copy
void
csignallampctrl::setstate(statetype nstate)
invalidate();
}
而在radio訊息中對它的呼叫也很簡單
[cpp]view plain
copy
void
csignallampdlg::onbnclickedradionormal()
這裡大家可以使用任何一種自己認為合理的切換的方式,如果通過ontimer訊息控制訊號燈的狀態切換就可以實現訊號燈閃爍的動畫效果。最後要提的一點是我在presubclasswindow中我對控制項的大小做了限制,使其與的大小相同,具體**為
[cpp]view plain
copy
void
csignallampctrl::presubclasswindow()
看看,希望大家提出寶貴意見。由於水平有限例子功能過於簡單,讓大家見笑了。
VS2010新增自定義控制項
一 自定義乙個空白控制項 1 先建立乙個mfc工程 2 在視窗中新增乙個自定義控制項 toolbox custom control 屬性 class隨便填寫乙個控制項類名 cmywin 這個名字用於以後註冊控制項用的,註冊函式 registerwindowclass 3 建立乙個類 在視窗中,右擊c...
自定義VS2010 新版msdn libary樣式
vs2010的新版msdn 帶來了不少人的抱怨。不能索引,又不能收藏。但是h3viewer就幫我們解決了這個問題,雖然速度欠佳,但是比直接用瀏覽器開啟2010 版的msdn已經好很多了。雖然解決了索引的問題,但是對於新版msdn裡面文章的排版依然是非常的不爽。那個行間距 字都沾在一起了 好了,廢話不...
VS2010編譯執行自定義命令
概述 本文描述如何配置vs2010,讓vs2010編譯之前執行一段自定義命令,編譯完成之後再執行另外自定義命令。軟體環境 vs2010 英文版 已有編譯執行良好專案,本人專案名epack 編譯前執行命令 project epack properties 彈出屬性對話方塊左側屬性列表 configur...