Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать что контрол содержит определенный стиль 
:(
    Опции темы
Alca
Дата 25.3.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Как узнать, что контрол содержит определенный стиль (например, BS_AUTO3STATE)? 

Это сообщение отредактировал(а) Alca - 25.3.2010, 13:52


--------------------
PM WWW ICQ Skype Jabber   Вверх
Andrey44
Дата 25.3.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Код

long style = GetWindowLong(hWnd, GWL_STYLE);
if(style&BS_AUTO3STATE)
    //do something



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 25.3.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

BOOL bIsStyleExists(HWND hWnd, ULONG ulStyle) {
    ULONG _ulStyle = ::GetWindowLong(hWnd, GWL_STYLE);
    if (_ulStyle & ulStyle) {
        return TRUE;
    }

    return FALSE;
}

HWND hCheckBox = NULL;
hCheckBox = CreateWindowEx(0, "Button", "checkbox", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTO3STATE, 
                        12, 12, 96, 32, g_hMainWnd, (HMENU) 113, g_hInstance, NULL);

bRes = bIsStyleExists(hCheckBox, BS_AUTO3STATE); 
/*DEBUG*/assert(FALSE != bRes);

bRes = bIsStyleExists(hCheckBox, BS_AUTOCHECKBOX); 
/*DEBUG*/assert(FALSE == bRes);    //<<<< валиться эссерт



--------------------
PM WWW ICQ Skype Jabber   Вверх
maxim1000
Дата 25.3.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



BS_AUTOCHECKBOX и BS_AUTO3STATE не разнесены в отдельные биты
из winuser.h:
#define BS_AUTOCHECKBOX     0x00000003L
...
#define BS_AUTO3STATE       0x00000006L

вот и получается, что когда стиль содержит BS_AUTOCHECKBOX, то and с BS_AUTO3STATE тоже будет ненулевой


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 26.3.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Там есть значение BS_TYPEMASK. Т.е. проверять надо так:
if ((GetStyle() & BS_TYPEMASK) == BS_AUTO3STATE) ...


--------------------
...
PM   Вверх
Alca
Дата 26.3.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Ну для кнопок есть BS_TYPEMASK, а для остальных контролов???
Для листбокса как?
Код

BOOL bIsStyleExists(HWND hWnd, ULONG ulStyle) {
    if (( ::GetWindowLong(hWnd, GWL_STYLE) & BS_TYPEMASK ) == ulStyle) {
        return TRUE;
    }

    return FALSE;
}


Код

//...
{
        HWND hCheckBox = NULL;
        hCheckBox = CreateWindowEx(0, WC_BUTTON,  "checkbox", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTO3STATE, 
            12, 12, 96, 32, g_hMainWnd, (HMENU) 113, g_hInstance, NULL);

        bRes = bIsStyleExists(hCheckBox, BS_AUTO3STATE); 
        /*DEBUG*/assert(FALSE != bRes);

        bRes = bIsStyleExists(hCheckBox, BS_AUTOCHECKBOX); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hCheckBox, BS_ICON); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hCheckBox, BS_NOTIFY); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hCheckBox, LBS_HASSTRINGS); 
        /*DEBUG*/assert(FALSE == bRes);
    }



    {
        HWND hListBox = NULL;
        hListBox = CreateWindowEx(0, WC_LISTBOX, "listbox", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT, 
            12, 50, 96, 32, g_hMainWnd, (HMENU) 114, g_hInstance, NULL);

        bRes = bIsStyleExists(hListBox, BS_AUTO3STATE); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hListBox, BS_AUTOCHECKBOX); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hListBox, BS_ICON); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hListBox, LVS_REPORT); 
        /*DEBUG*/assert(FALSE == bRes);

        bRes = bIsStyleExists(hListBox, LBS_HASSTRINGS); 
        /*DEBUG*/assert(FALSE == bRes);    //<<<<< !!!валиться здесь!!!

        bRes = bIsStyleExists(hListBox, WS_CHILD); 
        /*DEBUG*/assert(FALSE != bRes);      //<<<<< !!!валиться здесь!!!
    }
//...


Это сообщение отредактировал(а) Alca - 26.3.2010, 16:40


--------------------
PM WWW ICQ Skype Jabber   Вверх
Earnest
Дата 26.3.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Alca, ты принципиально сам не хочешь разбираться?
Думаешь, я наизусть эти флаги помню? Сходила в winuser.h, да посмотрела. Подумайте, какая эзотерика!
Если нет для списка такой маски, ну определи сам.


--------------------
...
PM   Вверх
maxim1000
Дата 26.3.2010, 20:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



вряд ли, общее решение, одинаковое для всех контролов возможно - наборы стилей у всех разные, какие-то могут сочетаться (тогда они занимают разные биты), какие-то значения взаимоисключающие (тогда они вполне могут занимать один и тот же промежуток).

если уж очень хочется чтобы хотя бы снаружи всё выглядело независимо от типа контрола, скорее всего, придётся внутри делать перебор классов окна и для каждого случая писать отдельный код...


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1048 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.