📄 jvlistcomb.pas
字号:
begin
TmpR := Rect(R.Left, R.Top, R.Left + FImageList.Width + 4, R.Top + FImageList.Height + 4);
DrawBtnFrame(Canvas, FButtonStyle, Color, not ((odFocused in State) and
not (odComboBoxEdit in State)), TmpR);
end;
Inc(R.Left, GetImageWidth(Index) + 8);
OrigR.Left := R.Left;
end
else
if Assigned(FImageList) then
begin
Tmp := Items[Index].ImageIndex;
// R.Left := R.Left + Items[Index].Indent;
Offset := ((R.Bottom - R.Top) - GetImageHeight(Index)) div 2;
{$IFDEF VCL}
// PRY 2002.06.04
//FImageList.Draw(FCanvas, R.Left + 2, R.Top + Offset, Tmp, dsTransparent, itImage);
{$IFDEF COMPILER6_UP}
FImageList.Draw(Canvas, R.Left + 2, R.Top + Offset, Tmp, dsTransparent, itImage);
{$ELSE}
FImageList.Draw(Canvas, R.Left + 2, R.Top + Offset, Tmp);
{$ENDIF COMPILER6_UP}
// PRY END
{$ENDIF VCL}
{$IFDEF VisualCLX}
FImageList.Draw(Canvas, R.Left + 2, R.Top + Offset, Tmp);
{$ENDIF VisualCLX}
if FButtonFrame then
begin
TmpR := Rect(R.Left, R.Top, R.Left + FImageList.Width + 4, R.Top + FImageList.Height + 4);
DrawBtnFrame(Canvas, FButtonStyle, Color, not ((Tmp in [0..FImageList.Count - 1]) and (odFocused in State) and
not (odComboBoxEdit in State)), TmpR);
end;
Inc(R.Left, GetImageWidth(Index) + 8);
OrigR.Left := R.Left;
end;
R.Right := R.Left + TextWidth(Items[Index].Text);
InflateRect(R, 2, -1);
if Length(Items[Index].Text) > 0 then
begin
Inc(R.Right,2);
FillRect(R);
Inc(R.Left, 2);
DrawText(Canvas, Items[Index].Text, Length(Items[Index].Text), R,
DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER);
Dec(R.Left, 2);
if (odSelected in State) and (Color <> FColorHighlight) then
DrawFocusRect(R);
end
else
begin
FillRect(OrigR);
if (odSelected in State) and (Color <> FColorHighlight) then
DrawFocusRect(OrigR);
end;
end;
end;
{$IFDEF VCL}
procedure TJvImageComboBox.MeasureItem(Index: Integer; var Height: Integer);
begin
Height := Max(GetItemHeight(Font) + 4, GetImageHeight(Index) + (Ord(ButtonFrame) * 4));
// if Assigned(FImageList) then
// Height := Max(Height,FImageList.Height);
end;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure TJvImageComboBox.MeasureItem(Control: TWinControl; Item: QClxListBoxItemH;
var Height, Width: Integer);
begin
Height := Max(GetItemHeight(Font) + 4, GetImageHeight(Index) + (Ord(ButtonFrame) * 4));
// Height := GetItemHeight(Font) + 4 ;
// if Assigned(FImageList) then
// Height := Max(Height, FImageList.Height + (Ord(ButtonFrame) * 4));
end;
procedure TJvImageComboBox.SetParent(const AParent: TWidgetControl);
begin
inherited SetParent(AParent);
ResetItemHeight;
end;
{$ENDIF VisualCLX}
procedure TJvImageComboBox.SetColorHighlight(Value: TColor);
begin
if FColorHighlight <> Value then
begin
FColorHighlight := Value;
Invalidate;
end;
end;
procedure TJvImageComboBox.SetColorHighlightText(Value: TColor);
begin
if FColorHighlightText <> Value then
begin
FColorHighlightText := Value;
Invalidate;
end;
end;
{$IFDEF VCL}
function TJvImageComboBox.GetDroppedWidth: Integer;
begin
HandleNeeded;
Result := SendMessage(Handle, CB_GETDROPPEDWIDTH, 0, 0);
end;
procedure TJvImageComboBox.SetDroppedWidth(Value: Integer);
begin
HandleNeeded;
FDroppedWidth := SendMessage(Handle, CB_SETDROPPEDWIDTH, Value, 0);
end;
{$ENDIF VCL}
{$IFDEF VisualCLX}
function TJvImageComboBox.GetDroppedWidth: Integer;
begin
HandleNeeded;
Result := QWidget_width(QCombobox_listBox(Handle));
end;
procedure TJvImageComboBox.SetDroppedWidth(Value: Integer);
begin
HandleNeeded;
QWidget_setFixedWidth(QCombobox_listBox(Handle), Value);
FDroppedWidth := GetDroppedWidth;
end;
{$ENDIF VisualCLX}
procedure TJvImageComboBox.FontChanged;
begin
inherited FontChanged;
ResetItemHeight;
{$IFDEF VCL}
RecreateWnd;
{$ENDIF VCL}
{$IFDEF VisualCLX}
RecreateWidget;
{$ENDIF VisualCLX}
end;
procedure TJvImageComboBox.ResetItemHeight;
var
MaxImageHeight: Integer;
I: Integer;
begin
MaxImageHeight := GetImageHeight(-1);
for I := 0 to FItems.Count-1 do
begin
if GetImageHeight(I) > MaxImageHeight then
MaxImageHeight := GetImageHeight(I);
end;
ItemHeight := Max(GetItemHeight(Font) + 4, MaxImageHeight + Ord(ButtonFrame) * 4);
end;
procedure TJvImageComboBox.Change;
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
{$IFDEF VCL}
procedure TJvImageComboBox.CNCommand(var Msg: TWMCommand);
begin
inherited;
case Msg.NotifyCode of
CBN_SELCHANGE:
Change;
end;
end;
{$ENDIF VCL}
procedure TJvImageComboBox.EnabledChanged;
const
EnableColors: array [Boolean] of TColor = (clBtnFace, clWindow);
begin
inherited EnabledChanged;
Color := EnableColors[Enabled];
end;
procedure TJvImageComboBox.MouseEnter(AControl: TControl);
begin
inherited MouseEnter(AControl);
MouseInControl := True;
end;
procedure TJvImageComboBox.MouseLeave(AControl: TControl);
begin
inherited MouseLeave(AControl);
MouseInControl := False;
end;
procedure TJvImageComboBox.SetDefaultIndent(const Value: Integer);
begin
if FDefaultIndent <> Value then
begin
FDefaultIndent := Value;
Invalidate;
end;
end;
procedure TJvImageComboBox.SetItems(const Value: TJvImageItems);
begin
FItems.Assign(Value);
FItems.Update(nil);
end;
procedure TJvImageComboBox.SetIndentSelected(const Value: Boolean);
begin
if FIndentSelected <> Value then
begin
FIndentSelected := Value;
Invalidate;
end;
end;
function TJvImageComboBox.GetImageWidth(Index: Integer): Integer;
begin
if (Index > -1) and not Items[Index].Glyph.Empty then
Result := Items[Index].Glyph.Width
else
if Assigned(FImageList) then
Result := FImageList.Width
else
Result := FImageWidth;
end;
function TJvImageComboBox.GetImageHeight(Index: Integer): Integer;
begin
if (Index > -1) and not Items[Index].Glyph.Empty then
Result := Items[Index].Glyph.Height
else
if Assigned(FImageList) then
Result := FImageList.Height
else
Result := FImageHeight;
end;
//=== { TJvImageListBox } ====================================================
constructor TJvImageListBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// ControlStyle := ControlStyle + [csAcceptsControls];
SetBounds(0, 0, 121, 97);
FItems := TJvImageItems.Create(Self);
FItems.FStrings := inherited Items;
Color := clWindow;
FColorHighlight := clHighlight;
FColorHighlightText := clHighlightText;
FImageWidth := 0;
FImageHeight := 0;
FAlignment := taLeftJustify;
FButtonFrame := False;
Style := lbOwnerDrawFixed;
{$IFDEF VCL}
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
ResetItemHeight;
{$ENDIF VCL}
FChangeLink := TChangeLink.Create;
FChangeLink.OnChange := ImageListChange;
end;
destructor TJvImageListBox.Destroy;
begin
FItems.Free;
FChangeLink.Free;
inherited Destroy;
{$IFDEF VCL}
// (rom) destroy Canvas AFTER inherited Destroy
FCanvas.Free;
{$ENDIF VCL}
end;
{$IFDEF VCL}
function TJvImageListBox.GetCanvas: TCanvas;
begin
Result := FCanvas;
end;
{$ENDIF VCL}
procedure TJvImageListBox.ImageListChange;
begin
// Invalidate;
end;
procedure TJvImageListBox.SetImageList(Value: TCustomImageList);
begin
if FImageList <> Value then
begin
if FImageList <> nil then
FImageList.UnRegisterChanges(FChangeLink);
FImageList := Value;
if FImageList <> nil then
FImageList.RegisterChanges(FChangeLink);
{ if Assigned(FImageList) then
begin
FWidth := FImageList.Width;
FHeight := FImageList.Height;
end
else
begin
FWidth := 0;
FHeight := 0;
end;}
ResetItemHeight;
{$IFDEF VCL}
RecreateWnd;
{$ENDIF VCL}
{$IFDEF VisualCLX}
RecreateWidget;
{$ENDIF VisualCLX}
end;
end;
procedure TJvImageListBox.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then
begin
FAlignment := Value;
ResetItemHeight;
end;
end;
{$IFDEF VCL}
procedure TJvImageListBox.CreateWnd;
begin
inherited CreateWnd;
SetBkMode(FCanvas.Handle, TRANSPARENT);
end;
{$ENDIF VCL}
procedure TJvImageListBox.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FImageList) then
FImageList := nil;
end;
procedure TJvImageListBox.SetColorHighlight(Value: TColor);
begin
if FColorHighlight <> Value then
begin
FColorHighlight := Value;
Invalidate;
end;
end;
procedure TJvImageListBox.SetColorHighlightText(Value: TColor);
begin
if FColorHighlightText <> Value then
begin
FColorHighlightText := Value;
Invalidate;
end;
end;
{$IFDEF VCL}
procedure TJvImageListBox.CNDrawItem(var Msg: TWMDrawItem);
var
State: TOwnerDrawState;
begin
if csDestroying in ComponentState then
Exit;
with Msg.DrawItemStruct^ do
begin
State := [];
if (itemState and ODS_CHECKED) <> 0 then
Include(State, odChecked);
if (itemState and ODS_COMBOBOXEDIT) <> 0 then
Include(State, odComboBoxEdit);
if (itemState and ODS_DEFAULT) <> 0 then
Include(State, odDefault);
if (itemState and ODS_DISABLED) <> 0 then
Include(State, odDisabled);
if (itemState and ODS_FOCUS) <> 0 then
Include(State, odFocused);
if (itemState and ODS_GRAYED) <> 0 then
Include(State, odGrayed);
if (itemState and ODS_SELECTED) <> 0 then
Include(State, odSelected);
FCanvas.Handle := hDC;
FCanvas.Font := Font;
FCanvas.Brush := Brush;
if (Integer(itemID) >= 0) and (odSelected in State) then
begin
FCanvas.Brush.Color := Items[Integer(itemID)].ColorHighlight;
FCanvas.Font.Color := Items[Integer(itemID)].ColorHighlightText;
end;
if Integer(itemID) >= 0 then
DrawItem(itemID, rcItem, State)
else
FCanvas.FillRect(rcItem);
FCanvas.Handle := 0;
end;
end;
procedure TJvImageListBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
{$ENDIF VCL}
{$IFDEF VisualCLX}
function TJvImageListBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState): Boolean;
{$ENDIF VisualCLX}
var
SavedColor: TColor;
begin
{$IFDEF VisualCLX}
Result := True;
{$ENDIF VisualCLX}
if csDestroying in ComponentState then
Exit;
{$IFDEF VisualCLX}
if odSelected in State then
begin
Canvas.Brush.Color := Items[Index].ColorHighlight;
Canvas.Font.Color := Items[Index].ColorHighlightText;
end;
{$ENDIF VisualCLX}
SavedColor := Canvas.Font.Color;
Canvas.Font.Assign(Items[Index].Font);
if State <> [] then
Canvas.Font.Color := SavedColor;
case FAlignment of
taLeftJustify:
DrawLeftGlyph(Index, Rect, State);
taRightJustify:
DrawRightGlyph(Index, Rect, State);
taCenter:
DrawCenteredGlyph(Index, Rect, State);
end;
end;
procedure TJvImageListBox.DrawCenteredGlyph(Index: Integer; R: TRect; State: TOwnerDrawState);
var
Tmp, Tmp2: Integer;
TmpCol: TColor;
TmpR, OrigR: TRect;
begin
if csDestroying in ComponentState then
Exit;
OrigR := R;
with Canvas do
begin
TmpCol := Brush.Color;
Brush.Color := Color;
FillRect(R);
Brush.Color := TmpCol;
if not Items[Index].Glyph.Empty then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -