2014-10-27 62 views
0

我被選中了一些代碼,實現一個最頂層的,透明的,並通過代碼點擊雖然形式:透明,點擊後,除了自定義標題欄形式

public enum GWL 
{ 
    ExStyle = -20 
} 

public enum WS_EX 
{ 
    Transparent = 0x20, 
    Layered = 0x80000 
} 

public enum LWA 
{ 
    ColorKey = 0x1, 
    Alpha = 0x2 
} 

[DllImport("user32.dll", EntryPoint = "GetWindowLong")] 
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex); 

[DllImport("user32.dll", EntryPoint = "SetWindowLong")] 
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong); 

[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")] 
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags); 

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    int wl = GetWindowLong(this.Handle, GWL.ExStyle); 
    wl = wl | 0x80000 | 0x20; 
    SetWindowLong(this.Handle, GWL.ExStyle, wl); 
    SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha); 
} 

有了這個代碼,所有的形式都是透明的,然後點擊 - 儘管絕對(文本,圖像,控制按鈕...)

當前窗體邊框樣式爲無(無邊框,無標題欄)。現在我想製作一個自定義標題欄,允許用戶將窗體移動到屏幕上的其他位置(如標題欄)。

這裏的問題,所有的表單都無法點擊它(原因是點擊代碼),如何做點擊表單但除了自定義標題欄?

自定義標題欄必須作爲其他元素透明。 我不想保留原來的標題欄,它對我的​​應用程序看起來很糟糕。

+0

如果窗體透明如何將用戶知道在哪裏的標題欄是? – TaW 2014-10-27 17:32:28

+0

表單是透明的,但用戶仍然看到文本和標題欄的形式:) – user3379240 2014-10-28 09:26:39

回答

0

使用WS_EX_LAYERED風格意味着您必須自己繪製您的表格,只有UpdateLayeredWindow函數。您仍然可以從控件中獲取所有消息,前提是您已使用UpdateLayeredWindow在那裏繪製。

UpdateLayeredWindow將繪製一個hdc: handle device context而已,所以如果你想畫的圖像:

IntPtr screenHdc = GetDC(IntPtr.Zero); 
IntPtr bmpHdc = CreateCompatibleDC(screenHdc); 
IntPtr hBitmap; 

Bitmap bmp = .... //load your bitmap, a png one for transparency 
hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); //Zero: background is transparent 
SelectObject(bmpHdc, hBitmap); 

UpdateLayeredWindow(this.Handle, screenHdc, ..., ..., bmpHdc, ..., ..., ..., ...); 

看看UpdateLayeredWindow function更多信息

+0

謝謝,我仍然不知道... :) – user3379240 2014-10-28 09:30:11