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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2010, 05:55   #1
jungle
Пользователь
 
Аватар для jungle
 
Регистрация: 22.11.2008
Сообщений: 65
По умолчанию Сабклассинг кнопки

Хотел изменить цвет кнопки, как оказалось, сделать через WM_CTLCOLORBTN это можно только если у кнопки стиль BS_OWNERDRAW. Получилось не совсем то, что было нужно. Попробовал сделать сабклассинг, изменился только курсор. Конечно, кнопку можно нарисовать самому, но может просто я что-то не правильно сделал?

Код:
program Sup;

uses
  Windows, Messages;

var
  wClass: TWndClassEx;
  Msg: TMsg;
  Button: HWND;
  OldProc: Pointer;

function ButtonWinProc(hWin, Msg, wParam, lParam: Integer): Integer; stdcall;
begin
  Result := 0;
  case Msg of
    WM_DESTROY, WM_CLOSE: Exit;
  end;
  // вызов оригинальной оконной процедуры:
  Result := CallWindowProc(OldProc, hWin, Msg, wParam, lParam);
end;

function WindowProc(hWin, Msg, wParam, lParam: Integer): Integer; stdcall;
var
  TButtonClass: TWndClassEx;
begin
  case Msg of

    WM_CREATE:
    begin
      // суперклассинг:
      GetClassInfoEx(0, 'button', TButtonClass);
      OldProc := TButtonClass.lpfnWndProc;  // запоминаем старую оконную процедуру

      TButtonClass.cbSize           := Sizeof(TButtonClass);  // модификация класса
      TButtonClass.lpfnWndProc   := @ButtonWinProc;
      TButtonClass.hCursor          := LoadCursor(0, IDC_CROSS);
      TButtonClass.hbrBackground := CreateSolidBrush(rgb(255, 0, 0));
      TButtonClass.lpszClassName := 'ButtonWindowClass';

      RegisterClassEx(TButtonClass);
      Button := CreateWindowEx(0, 'ButtonWindowClass', 'Кнопка',
        WS_CHILD or WS_VISIBLE, 240, 160, 80, 20, hWin, 0, hInstance, nil);
      SendMessage(Button, WM_SETFONT, GetStockObject(ANSI_VAR_FONT), 0);
    end;

    WM_DESTROY:
    begin
      UnregisterClass('ButtonWindowClass', hInstance);  // уничтожение класса
      PostQuitMessage(0);
    end;

  end;
  Result := DefWindowProc(hWin, Msg, wParam, lParam)
end;

begin
  wClass.cbSize           := Sizeof(wClass);
  wClass.lpfnWndProc   :=  @WindowProc;
  wClass.hCursor          := LoadCursor(0,IDC_ARROW);
  wClass.hbrBackground := 1;
  wClass.lpszClassName := 'CN';

  RegisterClassEx(wClass);

  CreateWindowEx(0, 'CN', 'Кнопка', WS_OVERLAPPEDWINDOW or WS_VISIBLE,
    450, 300, 340, 220, 0, 0, hInstance, nil);

  while GetMessage(Msg, 0, 0, 0) do
    DispatchMessage(Msg)
end.
Вложения
Тип файла: rar Суперклассинг.rar (5.2 Кб, 12 просмотров)
jungle вне форума Ответить с цитированием
Старый 25.02.2010, 05:56   #2
jungle
Пользователь
 
Аватар для jungle
 
Регистрация: 22.11.2008
Сообщений: 65
По умолчанию

Вот так еще делал, результат тот же:
Код:
program Sub;

uses
  Windows, Messages;

var
  wClass: TWndClassEx;
  Msg: TMsg;
  Button: HWND;

function ButtonWinProc(hWin, Msg, wParam, lParam: Integer): Integer; stdcall;
begin
  Result := 0;
  case Msg of
    WM_DESTROY, WM_CLOSE: Exit;
  end;
  // вызов оригинальной оконной процедуры:
  Result := CallWindowProc(Pointer(GetWindowLong(hWin, GWL_USERDATA)), hWin, Msg, wParam, lParam);
end;

function WindowProc(hWin, Msg, wParam, lParam: Integer): Integer; stdcall;
begin
  case Msg of

    WM_CREATE:
    begin
      Button := CreateWindowEx(0, 'Button', 'Кнопка',
        WS_CHILD or WS_VISIBLE, 240, 160, 80, 20, hWin, 0, hInstance, nil);
      SendMessage(Button, WM_SETFONT, GetStockObject(ANSI_VAR_FONT), 0);

      SetClassLong(Button, GCL_HCURSOR, LoadCursor(0, IDC_CROSS));  // сабклассинг
      SetClassLong(Button, GCL_HBRBACKGROUND, CreateSolidBrush(RGB(255, 0, 0)));  // сабклассинг
    end;

    WM_DESTROY:
    begin
      UnregisterClass('ButtonWindowClass', hInstance);  // уничтожение класса
      PostQuitMessage(0);
    end;

  end;
  Result := DefWindowProc(hWin, Msg, wParam, lParam)
end;

begin
  wClass.cbSize        := Sizeof(wClass);
  wClass.lpfnWndProc   :=  @WindowProc;
  wClass.hCursor       := LoadCursor(0,IDC_ARROW);
  wClass.hbrBackground := 1;
  wClass.lpszClassName := 'CN';

  RegisterClassEx(wClass);

  CreateWindowEx(0, 'CN', 'Кнопка', WS_OVERLAPPEDWINDOW or WS_VISIBLE,
    450, 300, 340, 220, 0, 0, hInstance, nil);

  while GetMessage(Msg, 0, 0, 0) do
    DispatchMessage(Msg)
end.
Вложения
Тип файла: rar Сабклассинг.rar (5.1 Кб, 11 просмотров)
jungle вне форума Ответить с цитированием
Старый 25.02.2010, 08:15   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.delphiworld.narod.ru/base/colour_button.html
Рекомендую по изучать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кнопки Артэс Win Api 10 08.12.2009 20:04
Кнопки Принц HTML и CSS 1 29.05.2008 17:25
UCOZ: Кнопки кнопки на изображении ReDuX HTML и CSS 19 25.04.2008 02:39
Кнопки )Игнат( Компоненты Delphi 21 22.01.2008 09:35
триггерные кнопки и кнопки переключатели в DELPHI MARGO Помощь студентам 3 12.11.2007 17:35