Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 10.09.2016, 16:04   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 683
По умолчанию кнопка BS_OWNERDRAW, WPARAM всегда равен 0

Здравствуйте.
Нужна кнопка с ручной отрисовкой. Ставлю ей стиль WS_CHILD or WS_VISIBLE or BS_OWNERDRAW. Согласно MSDN, родительскому окну должно приходить сообщение WM_DRAWITEM, в котором WPARAM равен идентификатору контрола, а LPARAM это указатель на структуру DrawItemStruct. Ну вы это и без меня прекрасно знаете.
Проблема в том, что это нифига не так. На самом деле в сообщении WM_DRAWITEM, посланного кнопкой, WPARAM равен нуль, а LPARAM не понятно чему.
Хотя в MSDN написано:
Цитата:

wParam

Specifies the identifier of the control that sent the WM_DRAWITEM message. If the message was sent by a menu, this parameter is zero.
Код:
function WindowProc1(wnd:HWND; Msg : uint; Wpar:Wparam; Lpar:LPARAM):Lresult; stdcall;
var
  dis : PDrawItemStruct;
  r : TRect;
Begin
  case msg of

    WM_DRAWITEM:
    begin
      if Wpar<>0 then
      begin
         dis := pdrawitemstruct(@Lpar);
         if dis.hwndItem = btn then
         begin
           GetClientRect(dis.hwndItem,r);
           FillRect(dis.hDC, r, GetStockObject(BLACK_BRUSH));
         end;
      end;
    end;

    WM_CREATE:
    begin

      btn := CreateWindow('Button', '',
      WS_CHILD or WS_VISIBLE or  BS_OWNERDRAW,
      0,0,90,90, wnd, 0, hInstance, nil);
    end;

    WM_KEYDOWN:
    DestroyWindow(wnd);

    wm_destroy :
    Begin
      unregisterclass(myclass,hinstance);
      postquitmessage(0);
      Result:=0;
      exit;
    End;

  else Result:=DefWindowProc(wnd,msg,wpar,lpar);
  end;
End;
Если это не правильно, то как тогда делается кнопка с ручной отрисовкой?

Последний раз редактировалось BLACK_RAIN; 11.09.2016 в 08:26.
BLACK_RAIN вне форума Ответить с цитированием
Старый 12.09.2016, 11:39   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,103
По умолчанию

Насколько я вижу, у вашей кнопки идентификатор равен нулю, что собственно и получаете в параметре WPARAM.
Пересмотрите параметры CreateWindow().
Кроме того, можете проверить содержимое DRAWITEMSTRUCT - там есть CtlType и CtlID.
waleri вне форума Ответить с цитированием
Старый 12.09.2016, 11:50   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 683
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Насколько я вижу, у вашей кнопки идентификатор равен нулю, что собственно и получаете в параметре WPARAM.
А, вот как. Я думал, что они идентификатором хэндл называют Тогда нет вопросов.
И еще я, как обычно, забыл @ дописать. По-этому не работало.
BLACK_RAIN вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UserControl.Parent всегда равен null В чем причина? ImmortalAlexSan WPF, UWP, WinRT, XAML 0 20.06.2015 13:10
Message.wParam равен VK_BACKSPACE: клавиша, которую не жал, порождает сообщение? malor Общие вопросы Delphi 0 09.08.2011 21:25
WPARAM wParam, LPARAM lParam, LPVOID *lpParam mizantrop32 Win Api 2 18.02.2011 13:10
WPARAM wParam, LPARAM lParam откуда берётся? Garic_ Общие вопросы C/C++ 4 09.06.2010 22:42
Всегда позади и всегда впереди в одном приложении Legat Win Api 4 27.10.2007 15:48


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS