2012-03-04 107 views
2

我正在使用普通C++(不含MFC)來實現應用程序。 我想添加自定義的最小/最大/關閉按鈕自定義最小最大關閉按鈕實現

下面的代碼是我用過的。 對於HTCAPTION和其他與邊界相關的定義工作像魅力, 但我無法獲得HTMINBUTTON,HTMINBUTTON,HTCLOSE以相同的方式工作。 是否需要爲NCHITTEST生效才需要執行其他任何操作?

// Defining min/max/close 
if ((p.x > rt.right - 130) && (p.x < rt.right - 104) && 
    (p.y > 41) && (p.y < 67)) 
    return HTMINBUTTON; 
else if ((p.x > rt.right - 100) && (p.x < rt.right - 74) && 
    (p.y > 41) && (p.y < 67)) 
    return HTMAXBUTTON; 
else if ((p.x > rt.right - 70) && (p.x < rt.right - 44) && 
    (p.y > 41) && (p.y < 67)) 
    return HTCLOSE; 

// Defining window border and caption 
else if ((p.x > EDGE) && (p.x < rt.right-EDGE) && 
    (p.y > EDGE) && (p.y < rt.bottom-EDGE)) 
    return HTCAPTION; 
else if (p.x <= EDGE && p.y <= EDGE) 
    return HTTOPLEFT; 
else if (p.x <= EDGE && p.y >= rt.bottom - EDGE) 
    return HTBOTTOMLEFT; 
else if (p.x >= rt.right - EDGE && p.y <= EDGE) 
    return HTTOPRIGHT; 
else if (p.x >= rt.right - EDGE && p.y >= rt.bottom - EDGE) 
    return HTBOTTOMRIGHT; 
else if (p.x <= EDGE) 
    return HTLEFT; 
else if (p.x >= rt.right - EDGE) 
    return HTRIGHT; 
else if (p.y <= EDGE) 
    return HTTOP; 
else if (p.y >= rt.top - EDGE) 
    return HTBOTTOM; 
else 
    return DefWindowProc(hWnd, message, wParam, lParam); 
+0

我認爲這篇文章正在做類似於你在做什麼:http://www.codeproject.com/Articles/3728/C-does-Shell-Part-3 – gideon 2012-03-04 04:25:23

+0

它看起來如此,但它不是C++源碼。它仍然適用?我對C#不熟悉。 – 2012-03-04 06:44:48

回答

1

如果您正在繪製程序的整個非客戶區(即你有一個自定義窗口的標題欄和邊框),那麼你最好的辦法是刪除默認的標題欄和邊框使用整個客戶區作爲您的窗口。這樣,您可以使用最小/最大/退出按鈕所需的圖形制作自定義按鈕(或所有者繪製的按鈕),並將它們作爲按鈕控件放置在標題欄區域中。由於您正在處理WM_NCHITTEST消息,因此您的程序仍會像標題欄和邊框一樣運行。我今天只用我的自定義窗口做了這件事,它工作得很好。

編輯:我忘了補充說,返回HTMAX/HTMIN/HTCLOSE不會導致窗口反應。您從WM_NCHITTEST返回的值將在其他消息的WPARAM中發送,特別是WM_NCLBUTTONDOWN和WM_NCLBUTTONUP。不幸的是,WM_NCLBUTTONUP消息沒有得到正確發送,因爲當你點擊標題欄時,它會捕獲鼠標。

+0

這就是我正在做的,但正如你所說,HTMAX/HTMIN/HTCLOSE不會導致窗口反應。我需要一個解決方案。 – 2012-07-15 15:43:19

0

我有一個適合我的解決方案。下面是我的步驟重現

1. WM_NCHITTEST

訂閱WM_NCHITTEST。現在你必須處理消息並返回你的測試結果。

這可能會幫助您:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx

對我來說,我的窗體上創建多個領域。 左上,上,TopRight,標題,左,右,BOTTOMLEFT,底部,BottomRight,MinButton,MAXBUTTON,CloseButton

他們每個人都爲長方形定義了我的窗體的區域。我只是檢查鼠標光標是否位於其中一個區域並返回正確的HT-CODE。

2. WM_NCLBUTTONDOWN

現在訂閱WM_NCLBUTTONDOWN。檢查WPARAM是否需要處理NCHITTEST值。 爲最小化按鈕檢查HTMINBUTTON(0x0008)

但在這裏,我只是在結果中返回IntPtr.Zero。這表明我處理了這個信息。

3. WM_NCLBUTTONUP

之後訂閱WM_NCLBUTTONUP。檢查WPARAM是否符合您的目標NCHITTEST值,並在此處執行您想要的操作。

我會稍後上傳我的信息!

相關問題