Ako vo Visual Delphi pridelit k dajakej hodnote obrazok
Mam na mysli listbox . V listboxe napisem napr. cislo 1000 a objavy sa mi dakde obrazok co je ku tomuto cislu pridelene . Ako to urobit![]()
Ako vo Visual Delphi pridelit k dajakej hodnote obrazok
Mam na mysli listbox . V listboxe napisem napr. cislo 1000 a objavy sa mi dakde obrazok co je ku tomuto cislu pridelene . Ako to urobit![]()
PC STORM
Nikto nevie poradit![]()
PC STORM
To se tezko radi, kdyz je dotaz tak neurcity. Jak jsou ty obrazky velke a kolik jich tak asi je ?
Resit to lze samozrejme mnoha zpusoby - zalezi taky na tom, kde ty obrazky budes mit ulozene - jako soubory na disku, v resources, v databazi nebo treba v TImageListu.
Obrazky budu ulozene v Image Listu a program ich bude brat odtial .
Obrazok je asi 1000 . Ked napisem do listboxu dajaku hodnotu a dam enter tak aby mi to hodilo ten obrazek kterej je ku nemu prideleny .
Cize ked dam napr. cislo 50 tak aby sa mi ukazal obrazok co je prideleny na cislo 50 .
Len neviem prist na to ze k dajakej hodnote ako pridelit obrazok![]()
PC STORM
Musis si urobit obsluhu udalosti OnChange toho listboxu. Tam naprogramujes nakopirovanie bitmapy do Image (ten image si tam naklikaj).
1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm
OK thx skusim a uvidim co sa mi podarilo![]()
PC STORM
Kde ten OnChange toho listboxu prestne najdem
Neviem sa tam dajak doklikat
![]()
PC STORM
Pozeram na to - fakt to nema OnChangeTakze asi OnClick.
1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm
No fakt si neviem poradit hoci som cital aj Help![]()
Pls dakt popiste mi postup ako sa to ma robit lebo som total lama![]()
PC STORM
Fakt nikto nevie
PLS help
PC STORM
Pokud chces pouze nastrkat obrazky do listboxu pak můzes:
1/ podivat se na ondraw demo (imagelist ma i vlastni kreslici prikazy)
nebo
2/ najit hotovou komponentu (a jsou takovych mraky treba tady http://www.torry.net/enhancedlistandcomboboxes.htm)
nebo
3/ pouzit listview (umi vic nez listbox)
nebo
4/ zvolit nejakou alternativu ulozeni (treba PicClip z RxLib, je vlastne obdobou imagelistu)
nebo
5/ zkusit neco podobneho tomuto viz
Kód://========================================================================= // EnhComboBox, ImgComboBox Components for Delphi 4 // Author: Norbert ADAMKO // e-mail: norris@frdsa.utc.sk // Copyright 1999 //========================================================================= unit EnhCBox; interface uses Windows, Messages, Classes, Forms, Controls, Graphics, StdCtrls, ImgList; type TEnhComboState = set of (csButtonPressed, csMousePressed); TCustomEnhComboBox = class(TCustomComboBox) private FOldColor: TColor; FOldParentColor: boolean; FButtonWidth: integer; FEditState: TEnhComboState; FMouseInControl: boolean; FAlwaysShowBorder: boolean; FAutoDropDownWidth: boolean; FAutoHorizontalScroll: boolean; FButtonStaysPushed: boolean; FDropDownWidth: integer; FExtendedInterface: boolean; FFlat: boolean; FHorizontalExtent: integer; FShowBorderWhenInactive: boolean; FToolTip: boolean; FOnCloseUp: TNotifyEvent; procedure SetFlat(const Value: boolean); function GetDropDownWidth: integer; procedure SetDropDownWidth(const Value: integer); function GetHorizExtent: integer; procedure SetHorizExtent(const Value: integer); function GetExUI: boolean; procedure SetExUI(const Value: boolean); procedure CMEnter(var Message: TCMEnter); message CM_ENTER; procedure CMExit(var Message: TCMExit); message CM_EXIT; procedure CMEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED; procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; procedure WMLButtonDown(var Message: TWMMouse); message WM_LBUTTONDOWN; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure TrackButtonPressed(X, Y: integer); function InsideCombo(X,Y: integer): boolean; function NeedDraw3DBorder: boolean; procedure DrawButton(DC: HDC); procedure DrawButtonBorder(DC: HDC); procedure DrawControlBorder(DC: HDC); procedure DrawBorders; procedure SetAutoDropDownWidth(const Value: boolean); procedure SetAutoHorizontalScroll(const Value: boolean); procedure SetAlwaysShowBorder(const Value: boolean); protected procedure DoCloseUp; dynamic; function ItemSize(paDC: hDC; paIndex: Integer; paInEdit: boolean): TSize; virtual; procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; procedure DestroyWnd; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override; procedure MouseMove(Shift: TShiftState; X, Y: integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override; procedure DropDown;override; property AlwaysShowBorder: boolean read FAlwaysShowBorder write SetAlwaysShowBorder default false; property AutoDropDownWidth: boolean read FAutoDropDownWidth write SetAutoDropDownWidth default false; property AutoHorizontalScroll: boolean read FAutoHorizontalScroll write SetAutoHorizontalScroll default false; property ButtonStaysPushed: boolean read FButtonStaysPushed write FButtonStaysPushed default false; property DropDownWidth: integer read GetDropDownWidth write SetDropDownWidth; property ExtendedInterface: boolean read GetExUI write SetExUI default false; property Flat: boolean read FFlat write SetFlat default true; property HorizontalExtent: integer read GetHorizExtent write SetHorizExtent; property ShowBorderWhenInactive: boolean read FShowBorderWhenInactive write FShowBorderWhenInactive default false; property ToolTip: boolean read FToolTip write FToolTip default false; property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp; public constructor Create(AOwner: TComponent); override; end; TEnhComboBox = class(TCustomEnhComboBox) published property Style; //Must be first property Flat; property AlwaysShowBorder; {$IFDEF VER120} property Anchors; property AutoDropDownWidth; property AutoHorizontalScroll; property BiDiMode; property ButtonStaysPushed; property Constraints; {$ENDIF} property Color; property Ctl3D; property DragCursor; {$IFDEF VER120} property DragKind; {$ENDIF} property DragMode; property DropDownCount; property DropDownWidth; property Enabled; property ExtendedInterface; property Font; {$IFNDEF VER90} property ImeMode; property ImeName; {$ENDIF} property ItemHeight; property Items; property HorizontalExtent; property MaxLength; {$IFDEF VER120} property ParentBiDiMode; {$ENDIF} property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ShowBorderWhenInactive; property ShowHint; property Sorted; property TabOrder; property TabStop; property Text; property Tooltip; property Visible; property OnChange; property OnCloseUp; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDrawItem; property OnDropDown; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMeasureItem; property OnStartDrag; {$IFDEF VER120} property OnEndDock; property OnStartDock; {$ENDIF} end; //---TImgComboBox----------------------------------------------------------- TEnhComboItem = class private Indent: byte; ImageIndex: integer; SelectedIndex: integer; OverlayIndex: integer; constructor Create; end; TCustomImgComboBox = class(TCustomEnhComboBox) private FChangeLink: TChangeLink; FInEdit: boolean; FImages: TCustomImageList; FIndent: byte; FEnhItems: TList; procedure CBAddString(var Message: TMessage); message CB_ADDSTRING; procedure CBInsertString(var Message: TMessage); message CB_INSERTSTRING; procedure CBDeleteString(var Message: TMessage); message CB_DELETESTRING; procedure CBResetContent(var Message: TMessage); message CB_RESETCONTENT; procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; protected function ItemSize(paDC: hDC; paIndex: integer; paInEdit: boolean): TSize; override; procedure SetImages(Value: TCustomImageList); function GetImageIndex(Index: Integer): integer; procedure SetImageIndex(Index: Integer; const Value: integer); function GetSelectedIndex(Index: Integer): integer; procedure SetSelectedIndex(Index: Integer; const Value: integer); function GetOverlayIndex(Index: integer): integer; procedure SetOverlayIndex(Index: integer; const Value: integer); function GetIndentLevel(Index: Integer): byte; procedure SetIndentLevel(Index: Integer; const Value: byte); procedure SetIndent(const Value: byte); procedure SetStyle(Value: TComboBoxStyle);override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; procedure ImageListChange(Sender: TObject); procedure Notification(AComponent: TComponent; Operation: TOperation); override; property Images: TCustomImageList read FImages write SetImages; property Indent: byte read FIndent write SetIndent default 8; property IndentLevel[Index: integer]: byte read GetIndentLevel write SetIndentLevel; property ImageIndex[Index: integer]: integer read GetImageIndex write SetImageIndex; property SelectedIndex[Index: integer]: integer read GetSelectedIndex write SetSelectedIndex; property OverlayIndex[Index: integer]: integer read GetOverlayIndex write SetOverlayIndex; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function AddItem(paCaption: string; paData: pointer = nil; paImage: integer = -1; paIndent: byte = 0; paSelectedImage: integer = -1; paOverlayImage: integer = -1): integer; procedure InsertItem(paIndex: integer; paCaption: string; paData: pointer = nil; paImage: integer = -1; paIndent: byte = 0; paSelectedImage: integer = -1; paOverlayImage: integer = -1); end; TImgComboBox = class(TCustomImgComboBox) published property Style; property Flat; property AlwaysShowBorder; {$IFDEF VER120} property Anchors; property AutoDropDownWidth; property AutoHorizontalScroll; property BiDiMode; property ButtonStaysPushed; property Constraints; {$ENDIF} property Color; property Ctl3D; property DragCursor; {$IFDEF VER120} property DragKind; {$ENDIF} property DragMode; property DropDownCount; property DropDownWidth; property Enabled; property ExtendedInterface; property Font; property Images; {$IFNDEF VER90} property ImeMode; property ImeName; {$ENDIF} property ItemHeight; property Items; property HorizontalExtent; property MaxLength; {$IFDEF VER120} property ParentBiDiMode; {$ENDIF} property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ShowBorderWhenInactive; property ShowHint; property Sorted; property TabOrder; property TabStop; property Text; property Tooltip; property Visible; property OnChange; property OnCloseUp; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDrawItem; property OnDropDown; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMeasureItem; property OnStartDrag; {$IFDEF VER120} property OnEndDock; property OnStartDock; {$ENDIF} public property ImageIndex; property IndentLevel; property OverlayIndex; property SelectedIndex; end; THackImageList = class(TCustomImageList); procedure Register; implementation uses SysUtils, CommCtrl, Consts; //---TCustomEnhComboBox---------------------------------------------------- constructor TCustomEnhComboBox.Create(AOwner: TComponent); begin inherited; FAlwaysShowBorder := false; FAutoDropDownWidth := false; FAutoHorizontalScroll := false; FButtonWidth := GetSystemMetrics(SM_CXVSCROLL) + 1; FFlat := true; FButtonStaysPushed := false; FShowBorderWhenInactive := false; FOldColor := Color; FOldParentColor := ParentColor; FToolTip := false; end; procedure TCustomEnhComboBox.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); with Params do Style := Style or WS_HSCROLL; end; procedure TCustomEnhComboBox.CreateWnd; begin inherited CreateWnd; DropDownWidth := FDropDownWidth; ExtendedInterface := FExtendedInterface; HorizontalExtent := FHorizontalExtent; end; procedure TCustomEnhComboBox.DestroyWnd; begin FDropDownWidth := DropDownWidth; FHorizontalExtent := HorizontalExtent; FExtendedInterface := ExtendedInterface; inherited DestroyWnd; end; //---Property Access Methods------------------------------------------------- procedure TCustomEnhComboBox.SetFlat(const Value: boolean); begin if Value <> FFlat then begin FFlat := Value; Ctl3D := not Value; Invalidate; end; end; procedure TCustomEnhComboBox.SetDropDownWidth(const Value: integer); begin if DroppedDown then DroppedDown := false; Perform(CB_SETDROPPEDWIDTH, Value, 0); end; function TCustomEnhComboBox.GetDropDownWidth: integer; begin Result := Perform(CB_GETDROPPEDWIDTH, 0, 0); if Result<Width then Result := Width; FDropDownWidth := Result; end; procedure TCustomEnhComboBox.SetHorizExtent(const Value: integer); begin if DroppedDown then DroppedDown := false; Perform(CB_SETHORIZONTALEXTENT, Value, 0); FHorizontalExtent := HorizontalExtent; end; function TCustomEnhComboBox.GetHorizExtent: integer; begin Result := Perform(CB_GETHORIZONTALEXTENT, 0, 0); end; function TCustomEnhComboBox.GetExUI: boolean; begin Result := boolean(Perform(CB_GETEXTENDEDUI, 0, 0)); end; procedure TCustomEnhComboBox.SetExUI(const Value: boolean); begin Perform(CB_SETEXTENDEDUI, integer(Value), 0); FExtendedInterface := ExtendedInterface; end; procedure TCustomEnhComboBox.SetAutoDropDownWidth(const Value: boolean); begin FAutoDropDownWidth := Value; if FAutoDropDownWidth then FAutoHorizontalScroll := false; end; procedure TCustomEnhComboBox.SetAutoHorizontalScroll(const Value: boolean); begin FAutoHorizontalScroll := Value; if FAutoHorizontalScroll then FAutoDropDownWidth := false; end; procedure TCustomEnhComboBox.SetAlwaysShowBorder(const Value: boolean); begin if FAlwaysShowBorder <> Value then begin FAlwaysShowBorder := Value; Invalidate; end; end; //--- Message Handlers------------------------------------------------------- procedure TCustomEnhComboBox.DoCloseUp; begin if Assigned(FOnCloseUp) then FOnCloseUp(Self); end; procedure TCustomEnhComboBox.DropDown; var DC: HDC; OldFont: HFONT; Size: TSize; MaxLen, i: integer; begin inherited; if FAutoHorizontalScroll or FAutoDropDownWidth then begin DC := CreateCompatibleDC(0); OldFont := SelectObject(DC, Font.Handle); MaxLen := 0; try for i:=0 to Items.Count-1 do begin Size := ItemSize(DC, i, false); if Size.cx>MaxLen then MaxLen := Size.cx; end; finally SelectObject(DC, OldFont); DeleteDC(DC); end; if FAutoDropDownWidth then if Items.Count>DropDownCount then DropDownWidth := MaxLen + GetSystemMetrics(SM_CXVSCROLL) + 8 else DropDownWidth := MaxLen + 8; if FAutoHorizontalScroll then HorizontalExtent := MaxLen + 8; end; end; procedure TCustomEnhComboBox.CMEnter(var Message: TCMEnter); begin inherited; if not (csDesigning in ComponentState) then DrawBorders; end; procedure TCustomEnhComboBox.CMExit(var Message: TCMExit); begin inherited; if not (csDesigning in ComponentState) then begin FMouseInControl := false; DrawBorders; end; end; procedure TCustomEnhComboBox.CMEnabledChanged(var Msg: TMessage); begin inherited; if FFlat then if Enabled then begin Color := FOldColor; ParentColor := FOldParentColor; end else begin FOldParentColor := ParentColor; FOldColor := Color; ParentColor := True; end; end; procedure TCustomEnhComboBox.WMLButtonDown(var Message: TWMMouse); begin //Uncapture the mouse - ComboBox is focused now //Mouse was captured when entering ComboBox //We should set the csButtonPressed here - before Delphi drops down the combo //This makes the button look like it is being pushed down MouseCapture := false; if (Style>csDropDown) then Include(FEditState, csButtonPressed) //Button should go down even when clicked in edit control else TrackButtonPressed(Message.Pos.X, Message.Pos.Y); inherited; end; procedure TCustomEnhComboBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); begin if DroppedDown then begin MouseCapture := true; Include(FEditState, csMousePressed); end; inherited; end; procedure TCustomEnhComboBox.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); begin MouseCapture := false; if not FButtonStaysPushed then begin Exclude(FEditState, csMousePressed); TrackButtonPressed(-1, -1); end; inherited; end; procedure TCustomEnhComboBox.MouseMove(Shift: TShiftState; X, Y: integer); begin //Repaint button if the mouse is captured and is positioned over the button if FFlat then begin if csMousePressed in FEditState then TrackButtonPressed(X, Y); if Enabled then begin //Leaving ComboBox if MouseCapture and not(InsideCombo(X, Y))then begin FMouseInControl := false; DrawBorders; //if mouse button is not pressed inside combo, then uncapture if not (csMousePressed in FEditState) then MouseCapture := false; Exit; end; //Entering ComboBox if not MouseCapture and InsideCombo(X, Y) then begin if FToolTip then begin //Should we show the hint window? if ItemSize(0, ItemIndex, true).cx>Width-FButtonWidth then begin Hint := Items[ItemIndex]; end else Hint := ''; end; FMouseInControl := true; Exclude(FEditState, csMousePressed); Exclude(FEditState, csButtonPressed); DrawBorders; MouseCapture := true; end; end; end; inherited; end; procedure TCustomEnhComboBox.CNCommand(var Message: TWMCommand); begin case Message.NotifyCode of CBN_CLOSEUP: begin Exclude(FEditState, csButtonPressed); TrackButtonPressed(-1, -1); DoCloseUp; end; CBN_KILLFOCUS: begin if not FShowBorderWhenInactive then DrawBorders; end; CBN_SETFOCUS: begin if not FShowBorderWhenInactive then DrawBorders; end; end; inherited; end; procedure TCustomEnhComboBox.WMPaint(var Message: TWMPaint); var DC: HDC; PS: TPaintStruct; HelpRect: TRect; begin if (not FFlat) then inherited else begin if Message.DC=0 then DC := BeginPaint(Handle, PS) else DC := Message.DC; try if Style<>csSimple then begin //Clip the region - do not let windows paint in border and button areas GetWindowRect(Handle, HelpRect); OffsetRect(HelpRect, -HelpRect.Left, -HelpRect.Top); InflateRect(HelpRect, -2, -2); Dec(HelpRect.Right, FButtonWidth-1); IntersectClipRect(DC, HelpRect.Left, HelpRect.Top, HelpRect.Right, HelpRect.Bottom); end; //Paint Windows Control PaintWindow(DC); finally if Message.DC=0 then EndPaint(Handle, PS); end; //Make Combo look flat DrawBorders; end; end; //---Help Routines---------------------------------------------------------- function TCustomEnhComboBox.ItemSize(paDC: hDC; paIndex: integer; paInEdit: boolean): TSize; var DC: HDC; OldFont: HFONT; begin if paIndex=-1 then begin Result.cx := 0; Result.cy := 0; end else begin if paDC=0 then begin DC := CreateCompatibleDC(0); OldFont := SelectObject(DC, Font.Handle); end else begin DC := paDC; OldFont := 0; end; try GetTextExtentPoint32(DC, PChar(Items[paIndex]), Length(Items[paIndex]), Result); finally if paDC=0 then begin SelectObject(DC, OldFont); DeleteDC(DC); end; end; end; end; function TCustomEnhComboBox.NeedDraw3DBorder: boolean; begin if csDesigning in ComponentState then Result := Enabled else Result := FAlwaysShowBorder or ((FMouseInControl or (Screen.ActiveControl = Self)) and (ShowBorderWhenInactive or Application.Active)); end; procedure TCustomEnhComboBox.TrackButtonPressed(X, Y: integer); var HelpRect: TRect; Pressed: boolean; begin SetRect(HelpRect, ClientWidth - FButtonWidth, 0, ClientWidth, ClientHeight); Pressed := csButtonPressed in FEditState; if PtInRect(HelpRect, Point(X, Y)) or (Pressed and FButtonStaysPushed) then begin Include(FEditState, csButtonPressed); if not Pressed then DrawBorders; //Paint only if state was changed end else begin Exclude(FEditState, csButtonPressed); if Pressed or FButtonStaysPushed then DrawBorders; end; end; //Check if the mouse is in ComboBox area function TCustomEnhComboBox.InsideCombo(X, Y: integer): boolean; begin Result := PtInRect(Rect(0, 0, Width, Height), Point(X, Y)); end; //---Drawing Methods-------------------------------------------------------- procedure TCustomEnhComboBox.DrawButton(DC: HDC); var HelpRect: TRect; begin GetWindowRect(Handle, HelpRect); OffsetRect(HelpRect, -HelpRect.Left, -HelpRect.Top); Inc(HelpRect.Left, ClientWidth - FButtonWidth); //Make the button appear pushed if csButtonPressed in FEditState then DrawFrameControl(DC, HelpRect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX or DFCS_FLAT or DFCS_PUSHED) else DrawFrameControl(DC, HelpRect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX or DFCS_FLAT); ExcludeClipRect(DC, ClientWidth - FButtonWidth - 1, 0, ClientWidth, ClientHeight); end; procedure TCustomEnhComboBox.DrawButtonBorder(DC: HDC); var HelpRect, HelpRect2: TRect; BtnFaceBrush: HBRUSH; begin GetWindowRect(Handle, HelpRect); OffsetRect(HelpRect, -HelpRect.Left, -HelpRect.Top); Inc(HelpRect.Left, ClientWidth - FButtonWidth - 2); InflateRect(HelpRect, -2, -2); if NeedDraw3DBorder then begin BtnFaceBrush := CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); try //Clear the line to the left of the button HelpRect2 := HelpRect; with HelpRect2 do begin Right := Left; Dec(Left); FillRect(DC, HelpRect2, Brush.Handle); end; //Draw single line to the left of the button (clBtnFace) //There should be better way how to do this HelpRect2 := HelpRect; with HelpRect2 do begin Right := Left + 1; FillRect(DC, HelpRect2, BtnFaceBrush); end; Inc(HelpRect.Left, 1); //Draw Button Edge if csButtonPressed in FEditState then begin DrawEdge(DC, HelpRect, BDR_SUNKENOUTER, BF_RECT or BF_MIDDLE); end else begin DrawEdge(DC, HelpRect, BDR_RAISEDINNER, BF_RECT or BF_MIDDLE); end; finally DeleteObject(BtnFaceBrush); end; end else begin BtnFaceBrush := CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); try //Clear the line to the left of the button InflateRect(HelpRect, -1, -1); HelpRect2 := HelpRect; with HelpRect2 do begin Right := Left + 2; Dec(Left, 2); FillRect(DC, HelpRect2, Brush.Handle); end; //Gray out the region Inc(HelpRect.Left, 1); FillRect(DC, HelpRect, BtnFaceBrush); finally DeleteObject(BtnFaceBrush); end; end; //ExcludeClipRect(DC, HelpRect.Left, HelpRect.Top, HelpRect.Right, HelpRect.Bottom); //Clip the borders, so we can paint the button with arrow IntersectClipRect(DC, HelpRect.Left + 2, HelpRect.Top + 1, HelpRect.Right - 1, HelpRect.Bottom - 1); DrawButton(DC); end; procedure TCustomEnhComboBox.DrawControlBorder(DC: HDC); var HelpRect: TRect; BtnFaceBrush, WindowBrush: HBRUSH; begin BtnFaceBrush := CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); WindowBrush := CreateSolidBrush(GetSysColor(COLOR_WINDOW)); try GetWindowRect(Handle, HelpRect); OffsetRect(HelpRect, -HelpRect.Left, -HelpRect.Top); if NeedDraw3DBorder then begin DrawEdge(DC, HelpRect, BDR_SUNKENOUTER, BF_RECT or BF_ADJUST); FrameRect(DC, HelpRect, BtnFaceBrush); InflateRect(HelpRect, -1, -1); FrameRect(DC, HelpRect, WindowBrush); end else begin FrameRect(DC, HelpRect, BtnFaceBrush); InflateRect(HelpRect, -1, -1); FrameRect(DC, HelpRect, BtnFaceBrush); InflateRect(HelpRect, -1, -1); FrameRect(DC, HelpRect, WindowBrush); end; finally DeleteObject(WindowBrush); DeleteObject(BtnFaceBrush); end; end; procedure TCustomEnhComboBox.DrawBorders; var DC: HDC; begin if (FFlat) and (Style <> csSimple) then begin DC := GetWindowDC(Handle); try DrawControlBorder(DC); DrawButtonBorder(DC); finally ReleaseDC(Handle, DC); end; end; end; //---TEnhComboItem----------------------------------------------------------- constructor TEnhComboItem.Create; begin ImageIndex := -1; SelectedIndex := -1; OverlayIndex := -1; end; //---TCustomImgComboBox----------------------------------------------------- constructor TCustomImgComboBox.Create(AOwner: TComponent); begin inherited; FIndent := 8; ItemHeight := 16; Style := csOwnerDrawFixed; FEnhItems := TList.Create; FChangeLink := TChangeLink.Create; FChangeLink.OnChange := ImageListChange; end; destructor TCustomImgComboBox.Destroy; var i: integer; begin for i:=0 to FEnhItems.Count-1 do tEnhComboItem(FEnhItems[i]).Free; FEnhItems.Free; FChangeLink.Free; inherited; end; //---Message Handlers------------------------------------------------------ procedure TCustomImgComboBox.CNDrawItem(var Message: TWMDrawItem); var State: TOwnerDrawState; begin with Message.DrawItemStruct^ do begin State := TOwnerDrawState(byte(LongRec(itemState).Lo)); FInEdit := (ODS_COMBOBOXEDIT and itemState)>0; Canvas.Handle := hDC; Canvas.Font := Font; Canvas.Brush := Brush; Canvas.FillRect(rcItem); if (Integer(itemID) >= 0) and (odSelected in State) then begin Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText end; if Integer(itemID) >= 0 then DrawItem(itemID, rcItem, State) else Canvas.FillRect(rcItem); Canvas.Handle := 0; end; end; procedure TCustomImgComboBox.CBAddString(var Message: TMessage); begin inherited; FEnhItems.Insert(Message.Result, TEnhComboItem.Create); end; procedure TCustomImgComboBox.CBInsertString(var Message: TMessage); begin inherited; FEnhItems.Insert(Message.Result, TEnhComboItem.Create); end; procedure TCustomImgComboBox.CBDeleteString(var Message: TMessage); begin TEnhComboItem(FEnhItems[Message.wParam]).Free; FEnhItems.Delete(Message.wParam); inherited; end; procedure TCustomImgComboBox.CBResetContent(var Message: TMessage); var i: integer; begin for i:=0 to FEnhItems.Count-1 do TEnhComboItem(FEnhItems[i]).Free; FEnhItems.Clear; inherited; end; //---Property Access Methods------------------------------------------------- function TCustomImgComboBox.GetImageIndex(Index: Integer): integer; begin Result := TEnhComboItem(FEnhItems[Index]).ImageIndex; end; procedure TCustomImgComboBox.SetImageIndex(Index: Integer; const Value: Integer); begin if TEnhComboItem(FEnhItems[Index]).ImageIndex <> Value then begin TEnhComboItem(FEnhItems[Index]).ImageIndex := Value; Invalidate; end; end; function TCustomImgComboBox.GetSelectedIndex(Index: Integer): integer; begin Result := TEnhComboItem(FEnhItems[Index]).SelectedIndex; end; procedure TCustomImgComboBox.SetSelectedIndex(Index: Integer; const Value: Integer); begin if TEnhComboItem(FEnhItems[Index]).SelectedIndex <> Value then begin TEnhComboItem(FEnhItems[Index]).SelectedIndex := Value; Invalidate; end; end; function TCustomImgComboBox.GetOverlayIndex(Index: integer): integer; begin Result := TEnhComboItem(FEnhItems[Index]).OverlayIndex; end; procedure TCustomImgComboBox.SetOverlayIndex(Index: integer; const Value: integer); begin if TEnhComboItem(FEnhItems[Index]).OverlayIndex <> Value then begin TEnhComboItem(FEnhItems[Index]).OverlayIndex := Value; Invalidate; end; end; function TCustomImgComboBox.GetIndentLevel(Index: Integer): byte; begin Result := TEnhComboItem(FEnhItems[Index]).Indent; end; procedure TCustomImgComboBox.SetIndentLevel(Index: Integer; const Value: byte); begin if TEnhComboItem(FEnhItems[Index]).Indent <> Value then begin TEnhComboItem(FEnhItems[Index]).Indent := Value; if DroppedDown then Invalidate; end; end; procedure TCustomImgComboBox.SetIndent(const Value: byte); begin if FIndent <> Value then begin FIndent := Value; if DroppedDown then Invalidate; end; end; procedure TCustomImgComboBox.SetImages(Value: TCustomImageList); begin if Images <> nil then Images.UnRegisterChanges(FChangeLink); FImages := Value; if Images <> nil then begin Images.RegisterChanges(FChangeLink); Images.FreeNotification(Self); ItemHeight := Images.Height; end; RecreateWnd; end; procedure TCustomImgComboBox.SetStyle(Value: TComboBoxStyle); begin if Value = csOwnerDrawFixed then inherited SetStyle(Value); end; //---Other Methods---------------------------------------------------------- function TCustomImgComboBox.ItemSize(paDC: hDC; paIndex: Integer; paInEdit: boolean): TSize; begin Result := inherited ItemSize(paDC, paIndex, paInEdit); if FImages<>nil then Result.cx := Result.cx + FImages.Width; if not paInEdit then Result.cx := Result.cx + IndentLevel[paIndex]*Indent + 6; end; procedure TCustomImgComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); const DrawingStyles: array[TDrawingStyle] of integer = (ILD_FOCUS, ILD_SELECTED, ILD_NORMAL, ILD_TRANSPARENT); ImageTypes: array[TImageType] of integer = (0, ILD_MASK); var DC: HDC; OldFont: HFONT; Size: TSize; OldBlendColor: TColor; DrawStyle: TDrawingStyle; HelpRight, OldRight, HelpImageIndex, HelpOverlayIndex: integer; begin TControlCanvas(Canvas).UpdateTextFlags; if Assigned(OnDrawItem) then OnDrawItem(Self, Index, Rect, State) else begin DC := CreateCompatibleDC(0); OldFont := SelectObject(DC, Font.Handle); try GetTextExtentPoint32(DC, PChar(Items[Index]), Length(Items[Index]), Size); finally SelectObject(DC, OldFont); DeleteDC(DC); end; OldRight := Rect.Right; if not FInEdit then OffsetRect(Rect, FIndent*IndentLevel[Index], 0); if FImages<>nil then with FImages do begin OldBlendColor := BlendColor; if odFocused in State then begin BlendColor := clHighlight; DrawStyle := dsSelected; HelpImageIndex := Self.SelectedIndex[Index]; end else begin DrawStyle := dsTransparent; HelpImageIndex := Self.ImageIndex[Index]; end; if OverlayIndex[Index]=-1 then begin THackImageList(FImages).DoDraw(HelpImageIndex, Canvas, Rect.Left + 2, Rect.Top, DrawingStyles[DrawStyle] or ImageTypes[FImages.ImageType], Enabled); end else begin HelpOverlayIndex := IndexToOverlayMask(OverlayIndex[Index] + 1); THackImageList(FImages).DoDraw(HelpImageIndex, Canvas, Rect.Left + 2, Rect.Top, DrawingStyles[DrawStyle] or ImageTypes[FImages.ImageType] or ILD_OVERLAYMASK and HelpOverlayIndex, Enabled); end; BlendColor := OldBlendColor; Rect.Left := Rect.Left + FImages.Width + 4; end; with Rect do begin HelpRight := Left + Size.cx + 4; if OldRight>HelpRight then Right := HelpRight else Right := OldRight; end; if Enabled then //Needed only in ListBox Canvas.FillRect(Rect) else begin //Canvas.DoDraw changes this when drawing disabled images!!! //Another Borland's bug? Canvas.Brush.Color := Color; Canvas.Font.Color := clBtnShadow; end; Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Items[Index]); if odFocused in State then Canvas.DrawFocusRect(Rect); end; end; procedure TCustomImgComboBox.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if Operation = opRemove then begin if AComponent = FImages then FImages := nil; end; end; procedure TCustomImgComboBox.ImageListChange(Sender: TObject); begin if Sender = FImages then SetImages(FImages); end; function TCustomImgComboBox.AddItem(paCaption: string; paData: pointer; paImage: Integer; paIndent: byte; paSelectedImage: integer; paOverlayImage: integer): integer; begin Result := Items.AddObject(paCaption, paData); with TEnhComboItem(FEnhItems[Result]) do begin ImageIndex := paImage; Indent := paIndent; if paSelectedImage<>-1 then SelectedIndex := paSelectedImage else SelectedIndex := paImage; end; end; procedure TCustomImgComboBox.InsertItem(paIndex: integer; paCaption: string; paData: pointer; paImage: Integer; paIndent: byte; paSelectedImage: integer; paOverlayImage: integer); begin Items.InsertObject(paIndex, paCaption, paData); with TEnhComboItem(FEnhItems[paIndex]) do begin ImageIndex := paImage; Indent := paIndent; if paSelectedImage<>-1 then SelectedIndex := paSelectedImage else SelectedIndex := paImage; end; end; //---Register Procedure------------------------------------------------------ procedure Register; begin RegisterComponents('Additional', [TEnhComboBox, TImgComboBox]); end; end.
Jaro
Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)