首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Visual C# 任務列通知視窗(二):背景知識、Region 皮膚、無焦點顯示與雙重緩衝繪圖

     編輯:關於C語言

通知視窗架構概述

一般視窗 + 位圖皮膚 = 通知視窗。皮膚透過 OnPaintBackground 繪製至客戶區,配合 FormBorderStyle.None 移除邊框。

Region 皮膚製作流程

  1. 圖片編輯軟體 (Photoshop) 製作含透明背景色 (如粉紅) 的 BMP
  2. GraphicsPath 掃描非透明像素,建立矩形路徑
  3. Region 由路徑建立,指派給 Form.Region
  4. 視窗依 Region 輪廓顯示,達到不規則形狀

無焦點顯示解決方案:P/Invoke ShowWindow

.NET 無原生無焦點顯示 API,透過平台調用呼叫 user32.dll!ShowWindow。

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

// SW_SHOWNOACTIVATE = 4
ShowWindow(this.Handle, 4);

拖曳處理優化:SendMessage 模擬標題列點擊

傳統做法:滑鼠事件組合 (MouseDown/Move/Up) 手動計算位移。
優化做法:發送 WM_NCLBUTTONDOWN + HT_CAPTION 訊息,讓系統原生處理拖曳,效能更佳。

SendMessage(hWnd, WM_NCLBUTTONDOWN, HT_CAPTION, 0);

雙重緩衝繪圖技術

記憶體畫布離屏渲染 → 渲染完成一次性 BitBlt 至螢幕,大幅減少閃爍,畫面更平滑。

動畫狀態機

  • 狀態 1:升起 (Top 遞減)
  • 狀態 2:停留 (計時)
  • 狀態 3:隱藏 (Top 遞增超出螢幕)

兩個 Timer 分別控制升起/隱藏速度,intervalValue 調整動畫速度。

關閉按鈕區域偵測

定義 Rectangle CloseBtnRectangle,滑鼠點擊時檢測座標是否落入該區域,是則隱藏視窗。

Win32 API 宣告整理

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved