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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2016, 15:04   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию кнопка 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 в 07:26.
BLACK_RAIN вне форума Ответить с цитированием
Старый 12.09.2016, 10:39   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UserControl.Parent всегда равен null В чем причина? ImmortalAlexSan WPF, UWP, WinRT, XAML 0 20.06.2015 12: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 12:10
WPARAM wParam, LPARAM lParam откуда берётся? Garic_ Общие вопросы C/C++ 4 09.06.2010 22:42
Всегда позади и всегда впереди в одном приложении Legat Win Api 4 27.10.2007 15:48