WM_DRAWITEM от меню или от Status Bar

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

WM_DRAWITEM от меню или от Status Bar

Сообщение Avtopic » 12.07.2008 (Сб) 20:08

Здравствуйте!

Имею класс для меню. Переводит главное меню формы в OWNERDRAW
Пользуюсь давно.

Заранее скажу, что никакого отношения этот класс к Status Bar-у не имеет.
и только что заметил, что мои OWNERDRAW пункты меню отображаются и в Status Bar-e.

Как фильтровать в сообщении WM_DRAWITEM, ITEM-и от Status Bar и от меню?

По идее должно быть различие в CtlType (структуры DRAWITEMSTRUCT), но оказывается(MSDN) как раз Status Bar CtlType не устанавливает.
Остается wParam. Если ITEM от меню, wParam должен бить 0, а если Status Bar wParam = идентификатор Status Bar-а

Стоит проверка wParam=0 но все ровно Status Bar рисует ITEM-и от меню.

Что за кривизна, и встречал или нет кто не будь такого?

Взял меню-проекты других авторов (не буду называть фамилии). Там в одном при добавлении Status Bar-а вообще IDE падает, а во втором точно так же как и уменья, рисуется меню, хотя у них, безусловно, стоят проверки wParam=0.

как различать эти ITEM-и?
Спасибо заранее!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 13.07.2008 (Вс) 12:44

Эм. А что мешает проверить, равно ли CtlType ODT_MENU, если не равно -- считать, что сообщение от StatusBar'а?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Re: WM_DRAWITEM от меню или от Status Bar

Сообщение Avtopic » 13.07.2008 (Вс) 15:11

Avtopic писал(а):(MSDN) Status Bar CtlType не устанавливает.

и по этому если на форме сидит StatusBar и меню то CtlType всегда 1 т.е. ODT_MENU. несмотря на то что WM_DRAWITEM пришел от StatusBar'а

Поискав еще, оказалось, что эта проблема известна. Но решение нигде не нашел.
Вернее нашел один, там нужно запомнить для всех Item-ов меню его родителя меню Hande-и и сравнивать их с hwndItem структуры DRAWITEMSTRUCT. Криво неправда ли?
ищу что-то получше...

Кстати в том же решении сидит следующее сочинение

Код: Выделить всё
procedure TMyForm.WndProc(var Message: TMessage);
  begin
    with Message do
      case Msg of
        WM_DRAWITEM:
          with PDrawItemStruct(Message.LParam)^ do
            if (CtlType = ODT_MENU) and Assigned(Menu) and
               (hwndItem = Statusbar.Handle) then
             ...
      end;
    inherited WndProc(Message);
  end;

что такое аналог “Assigned(Menu)” в VB?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 194

    TopList