2
A
回答
0
去用WM_NCPAINT
,不是很容易,但工作!
+0
是啊......它聽起來像是一件真正的雜事:-( – 2012-04-14 16:06:12
2
我發現這個代碼在winform標題欄上添加自定義按鈕。這是評價很差,很難理解,但有一個嘗試:)
// The state of our little button
ButtonState _buttState = ButtonState.Normal;
Rectangle _buttPosition = new Rectangle();
[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int GetWindowRect(IntPtr hWnd,
ref Rectangle lpRect);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
protected override void WndProc(ref Message m)
{
int x, y;
Rectangle windowRect = new Rectangle();
GetWindowRect(m.HWnd, ref windowRect);
switch (m.Msg)
{
// WM_NCPAINT
case 0x85:
// WM_PAINT
case 0x0A:
base.WndProc(ref m);
DrawButton(m.HWnd);
m.Result = IntPtr.Zero;
break;
// WM_ACTIVATE
case 0x86:
base.WndProc(ref m);
DrawButton(m.HWnd);
break;
// WM_NCMOUSEMOVE
case 0xA0:
// Extract the least significant 16 bits
x = ((int)m.LParam << 16) >> 16;
// Extract the most significant 16 bits
y = (int)m.LParam >> 16;
x -= windowRect.Left;
y -= windowRect.Top;
base.WndProc(ref m);
if (!_buttPosition.Contains(new Point(x, y)) &&
_buttState == ButtonState.Pushed)
{
_buttState = ButtonState.Normal;
DrawButton(m.HWnd);
}
break;
// WM_NCLBUTTONDOWN
case 0xA1:
// Extract the least significant 16 bits
x = ((int)m.LParam << 16) >> 16;
// Extract the most significant 16 bits
y = (int)m.LParam >> 16;
x -= windowRect.Left;
y -= windowRect.Top;
if (_buttPosition.Contains(new Point(x, y)))
{
_buttState = ButtonState.Pushed;
DrawButton(m.HWnd);
}
else
base.WndProc(ref m);
break;
// WM_NCLBUTTONUP
case 0xA2:
// Extract the least significant 16 bits
x = ((int)m.LParam << 16) >> 16;
// Extract the most significant 16 bits
y = (int)m.LParam >> 16;
x -= windowRect.Left;
y -= windowRect.Top;
if (_buttPosition.Contains(new Point(x, y)) &&
_buttState == ButtonState.Pushed)
{
_buttState = ButtonState.Normal;
// [[TODO]]: Fire a click event for your button
// however you want to do it.
DrawButton(m.HWnd);
}
else
base.WndProc(ref m);
break;
// WM_NCHITTEST
case 0x84:
// Extract the least significant 16 bits
x = ((int)m.LParam << 16) >> 16;
// Extract the most significant 16 bits
y = (int)m.LParam >> 16;
x -= windowRect.Left;
y -= windowRect.Top;
if (_buttPosition.Contains(new Point(x, y)))
m.Result = (IntPtr)18; // HTBORDER
else
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
private void DrawButton(IntPtr hwnd)
{
IntPtr hDC = GetWindowDC(hwnd);
int x, y;
using (Graphics g = Graphics.FromHdc(hDC))
{
// Work out size and positioning
int CaptionHeight = Bounds.Height - ClientRectangle.Height;
Size ButtonSize = SystemInformation.CaptionButtonSize;
x = Bounds.Width - 4 * ButtonSize.Width;
y = (CaptionHeight - ButtonSize.Height)/2;
_buttPosition.Location = new Point(x, y);
// Work out color
Brush color;
if (_buttState == ButtonState.Pushed)
color = Brushes.LightGreen;
else
color = Brushes.Red;
// Draw our "button"
g.FillRectangle(color, x, y, ButtonSize.Width, ButtonSize.Height);
}
ReleaseDC(hwnd, hDC);
}
private void Form1_Load(object sender, EventArgs e)
{
_buttPosition.Size = SystemInformation.CaptionButtonSize;
}
相關問題
- 1. 添加最小化/最大化按鈕到JDialog orJPanel
- 2. c#最大化,最小化和關閉窗體上的按鈕
- 3. Win7標題欄頂部的黑色圖層(最小化/最大化/關閉)
- 4. 添加幫助按鈕,但保持最大化和最小化
- 5. 如何檢索窗口最小化,最大化和關閉按鈕的大小?
- 6. 在Gnome中爲窗口添加最小化和最大化按鈕
- 7. 添加一個「最小化」按鈕JTabbedPane的標籤欄
- 8. 從窗口中刪除最小化/最大化按鈕,OpenTK
- 9. 從窗體的標題欄中關閉,最小化和最大化/恢復按鈕中移除工具提示
- 10. SetWindowsHookEx並單擊窗體凍結時的最小化/最大化/關閉按鈕
- 11. 如何添加一個自定義按鈕到窗口'最小化/最大化/關閉(x)
- 12. WPF如何獲得最大化/最小化按鈕圖標 - 自定義標題欄
- 13. 如何使標題欄,最小化按鈕和最大化按鈕在javascript中的網頁上不可見?
- 14. 如何渲染窗口關閉/最大化/最小化wpf中的按鈕?
- 15. 如何禁用最小化和最大化的窗口形式C#按鈕
- 16. 更改窗口圖標的最小化,關閉並最大化
- 17. 如何添加關閉最小化到標題Gridster.js小部件
- 18. 隱藏最大化/最小化和關閉按鈕的Matlab圖形窗口
- 19. 綁定到tkinter中的最小化/最大化按鈕
- 20. 窗體大小調整和最大化
- 21. 嵌入WebView的Gtk3窗口最大化按鈕最大化
- 22. 窗口最小化和最大化
- 23. 禁用窗口最大化/最小化
- 24. 如何在rich中添加最小化和最大化按鈕:popup面板窗口
- 25. 頂部菜單(關閉,最小化,最大化)的Java
- 26. 如何在最小化窗口後最大化窗口
- 27. Visual Studio不會讓我刪除最大化/最小化按鈕/圖標等
- 28. 窗體在關閉,最小化或最大化時掛起
- 29. 窗體上的AutoScrollMinSize毛刺最小化/最大化
- 30. 將控件移動到最大化窗體的外邊緣?
你必須自己畫他們,這樣做,而適應Windows主題是一個惡魔的任務。我會盡力找到一個不同的解決方案。 – 2012-04-14 14:37:07
另一種選擇是創建無邊框窗口並使用標準控件(按鈕,工具欄)來模擬最小化/最大化/關閉按鈕。一些參考:http://stackoverflow.com/questions/7955093/how-to-make-a-borderless-winforms-application。這也不容易。您沒有告訴我們關於您的應用程序的任何信息,因此我無法分辨是否值得您付出努力。 – surfen 2012-04-14 14:59:31
所以沒有什麼基本功能可以做asi的解釋,即時消息不會畫出來,但是使用無邊框形式和手動構建頂層窗體的解決方案相當高超:-) – 2012-04-14 15:59:40