2013-07-17 49 views
1

有沒有一種方法(API)獲得調整大小的像素的大小(垂直和水平)?如何獲得調整窗口大小的角度的像素大小

我指的是窗口每個角落的區域,您可以使用鼠標同時在兩個方向(左到右和從上到下)調整窗口大小。當您將鼠標懸停在窗口的角上並且鼠標光標是「對角線調整大小」光標時,您將會知道您的鼠標光標在那裏。

謝謝

編輯: 一個例子:將鼠標懸停在一個相當大的窗口的右邊緣。從窗口的中間(垂直)開始,沿着邊緣向上移動鼠標,直到水平尺寸光標變爲對角尺寸光標。如何通過詢問操作系統在光標發生變化時距離該位置多遠,從窗口頂部開始確定。

+0

什麼是讓你拿出_「我需要調整大小的邊界像素大小」 _解決深層的問題?你是否試圖捕捉調整大小事件,而不是有不同的(閱讀:更容易)的方式來做到這一點? – CodeCaster

+0

如果應用程序不覆蓋WM_NCHITTEST處理,它將在默認窗口過程中烘焙。在Win8上它看起來像是邊界高度的2倍和邊界寬度的1倍。真正的邊框尺寸,而不是Aero所在的尺寸。 –

+0

@CodeCaster。我想用我創建的控件來模擬窗口內頂層窗口的行爲。我希望它們在調整大小時具有完全相同的行爲,並且我不想嘗試從現有窗口獲取信息。我更喜歡從某些API或組合的API調用中獲取大小。這就是我問這個問題的原因。 –

回答

1

比較GetClientRectGetWindowRect的結果會告訴你非客戶端(邊界)區域沿窗口的每個邊沿有多寬。

如果您擔心它可能不會全部處於活動狀態(特別是沿着頂部),或者您想區分邊緣尺寸區域的對角線尺寸區域,則可以獲取步驟1中發現的座標,將它們傳遞給SendMessage(WM_NCHITTEST)請參閱its documentation瞭解各種返回碼。重複發送此消息沒有任何問題 - 它旨在爲每個鼠標移動事件調用,因此速度非常快。

+0

@BlurrySterk:非客戶區域的大小不是你問題的答案......它是一種獲取有趣值的方法,可以使用'WM_NCHITTEST'來查詢,它實際上可以解答你的問題。 'WM_NCHITTEST'告訴你究竟有多少非客戶端區域正在調整邊界,以及調整邊界的哪一部分是角落邊緣調整大小。 –

+0

如果您指的是使用GetClientRect和GetWindowRect獲取非客戶端區域;除非禁用了主題,否則拐角的大小與非客戶端區域無關,在這種情況下,它通過GetSystemMetrics正好是SM_CYSIZEFRAME + SM_CYCAPTION。啓用主題後,如果標題高度趨近於較小值,則它具有最小值,如果標題高度趨向於較大,則該值最大。例如,在Windows XP中,即使將標題高度設置爲25到50之間,角落大小仍將保持爲27.最小值將爲25.另外... –

+0

我想模擬頂級窗口的行爲在我創建的控件的窗口內。我希望它們在調整大小時具有完全相同的行爲,並且我不想嘗試從現有窗口獲取信息。我更喜歡從某些API或組合的API調用中獲取大小。這就是我問這個問題的原因。謝謝你的建議。 –

2

我會建議使用滾動條的大小。使用SM_CYHSCROLL和SM_CXVSCROLL調用GetSystemMetrics。也可以將SM_CYSIZEFRAME和SM_CXSIZEFRAME大小進行組合。

但我認爲更好的價值是使用狀態欄的高度。但是,即使Microsoft Windows似乎也使用了一些固定值,如截圖所示。

enter image description here

+0

我看到你的窗口有一個SizeGrip。如果你指的是那麼那就不是我所要求的。這是窗口四個角落中調整大小的大小。看看我的帖子中的編輯。是的,如果我正在尋找SizeGrip的大小,滾動條的大小就足夠了。如果我找不到具體問題的確切答案,那麼我想一個解決方法會迫使我考慮滾動條的大小。感謝那一個。 –

+0

我想你在找什麼是SM_CXSIZEFRAME和SM_CYSIZEFRAME。在這種情況下,拐角的表面由SM_CXSIZEFRAME * SM_CYSIZEFRAME計算(如果忽略尺寸夾點作爲附加的對角線尺寸區域)。 – bkausbk

+0

在Windows 7中,大小角的垂直像素大小爲8像素,水平大約是其兩倍。而且,不管邊框寬度(SM_CYSIZEFRAME)和標題高度(SM_CYCAPTION)如何變化,它都保持不變。正如我在WinXP中向Ben Voight提到的那樣,它在兩個方向上的範圍在25到27之間,但從未離開該範圍。因此,如果主題啓用窗口沒有絕對模式,那麼它在WinXP和Win7之間的未來Windows版本之間可能會有所不同,因此我不能做出假設,API或SysMetric將確保遵守Windows標準。 –

相關問題