我想使用原始的winapi32來檢查按鈕樣式,無論是複選框按鈕還是按鈕。GetWindowlong檢查按鈕樣式
bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
return (0!=dwStyle | GetWindowLong(hBtn,GWL_STYLE));
}
但是,這總是返回false。你知道一個方法來檢查這個嗎?謝謝。
我想使用原始的winapi32來檢查按鈕樣式,無論是複選框按鈕還是按鈕。GetWindowlong檢查按鈕樣式
bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
return (0!=dwStyle | GetWindowLong(hBtn,GWL_STYLE));
}
但是,這總是返回false。你知道一個方法來檢查這個嗎?謝謝。
爲了瞭解按鈕樣式是如何工作的,我們需要看看在風格常數使用的值:
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L
#define BS_RADIOBUTTON 0x00000004L
#define BS_3STATE 0x00000005L
#define BS_AUTO3STATE 0x00000006L
#define BS_GROUPBOX 0x00000007L
#define BS_USERBUTTON 0x00000008L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_PUSHBOX 0x0000000AL
#define BS_OWNERDRAW 0x0000000BL
#define BS_TYPEMASK 0x0000000FL
#define BS_LEFTTEXT 0x00000020L
#define BS_TEXT 0x00000000L
#define BS_ICON 0x00000040L
#define BS_BITMAP 0x00000080L
#define BS_LEFT 0x00000100L
#define BS_RIGHT 0x00000200L
#define BS_CENTER 0x00000300L
#define BS_TOP 0x00000400L
#define BS_BOTTOM 0x00000800L
#define BS_VCENTER 0x00000C00L
#define BS_PUSHLIKE 0x00001000L
#define BS_MULTILINE 0x00002000L
#define BS_NOTIFY 0x00004000L
#define BS_FLAT 0x00008000L
#define BS_RIGHTBUTTON BS_LEFTTEXT
另一個重要參考是Button Styles topic at MSDN。但是,該文檔沒有解釋的是BS_PUSHBUTTON
到BS_OWNERDRAW
標誌,類型標誌是互斥的。其他標誌可以與其中一個類型標誌組合使用。這可以從值的位模式推斷出來。
的文檔BS_TYPEMASK
狀態:
的Windows 2000:一種複合樣式位,從使用OR操作上BS_ *樣式位結果。它可以用來屏蔽來自給定位掩碼的有效BS_ *位。請注意,這是過時的並且不能正確包含所有有效的樣式。因此,你不應該使用這種風格。
但是我認爲這是誤導性的,並認可ybungalobill在his answer中所說的內容。遵循這個建議不會有什麼傷害。
換句話說,你應該掩蓋風格與BS_TYPEMASK
,然後測試一個特定的按鈕類型。
bool isButtonType(HWND hBtn, DWORD dwType)
{
assert(dwType<=BS_TYPEMASK);
return (GetWindowLong(hBtn, GWL_STYLE) & BS_TYPEMASK) == dwType;
}
祝賀你,來自&和|的分配性,你的代碼只是一種混淆的方式來編寫'(GetWindowLong(hBtn,GWL_STYLE)&0xF)!= 0', – ybungalobill
@ybungalobill我不明白你的意思,我說,我的專長不是C++ –
這不是C++,它是數學。 (x&y1)!= 0)&&!((x&y2)!= 0)'iff'(x&y1)== 0 &&(x&y2)== 0' iff' (y1 | y2))== 0'。將上面的'yn'應用到BS_ *中的每一個,並且您的檢查等同於'(style&(BS_3STATE | BS_AUTO3STATE | BS_GROUPBOX | ...))== 0'。但是所有這些常量的位或者等於0xf,所以你檢查的實際上是'(style&0xf)== 0'(是的,對不起,我的意思是我在以前的評論中是平等的)。 – ybungalobill
應該
return (dwStyle == (GetWindowLongPtr(hBtn, GWL_STYLE) & dwStyle));
謝謝,我傳遞了值爲0的dwStyle BS_PUSHBUTTON,因此當GetWindowLongPtr失敗(返回0)時,上面的語句變爲true,這實際上並不幫助我檢查給定的按鈕是push還是checkbox類型。 –
它應該是:
return (GetWindowLong(hBtn,GWL_STYLE) & BS_TYPEMASK) == dwStyle;
「BS_TYPEMASK」的文檔聲明:「請注意,這是過時的並且不能正確包含所有有效的樣式,因此,您不應該使用此樣式。」 –
@大衛:是的。所以呢?這是你可以做的最好的一般事情,它適用於低於Vista的任何事情。 – ybungalobill
@大衛:我以爲它只包含了互斥的風格...... –
你通過'dwStyle'傳遞了什麼? –
謝謝,我使用BS_PUSHBUTTON。 –
BS_PUSHBUTTON等於零 – shf301