GetWindowlong, чтобы проверить стиль кнопки - PullRequest
0 голосов
/ 03 сентября 2011

Я хотел бы использовать raw winapi32, чтобы проверить стиль кнопки, будь то кнопка-флажок или кнопка.

bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
   return (0!=dwStyle | GetWindowLong(hBtn,GWL_STYLE));
}

Но это всегда возвращает false.Вы знаете способ проверить это?Спасибо.

Ответы [ 3 ]

5 голосов
/ 03 сентября 2011

Чтобы понять, как работают стили кнопок, нам нужно взглянуть на значения, используемые константами стилей:

#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

Другая важная ссылка - это тема Стили кнопок в MSDN ,Однако этот документ не объясняет, что флаги BS_PUSHBUTTON - BS_OWNERDRAW, флаги type являются взаимоисключающими.Другие флаги могут использоваться в сочетании с одним из флагов типа.Это может быть выведено из битовых комбинаций значений.

Документация для BS_TYPEMASK состояний:

Windows 2000: составной бит стиля, который получается в результате использования оператора OR вБиты стиля BS_ *.Он может использоваться для маскировки действительных битов BS_ * из заданной битовой маски.Обратите внимание, что это устарело и неправильно включает в себя все допустимые стили.Таким образом, вы не должны использовать этот стиль.

Однако я думаю, что это вводит в заблуждение и подтверждает то, что ybungalobill сказал в его ответ .Следовать этому совету не может быть никакого вреда.

Другими словами, вы должны замаскировать стиль с помощью BS_TYPEMASK, а затем проверить наличие определенного типа кнопки.

bool isButtonType(HWND hBtn, DWORD dwType)
{
     assert(dwType<=BS_TYPEMASK);
     return (GetWindowLong(hBtn, GWL_STYLE) & BS_TYPEMASK) == dwType;
}
4 голосов
/ 03 сентября 2011

Должно быть:

return (GetWindowLong(hBtn,GWL_STYLE) & BS_TYPEMASK) == dwStyle;
2 голосов
/ 03 сентября 2011

должно быть

return (dwStyle == (GetWindowLongPtr(hBtn, GWL_STYLE) & dwStyle));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...