Поиск:

Ответ в темуСоздание новой темы Создание опроса
> У CStatic выставлен стиль SS_LEFT и SS_RIGHT, Как такое может быть 
V
    Опции темы
deniska
Дата 1.6.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 0



Делаю свой Статик. В OnPaint чтоб знать как центровать текст запрашиваю GetStyle(
Код

void CMyStatic::OnPaint()
{
    DWORD st = GetStyle();        
    if( ( st & SS_RIGHT ) == SS_RIGHT )
    {
    //приходим сюда
    }
    
        
    if( ( st & SS_LEFT ) == SS_LEFT )
    {
        //и сюда
    }
        
        
    if( ( st & SS_CENTER ) == SS_CENTER )
    {
        //и сюда тоже
    }
}

Так вот под отладчиком заходит во все три условия. Как такое может быть? Где ошибся?
PM MAIL ICQ   Вверх
SenkraD
Дата 1.6.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 23



deniska,  ну вообще проверка флагов делается так, на сколько я знаю:
Код

void CMyStatic::OnPaint()    
{    
    DWORD st = GetStyle();         
    if(st & SS_RIGHT)    
    {    
    //приходим сюда    
    }    
     
         
    if(st & SS_LEFT)    
    {    
        //и сюда    
    }    
         
         
    if(st & SS_CENTER)    
    {    
        //и сюда тоже    
    }    
}


Собственно, я всегда так проверял и входило у меня только туда куда нужно было


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
zkv
Дата 1.6.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 16
Всего: 92



Цитата(SenkraD @  1.6.2007,  14:37 Найти цитируемый пост)
deniska,  ну вообще проверка флагов делается так, на сколько я знаю:

именно так, объясняется просто:
за каждое отдельное свойство отвечает определенный бит в значении, возвращаемом функцией  GetStyle()
например стиль SS_RIGHT задефайнен так:
#define SS_RIGHT            0x00000002L
те говорит о том что за этот стиль отвечает второй бит справа ( так как 2(dec) == 10(bin) ), те если в этом бите нарисована единичка, то стиль присутствует, если нолик - отсутствует. Значит нам надо проверить, установлен этот бит(1) или сброшен (0).
 
операция & позволяет проверить, установлен этот бит или нет, так как "логическое И" при взаимодействии любого значения с нулем дает нуль: 0 & x = 0 (благодаря этому игнорируются значения других битов). Единицу же выдает только если оба операнда - единицы: 1 & 1 = 1, таким образом проверяется установка только требуемого бита.

Аналогично производится установка битов операцией | "логическое ИЛИ", пользуемся тем, что 1 | x = 1   и   0 | x = x
PM MAIL   Вверх
Rapalex
Дата 2.6.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Итак в winuser.h написано:
Код

#define SS_LEFT             0x00000000L
#define SS_CENTER           0x00000001L
#define SS_RIGHT            0x00000002L
#define SS_ICON             0x00000003L
#define SS_BLACKRECT        0x00000004L
#define SS_GRAYRECT         0x00000005L
#define SS_WHITERECT        0x00000006L
#define SS_BLACKFRAME       0x00000007L


иными словами не парься и напиши так:
Код

{    
    DWORD st = GetStyle();         
    if((st & SS_RIGHT) == SS_RIGHT)    
    {    
    //приходим сюда    
    }    
     
         
    if((st & SS_LEFT) == SS_LEFT)    
    {    
        //и сюда    
    }    
         
         
    if((st & SS_CENTER) == SS_CENTER)    
    {    
        //и сюда тоже    
    }    
}


Должно работать.

Это сообщение отредактировал(а) Rapalex - 2.6.2007, 09:58


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 3.6.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rapalex @  2.6.2007,  10:56 Найти цитируемый пост)
if((st & SS_LEFT) == SS_LEFT)    

Очевидно, что это условие всегда будет TRUE.
Поэтому случай с LEFT нужно оставлять напоследок и заходить туда через else.


--------------------
...
PM   Вверх
deniska
Дата 4.6.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 0



Спасибо всем кто откликнулся, только все предложенное не помогло. Можно еще добавить что проверка на SS_GRAYRECT проходит нормально (это я проверяю чтоб знать какой статик рисовать: обычный или GroupBox). В общем вопрос остается открытым
PM MAIL ICQ   Вверх
Greeen
Дата 4.6.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



Код

void CMyStatic::OnPaint()
{
    CPaintDC dc(this);
    DWORD st = GetStyle();        
    if((st & SS_CENTER) == SS_CENTER)
    {
        AfxMessageBox(_T("Center"));
    }
    else if((st & SS_RIGHT) == SS_RIGHT)
    {
        AfxMessageBox(_T("Right"));
    }
    else
    {
        AfxMessageBox(_T("Left"));
    }
}



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
deniska
Дата 4.6.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 0



Greeen не понял чем отличается твой код приведенного мной выше, но на всякий случай попробовал и его, но рез тот же заходит в первое же условие. Может я чего-то не понимаю млин, но на сколько я понял если я в design time у Group Boxa меняю св-во Horizontal Alignment то оно должно возвращаться по GetStyle(). Он все время возвращает число 1342194439. может это как-то поможет... уж прям не знаю
PM MAIL ICQ   Вверх
Earnest
Дата 4.6.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Проверь стили Спаем, если сомневаешься. По крайней мере черную кошку в темной комнате ловить не будешь.
И вообще, разговор был о статиках, причем здесь груп-боксы? Это совершенно другой контрол, и стили у него другие... 
Возможно, ты удивишься, но это кнопка...


--------------------
...
PM   Вверх
deniska
Дата 4.6.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 0



так, в общем я в ауте. пошел читать книжки. Earnest как всегда ткнула рожей куда надо smile . всем спасибо
Ну не могу я понять чисто логически как может GroupBox от кнопки получаться.... 

Это сообщение отредактировал(а) deniska - 4.6.2007, 13:53
PM MAIL ICQ   Вверх
SeregaLBN
Дата 4.6.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Все эти интересуемы стили занимают первые два бита...
Поэтому и делается след проверка:
Код

//#define SS_LEFT             0x00000000L
//#define SS_CENTER           0x00000001L
//#define SS_RIGHT            0x00000002L
   DWORD st = GetStyle();    
   switch (st & 3) {
   case SS_LEFT:
      ::OutputDebugString(_T("SS_LEFT"));
      ::OutputDebugString(_T("\r\n"));
      break;
   case SS_CENTER:
      ::OutputDebugString(_T("SS_CENTER"));
      ::OutputDebugString(_T("\r\n"));
      break;
   case SS_RIGHT:
      ::OutputDebugString(_T("SS_RIGHT"));
      ::OutputDebugString(_T("\r\n"));
      break;
   }



Цитата(deniska @  4.6.2007,  13:49 Найти цитируемый пост)
Ну не могу я понять чисто логически как может GroupBox от кнопки получаться.... 

GroupBox - это статик. И стили у него  -  SS_...
Кнопки - это кнопки и радиобуттоны, checkbutton'ы. Ну и стили у них свои - BS_...
Код

/*
 * Button Control Styles
 */
#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
#if(WINVER >= 0x0400)
#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
#endif /* WINVER >= 0x0400 */

PM MAIL   Вверх
deniska
  Дата 5.6.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 0



SeregaLBN, теперь, начитаный MSDNом, смею поспорить по поводу
Цитата

GroupBox - это статик. И стили у него  -  SS_...

GroupBox - это кнопка со стилем BS_GROUPBOX.
Ну а по теме:
хоть и был изначально вопрос про CStatic а закончилось все кнопками, скажу все таки все о чем накипело. Оказывается:
1. кнопке со стилем BS_GROUPBOX и BS_OWNERDRAW никогда не придет WM_DRAWITEM, хотя мы вроде CButton. Чтобы рисовать контрол по-своему нужно ловить WM_PAINT, ну и в обработчике  пара BeginPaint-EndPaint тоже обязательна.
2. ну и собственно по стилям оказывается вот как дело обстоит:
Код

//ахтунг!!! ( BS_CENTER == BS_LEFT|BS_RIGHT!!!)    
if ( (Style & BS_CENTER) == BS_RIGHT ) // right aligned
{
}
else 
{
    if( ( !(Style & BS_CENTER)) || ( (Style & BS_CENTER) == BS_LEFT))// left aligned    / default
    {
    }
    else 
    {
        if ((Style & BS_CENTER) == BS_CENTER) // text centered
            {
            }
    }
}

Вот собственно и все. Если есть какие-то замечания - велкам!
PM MAIL ICQ   Вверх
Bukmop
Дата 5.6.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(deniska @  5.6.2007,  08:59 Найти цитируемый пост)
Если есть какие-то замечания - велкам!

Замечаний нет, но так красивее
Код

switch(Style & BS_CENTER)
{
    case BS_RIGHT:
        ...
        break;
    case BS_CENTER:
        ...
        break;
    default:
        ...
        break;
}
   

PM MAIL   Вверх
Earnest
Дата 7.6.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(deniska @  5.6.2007,  08:59 Найти цитируемый пост)
1. кнопке со стилем BS_GROUPBOX и BS_OWNERDRAW никогда не придет WM_DRAWITEM, хотя мы вроде CButton

Тут есть тонкость (описанная в MSDN мееелкими буквами, сама не так давно напоролась).
Оказывается, стиль BS_OWNERDRAW является эксклюзивным, и ни с каким другим не совмещается. Т.е., или BS_OWNERDRAW, или все остальное. Столкнулась с этим в тот момент когда потребовались чек-боксы, выглядящие как кнопки. Как только пытаешься сделать их OwnerDraw - вся чек-боксовость куда-то исчезает... Вот такие дела.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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