Autor Téma: Vodoznak v ComboBoxu  (Přečteno 420 krát)

Offline ShaneZB

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
  • HJ-SOFT s.r.o.
    • Verze Delphi: Delphi 10
Vodoznak v ComboBoxu
« kdy: 13-04-2018, 17:15:54 »
Ahoj všem.
Mám vlastní komponentu pro Combobox. Potřebuju do ní malovat "vodoznak" = obrázek pod textem.
Mělo by to vypadat asi takto
Zkoušel jsem všechno možné i nemožné a ten vodoznak tam nedostanu ...
Napadá někoho něco?

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1103
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Vodoznak v ComboBoxu
« Odpověď #1 kdy: 14-04-2018, 12:10:46 »
Co je vlastní komponenta? Jen vytuněný combobox, nebo od základu vlastní? A pomocí vlastního vykreslení to nejde?

např.
https://stackoverflow.com/questions/14283783/combobox-simple-with-bitmap

Offline ShaneZB

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
  • HJ-SOFT s.r.o.
    • Verze Delphi: Delphi 10
Re:Vodoznak v ComboBoxu
« Odpověď #2 kdy: 14-04-2018, 15:40:29 »
Je to "vytuněný" combo. DrawItem nelze použít, protože se občas používá událost OnDrawItem a hlavně, já ten symbol nechci malovat do rozbalovacího seznamu.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1103
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Vodoznak v ComboBoxu
« Odpověď #3 kdy: 15-04-2018, 13:36:20 »
Aha, kdyby to byl DropDownList, tak to asi jde. Takhle to nejspíš standardní cestou nepůjde a budeš muset udělat vlastní komponentu,
jako inspiraci můžeš vzít "NavigationBars"
http://www.unsigned.sk/blog/index.php?itemid=89

Offline ShaneZB

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
  • HJ-SOFT s.r.o.
    • Verze Delphi: Delphi 10
Re:Vodoznak v ComboBoxu
« Odpověď #4 kdy: 16-04-2018, 09:28:54 »
Jenže to je postavené nad TEdit. To by přineslo více problémů než užitku - je to použité v dost velkém projektu.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 776
  • Karma: 55
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Vodoznak v ComboBoxu
« Odpověď #5 kdy: 16-04-2018, 16:04:45 »
Není nad to se vrátit do pubertálních let...

Kód: Delphi [Vybrat]
  1. type
  2.   TPaintComboBox = class(TComboBox)
  3.   private
  4.     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  5.   protected
  6.     procedure WndProc(var Message: TMessage); override;
  7.   end;
  8.  
  9. { TPaintComboBox }
  10.  
  11. procedure TPaintComboBox.WMPaint(var Message: TWMPaint);
  12. var
  13.   DC: HDC;
  14.   P: TPoint;
  15.   C: TCanvas;
  16. begin
  17.   inherited;
  18.  
  19.   C := nil;
  20.   DC := GetDCEx(Handle, 0, DCX_PARENTCLIP);
  21.   try
  22.     C := TControlCanvas.Create;
  23.     C.Handle := DC;
  24.  
  25.     C.Pen.Color := clRed;
  26.     C.Pen.Width := 1;
  27.     C.Polyline([
  28.       Point(Width-25, 3),
  29.       Point(Width-30, Height div 2),
  30.       Point(Width-25, Height-4),
  31.       Point(Width-20, Height div 2),
  32.       Point(Width-25, 3)]);
  33.     C.MoveTo(Width-25, 8);
  34.     C.LineTo(Width-25, Height-8);
  35.   finally
  36.     ReleaseDC(Handle, DC);
  37.     C.Free;
  38.   end;
  39. end;
  40.  
  41. procedure TPaintComboBox.WndProc(var Message: TMessage);
  42. begin
  43.   inherited WndProc(Message);
  44.   with Message do
  45.     case Msg of
  46.       CM_MOUSEENTER, CM_MOUSELEAVE, WM_LBUTTONUP, WM_LBUTTONDOWN,
  47.       WM_KEYDOWN, WM_KEYUP,
  48.       WM_SETFOCUS, WM_KILLFOCUS,
  49.       CM_FONTCHANGED, CM_TEXTCHANGED:
  50.       begin
  51.         Invalidate;
  52.       end;
  53.    end;
  54. end;

Akorát si pořeš překreslování, s tím se nechci patlat.
« Poslední změna: 16-04-2018, 16:07:56 od Ondřej Pokorný »
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1117
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Vodoznak v ComboBoxu
« Odpověď #6 kdy: 16-04-2018, 21:27:44 »
Jenže to je postavené nad TEdit. To by přineslo více problémů než užitku - je to použité v dost velkém projektu.

V tom pripade uz vis jak nastavit margins textu (pomoci EM_SETMARGINS) a jak nakreslit tlacitko. Pak tedy jen posun margin textu a nakresli vedle tlacitka ikonu. Nevidim duvod proc by ikona mela byt za textem, to by si ji uzivatel moc neuzil ;)

Není nad to se vrátit do pubertálních let...

Nahodou, nazval bych to moderni tvorbou! :) Jen to hrozive blika (ale i to je svym zpusobem moderni umeni). Osobne bych se jinak nez owner draw kreslenim do cesty combo boxu nepletl.
« Poslední změna: 16-04-2018, 21:43:48 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: