2011-10-04 216 views
1

我想使用自定義位圖來實現一個簡單的音量向上/向下按鈕,它將會有一個簡單的懸停效果和鼠標放下效果。
我的第一個想法是爲懸停處理WM_MOUSEMOVE,處理WM_LBUTTONUPWM_LBUTTONDOWN爲鼠標下降效果。自定義按鈕形狀

首先,這是最簡單的方法嗎?我能超類一個按鈕,只是畫位圖,忘記了文字...

然後,我有這個問題的背景,這應該是透明的,我知道我可以通過傳遞SRCANDBitBlt使用口罩,但這要求我爲每個按鈕設置2個圖像。有沒有什麼辦法只用一個圖像來做到這一點?就像我在圖像編輯器中放置綠色背景一樣,我是否可以用類似效果的綠色屏幕來掩蓋它?

回答

2

您需要創建一個常規按鈕,並用SetWindowSubclass對它進行子類化。該按鈕必須具有所有者繪製樣式,這意味着在父WndProc中,您正在處理WM_DRAWITEM。正如你正確地說,你將會在BitBlt'ing或StretchBlt'上背景圖像。

對於懸停事件,你必須做到以下幾點:

  • 有某種家長之間共享布爾和WndProc的子類,如。 IsMousedOver
  • 在子類WndProc中,過程WM_MOUSEMOVE。當這個消息被擊中,你應該設置IsMousedOver,然後驗證與InvalidateRect控制(這將觸發WM_DRAWITEM父)
  • 在父的WndProc,如果收到WM_MOUSEMOVE,你應該清楚IsMousedOver
  • WM_DRAWITEM父的WndProc,您應根據該州

如果你要處理的MouseUp /的MouseDown檢查IsMousedOver和BitBlt的,你可以布爾更改爲int,而不是和有三態。但是,大多數實現的MouseDown與普通按鈕相同,而MouseUp則僅僅是普通的背景。至於你對2張圖片的查詢,很可能會用一張圖片來做,但我以前沒有嘗試過。

+0

我該如何創建共享布爾值?我聽過很多次,全球變數是純粹的邪惡。那麼,有沒有其他方法可以創建共享變量? – Josh

+0

我的一個想法是採取面向對象的方法,並創建一個按鈕類,初始化程序調用CreateWindow,它將狀態和其他信息保存爲私有成員。但是,我仍然需要爲每個按鈕開設一個課程,而且他們很可能必須是全球化的。 – Josh

+0

不幸的是我編程C,而不是C++,所以沒有任何其他的選擇。我相信你可以想到一些面向對象的方法來正確地封裝布爾值:) –