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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2015, 12:16   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию WM_MENUCOMMAND LPARAM меньше 0

Здравствуйте.
Код:
      ImgContainer := CreateWindow('Static','ImageContainer',
      WS_CHILD or WS_VISIBLE or SS_BITMAP or SS_NOTIFY,0,0,10,10, wnd, 0, hInstance, nil);
      img := CreateWindow('Static','Main image' ,
      WS_CHILD or WS_VISIBLE or SS_BITMAP,
      0,0,10,10, ImgContainer, 0, hInstance, nil);

function createpopup1 : hmenu;
var
  mi : tagMENUINFO;
  mii : tagMENUITEMINFO;
//  i : Integer;
begin
  result := createpopupmenu;
  if result>0 then
  begin
  // Добавление кучи пунктов и подменю
  // ...............
      mi.cbSize := SizeOf(mi);
      mi.fMask := MIM_STYLE;
      if GetMenuInfo(Result,mi) then
      begin
        mi.fMask := mi.fMask or MIM_APPLYTOSUBMENUS;
        mi.dwStyle := mi.dwStyle or MNS_NOTIFYBYPOS;
        SetMenuInfo(Result,mi);
      end;
  end;
end;
Переопределяю оконную процедуру ImgContainer, где делаю:
Код:
    WM_RBUTTONUP:
    begin
      if menu1>0 then
      begin
        GetCursorPos(p);
        TrackPopupMenu(menu1,TPM_LEFTALIGN,P.x,P.y,0,form1,nil);
      end;
    end;
Потом в функции главного окна ловлю сообщение WM_MENUCOMMAND:
Код:

    WM_MENUCOMMAND:
    begin
      if Lpar<=0 then
      begin
        MessageBox(form1,PChar('LParam = '+ IntToStr(Lpar)), PChar('WM_MENUCOMMAND'),
                   MB_ICONERROR);
        Exit;
      end else
//    Обработка пунктов меню
Но один раз за несколько запусков, при каждом тыке на любой пункт меню LParam получается меньше нуля. Перезапустишь программу и всё нормально. Потом, через несколько перезапусков, опять начинается.
В чем дело?
BLACK_RAIN вне форума Ответить с цитированием
Старый 04.06.2015, 13:02   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
up________
LPARAM для WM_MENUCOMMAND это HMENU - с чего вы взяли, что он будет больше ноля?
waleri вне форума Ответить с цитированием
Старый 30.06.2015, 07:43   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
LPARAM для WM_MENUCOMMAND это HMENU - с чего вы взяли, что он будет больше ноля?
Как это с чего? Туда идентификатор меню приходит
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.06.2015, 09:08   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну и где сказано, что идентификатор должен быть больше нуля?
HMENU это вообще указатель, какие тут знаки.
waleri вне форума Ответить с цитированием
Старый 30.06.2015, 13:58   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну и где сказано, что идентификатор должен быть больше нуля?
HMENU это вообще указатель, какие тут знаки.
Я в недоумении
Вот же ясно написано:
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
Цитата:
Сообщение от MSDN

lParam

A handle to the menu for the item selected.
Что еще нужно? И как иначе узнать, в каком меню совершен клик?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.06.2015, 14:25   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

HMENU это беззнаковый тип (LongWord). А LPARAM longint насколько помню. Если HMENU будет больше максимального int - чего в LPARAM будет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.06.2015, 15:05   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
HMENU это беззнаковый тип (LongWord). А LPARAM longint насколько помню. Если HMENU будет больше максимального int - чего в LPARAM будет?
И что делать в таком случае? LPar как LongWord объявить?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.06.2015, 15:57   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

HMenu имеет вполне определенную константу нуля, иное значение принято считать корректным меню.
смотрим тут: https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx
и видим что NULL это отсутствие меню, остальное присутствие.
сравнивайте с NULL если вам надо знать есть или нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2015, 17:16   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
смотрим тут: https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx
и видим что NULL это отсутствие меню, остальное присутствие.
Где там такое написано?
HMENU это хэндл меню, а никакой не указатель! И обращаемся к меню мы именно по этому хэндлу! а не просто проверяем, есть меню или нет.
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.06.2015, 17:33   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну и обращайтесь, в чем проблема?
Просто надо проверять не > 0 а != 0, вот и все.


В самой винде все манипуляторы объявлены как указатели.
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
KeyBoardProc, расшифровка lParam KoBaL Общие вопросы Delphi 3 03.07.2013 10:09
lParam и wParam Sylar9 Win Api 5 10.04.2012 19:11
WPARAM wParam, LPARAM lParam, LPVOID *lpParam mizantrop32 Win Api 2 18.02.2011 12:10
WPARAM wParam, LPARAM lParam откуда берётся? Garic_ Общие вопросы C/C++ 4 09.06.2010 22:42
lb_GetSelItems. Проблемы с lParam Izhic Win Api 2 20.10.2008 18:16