Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Удалить границу у TComboBox (2)

Delphi , Компоненты и Классы , Списки

Удалить границу у TComboBox  (2)

Code:
unit Unit1;

 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
 
type
TForm1 = class(TForm)
   ComboBox1: TComboBox;
   procedure FormCreate(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
function NewComboProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall;
var
  r,r1:TRect;
begin
 case uMsg of
    WM_PAINT: begin
                 GetWindowRect(wnd,r);
                 SetWindowRgn(wnd,CreateRectRgn(2, 2, r.Right-r.Left - 2, r.Bottom-r.Top - 2), True);
              end;
    WM_CTLCOLORLISTBOX:
                 begin
                  GetWindowRect(wnd,r);
                  GetWindowRect(lParam,r1);
                  if (r.Left=r1.Left) and (r.Right=r1.Right) then
                  begin
                   InflateRect(r1,-2,0);
                   SetWindowPos(lParam,0,r.Left+2,r.Bottom-2,r1.Right-r1.Left,r1.Bottom-r1.Top,SWP_NOZORDER);
                  end
                 end;
 end;
   result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(ComboBox1.Handle,GWL_USERDATA,SetWindowLong(ComboBox1.Handle, GWL_WNDPROC, LPARAM(@NewComboProc)))
end;
 
end.
Взято из http://forum.sources.ru
Автор: Krid

Программная задача на Delphi!

Проблема заключается в удалении рамки из контрола TComboBox. Код использует custom window procedure (NewComboProc) для достижения этого.

Вот шаг за шагом, что код делает:

  1. В обработчике события FormCreate, он настраивает custom window procedure для контрола ComboBox1 с помощью SetWindowLong.
  2. Custom window procedure (NewComboProc) обрабатывает два конкретных сообщения Windows:
    • WM_PAINT: Когда комбобокс рисуется, создает новый регион (используя CreateRectRgn) с 2-пиксельной рамкой вокруг оригинального прямоугольника комбобокса.
    • WM_CTLCOLORLISTBOX: Когда рисуется список комбобокса,.inflate-рует прямоугольник на 2 пикселя для эффективного удаления рамки.

В целом, этот код создает custom window procedure, которая удаляет рамку из контрола TComboBox. Однако я должен отметить, что это может не быть самым эффективным или рекомендованным способом достижения этой цели.

Альтернативное решение заключается в использовании свойства BorderStyle контрола TComboBox и установке его в bsNone. Это более простой и понятный подход:

ComboBox1.BorderStyle := bsNone;

Добавьте эту строку в конструктор вашей формы или в обработчик события FormCreate, в зависимости от ваших требований.

Удаление границы у TComboBox реализуется с помощью обработки сообщения WM_PAINT и настройки региона окна, а также изменения размера списка элементов в ответе на сообщение WM_CTLCOLORLISTBOX.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 17:24:31/0.0037589073181152/0