我正在開發這個小型 WinForm 應用程序,并決定使用具有半透明背景的自定義繪制工具提示。所以我開始將OwnerDrawToolTip 上的屬性設置為True,為Draw和Popup事件創建事件處理程序(請參閱下面的示例代碼。注釋版本也不起作用)。private void toolTip_Popup(object sender, PopupEventArgs e){ e.ToolTipSize = new Size(400, 400);}private void toolTip_Draw(object sender, DrawToolTipEventArgs e){ //e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(e.Bounds.Location, e.Bounds.Size)); e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(0, 0, 400, 400));}現在,當第一次顯示特定控件的工具提示時,一切都按預期工作。請參閱下面的圖片(400x400 工具提示,半透明紅色背景)。但是當我第二次將鼠標懸停在同一個控件上時,工具提示失去了它的半透明性。見下圖。為什么呢?
3 回答
月關寶盒
TA貢獻1772條經驗 獲得超5個贊
第一次將鼠標懸停在控件上時,將使用透明色 (ARGB.120) 創建一個新的工具提示實例。當您在工具提示外單擊時,是完全釋放工具提示對象還是您只是將實例設置為不可見?
當您第二次將鼠標懸停在實例上時,如果舊的工具提示對象沒有被釋放,則有可能再次調用相同的對象。因此,現在當您在現有工具提示上使用 color = ARGB.120 執行 Graphics.FillRectangle() 時,您只是在其上疊加了另一層 ARGB.120 顏色,這將使其進一步變暗,因為顏色級別已更改。
因此,當您在第一次調用工具提示后單擊工具提示之外時,您可能需要處理工具提示對象(或 e.Graphics 對象,如果這不影響應用程序的其他部分)并每隔一段時間創建新的工具提示對象將鼠標懸停在控件上的時間。
慕無忌1623718
TA貢獻1744條經驗 獲得超4個贊
需要告訴 Windows 需要重新繪制彈出窗口下方的窗口。這是通過“分層窗口”樣式完成的。通過分層,內容以 z 順序繪制,透明度混合工作。如果沒有分層,只有頂部窗口會被發送重繪,并且它會在 DC 屏幕緩沖區中無意義的剩余數據之上進行繪制。
您可以嘗試p/invokingSetLayeredWindowAttributes
我強烈建議閱讀有關分層 Windows 的 MSDN 文檔: 這里和這里
- 3 回答
- 0 關注
- 473 瀏覽
添加回答
舉報
0/150
提交
取消
