2011-12-14 133 views
0

我有一個所有者繪製ListView控件的標題。如果標題不是所有者繪製的,則當鼠標位於標題列的某個列上時,我們可以獲得很好的懸停效果。在我製作了標題欄所有者之後,我必須自己照顧懸停效果。如何突出顯示鼠標懸停的標題列?

爲了捕捉它,我在標題窗口中監視WM_MOUSEMOVE消息,並且當我收到此消息時,首先重繪改變背景的標題列,然後再繪製文本和其他必要的圖形。只有一個,但...文本的字體變成加粗

你可以在下面看到它。第一個標題是我的,第二個標題是從Windows資源管理器在Date修改列上懸停效果。

enter image description here

爲什麼字體突然變得大膽? 這是實現懸停效果的正確方法嗎?也許我錯過了一些標題特定的通知?

回答

1

在所有者繪製模式中,您必須處理包括字體在內的所有內容。不要以爲你知道當前的DC字體是什麼。如果你想要一個特定的字體,你需要在繪製文本之前在DC中選擇一個字體。

+1

Yup - 粗體字體是DC的默認字體。海報可以將WM_GETFONT發送到標題控件以獲取適當的字體。 – Bukes

+0

Yeap,我用WM_GETFONT消息來得到它。 – Robertas

0

那麼,我解決了這個謎題:)儘管我仍然不知道爲什麼DrawThemeText函數中使用的字體突然改變了WM_MOUSEMOVE通知。我的方法仍然依靠捕獲WM_MOUSEMOVE事件並重新繪製鼠標指針下方的列。爲了不改變默認的標題字體(如在圖中我的問題)我用下面的代碼來獲取和設置它:

HFONT displayFont = (HFONT)SendMessage(header, WM_GETFONT, 0, 0); // gets default header font 
SelectObject(hdc, displayFont); // sets device context to use newly found font 

該解決方案至少有一個缺點:我重繪頭過於頻繁(每次鼠標在標題欄內移動時)。

相關問題