Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2013, 11:26   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

stabud
конечно, LOWORD(WPARAM). Я просто не туда нажал
теперь по теме.
я сделал, как вы написали. получилось следующее:
Код:
const
idcb = 1000;
var
arr : array [0..1] of boolean;

    WM_DRAWITEM:
    begin
      lpdis := pdrawitemstruct(Lpar);
      if lpdis.CtlType = odt_button then
      begin
          t := gettext(lpdis.hwndItem);
          FillRect(lpdis.hDC,lpdis.rcItem,GetStockObject(WHITE_BRUSH));
          if (arr[lpdis.CtlID-idcb]=true) then
          DrawIconEx(lpdis.hDC,0,0,icon_Checked16,16,16,0,0,DI_NORMAL) else
          DrawIconEx(lpdis.hDC,0,0,icon_unChecked16,16,16,0,0,DI_NORMAL);
          TextOut(lpdis.hDC,18,2,PChar(t),Length(t));
      end;
    end;

    WM_COMMAND:
    case loword(Wparam)  of
      idcb:
      begin
        arr[loword(Wparam)-1000]:= not arr[loword(Wparam)-1000];
        settext(wnd,booltostr(arr[0])+','+booltostr(arr[1])); // макрос WM_SETTEXT
      end;
    end;
В результате я вижу, как значение в массиве меняется, но галочка переключается не всегда. А когда переключается, то при false она есть, а при true ее нет.
Что не так?

Последний раз редактировалось BLACK_RAIN; 30.03.2013 в 11:31.
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 16:12   #12
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
В результате я вижу, как значение в массиве меняется, но галочка переключается не всегда. А когда переключается, то при false она есть, а при true ее нет.
Что не так?
Сообщения приходят в последовательности: WM_DRAWITEM (2 шт) , WM_COMMAND

Проверьте в отладчике ячейку массива в обоих сообщениях.
stabud вне форума Ответить с цитированием
Старый 30.03.2013, 16:32   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от stabud Посмотреть сообщение
Сообщения приходят в последовательности: WM_DRAWITEM (2 шт) , WM_COMMAND
теперь ясно. Оно сначала перерисовывается, потом меняется значение в массиве. Сейчас заметил, что если тыкнуть кнопку, затем перекрыть ее другим окном, то галочка отрисовывается правильно.
но, во-первых, почему приходит именно два WM_DRAWITEM? Типа, первый раз при нажатии мыши, второй при отпускании еще до прихода WM_COMMAND?
И во-вторых, если эти сообщения приходят именно в такой последовательности, то как заставить кнопку перерисоваться после нажатия на нее? Ловить щелчок по кнопке через BN_CLICKED?

Последний раз редактировалось BLACK_RAIN; 30.03.2013 в 16:36.
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 16:47   #14
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
Оно сначала перерисовывается, потом меняется значение в массиве
Ну так это на руку

Цитата:
Сейчас заметил, что если тыкнуть кнопку, затем перекрыть ее другим окном, то галочка отрисовывается правильно.
А вот это непонятно, система должна сама перерисовывать

Цитата:
но, во-первых, почему приходит именно два WM_DRAWITEM?
Не могу сказать

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

добавлено позже:

Еще можете попробовать делать прорисовку не в

if lpdis.CtlType = odt_button then

а в:

If lpdis.itemState And ODS_SELECTED Then

Хотя это не правильно, но кто знает...

Последний раз редактировалось stabud; 30.03.2013 в 16:56.
stabud вне форума Ответить с цитированием
Старый 30.03.2013, 17:21   #15
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от stabud Посмотреть сообщение
Выложите пожалуйста ваш проект
выложил целиком. Это тестовый проект. Тут пустое окно и кнопка.
Цитата:
Сообщение от stabud Посмотреть сообщение
добавлено позже:

Еще можете попробовать делать прорисовку не в

if lpdis.CtlType = odt_button then

а в:

If lpdis.itemState And ODS_SELECTED Then

Хотя это не правильно, но кто знает...
так не надо назначение программы предполагает, что в определенный момент одна из процедур сама должна менять состояние checked/unchecked. Но для начала, надо разобраться с ручным переключением.
Вложения
Тип файла: rar checkbox test.rar (499.6 Кб, 9 просмотров)
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 17:30   #16
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Не вижу никаких проблем, программа работает как задумано. То есть такого не требуется:

Цитата:
Сейчас заметил, что если тыкнуть кнопку, затем перекрыть ее другим окном, то галочка отрисовывается правильно.
stabud вне форума Ответить с цитированием
Старый 30.03.2013, 17:41   #17
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

stabud
сейчас перепроверил и заметил еще вот что: нажал кнопку - значение изменилось. Переключаюсь на другое окно (без перекрытия) и тогда кнопка перерисовывается. Может это винда тупит? Я на windows 7 sp1 x64. В ХР смогу проверить завтра.
Какая у вас операционка?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 17:43   #18
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
Какая у вас операционка?
win7 sp1 x32

Кстати переключение флагов лучше сделать в сообщении

WM_DRAWITEM

в условии:

If lpdis.itemState And ODS_SELECTED Then

Потому что WM_COMMAND запаздывает в самом начале работы программы. То есть первые один, а то и два щелчка в пролете

Последний раз редактировалось stabud; 30.03.2013 в 17:59.
stabud вне форума Ответить с цитированием
Старый 31.03.2013, 14:56   #19
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от stabud Посмотреть сообщение
Потому что WM_COMMAND запаздывает в самом начале работы программы. То есть первые один, а то и два щелчка в пролете
Дело не в этом. Просто, после нажатия кнопки перерисовка почему-то не происходит.
Если сделать с окном какое-то действие, требующее перерисовки (например, изменить размер), то кнопка перерисуется в соответствии со значением в массиве.
BLACK_RAIN вне форума Ответить с цитированием
Старый 31.03.2013, 16:38   #20
stabud
Пользователь
 
Регистрация: 28.03.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Дело не в этом. Просто, после нажатия кнопки перерисовка почему-то не происходит.
Если сделать с окном какое-то действие, требующее перерисовки (например, изменить размер), то кнопка перерисуется в соответствии со значением в массиве.
У меня на winXP (32х битная) и win7 (32х битная) - работает корректно.
stabud вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с отрисовкой на экране Stilet Компьютерное железо 9 28.11.2010 17:11
Проблемы с отрисовкой в Direct3D Trapper Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 28.07.2009 18:49
Проблема с отрисовкой в PaintBox Делфи VSemV Помощь студентам 7 26.05.2009 13:32
Проблема с отрисовкой дочрних областей. DJ_Rain Win Api 0 30.04.2009 18:31
HELP!!! Проблема с отрисовкой frai Общие вопросы Delphi 1 11.05.2007 21:17