一般視窗 + 位圖皮膚 = 通知視窗。皮膚透過 OnPaintBackground 繪製至客戶區,配合 FormBorderStyle.None 移除邊框。
GraphicsPath 掃描非透明像素,建立矩形路徑Region 由路徑建立,指派給 Form.Region.NET 無原生無焦點顯示 API,透過平台調用呼叫 user32.dll!ShowWindow。
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
// SW_SHOWNOACTIVATE = 4
ShowWindow(this.Handle, 4);
傳統做法:滑鼠事件組合 (MouseDown/Move/Up) 手動計算位移。
優化做法:發送 WM_NCLBUTTONDOWN + HT_CAPTION 訊息,讓系統原生處理拖曳,效能更佳。
SendMessage(hWnd, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
記憶體畫布離屏渲染 → 渲染完成一次性 BitBlt 至螢幕,大幅減少閃爍,畫面更平滑。
兩個 Timer 分別控制升起/隱藏速度,intervalValue 調整動畫速度。
定義 Rectangle CloseBtnRectangle,滑鼠點擊時檢測座標是否落入該區域,是則隱藏視窗。
[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);