📄 jvqcharmap.pas
字号:
if not FShowZoomPanel then
PanelVisible := False;
end;
end;
procedure TJvCustomCharMap.ShowCharPanel(ACol, ARow: Integer);
var
R: TRect;
P: TPoint;
begin
if not ShowZoomPanel or not SelectCell(ACol, ARow) then
begin
PanelVisible := False;
Exit;
end;
R := CellRect(ACol, ARow);
Selection := TGridRect(Rect(ACol, ARow, ACol, ARow));
Col := ACol;
Row := ARow;
TCharZoomPanel(FCharPanel).Character := GetChar(ACol, ARow);
P.X := R.Left - (FCharPanel.Width - DefaultColWidth) div 2;
P.Y := R.Top - (FCharPanel.Height - DefaultRowHeight) div 2;
P := ClientToScreen(P);
FCharPanel.Left := P.X;
FCharPanel.Top := P.Y;
if not PanelVisible then
PanelVisible := True;
end;
function TJvCustomCharMap.DoPaintBackground(Canvas: TCanvas; Param: Integer): Boolean;
begin
Result := True;
end;
//=== { TCharZoomPanel } =====================================================
constructor TCharZoomPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csNoDesignVisible, csOpaque];
SetBounds(0, 0, 52, 48);
FShadow := TShadowWindow.Create(AOwner);
ShowShadow := True;
FShadowSize := 2;
InputKeys := [ikArrows];
end;
destructor TCharZoomPanel.Destroy;
begin
inherited Destroy;
end;
procedure TCharZoomPanel.FontChanged;
begin
inherited FontChanged;
// (p3) height should be quite larger than Font.Height and Width a little more than that
Height := Abs(Font.Height) * 4;
Width := MulDiv(Height, 110, 100);
end;
procedure TCharZoomPanel.VisibleChanged;
begin
inherited VisibleChanged;
if Visible and CanFocus then
SetFocus;
if ShowShadow then
FShadow.Visible := Visible
else
FShadow.Visible := False;
end;
procedure TCharZoomPanel.KeyDown(var Key: Word; Shift: TShiftState);
begin
// (rom) only accept without Shift, Alt or Ctrl down
if Shift * KeyboardShiftStates = [] then
case Key of
VK_ESCAPE:
begin
Visible := False;
if Parent.CanFocus then
Parent.SetFocus;
end;
VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN:
TJvCustomCharMap(Parent).KeyDown(Key, Shift);
else
inherited KeyDown(Key, Shift);
end
else
inherited KeyDown(Key, Shift);
end;
procedure TCharZoomPanel.Paint;
var
R: TRect;
AChar: WideChar;
begin
// inherited Paint;
Canvas.Font := Font;
Canvas.Font.Height := ClientHeight - 4;
// Canvas.Font.Style := [fsBold];
Canvas.Brush.Color := Color;
Canvas.Pen.Color := Font.Color;
R := ClientRect;
Canvas.Rectangle(R);
// R := Rect(0,0,Width,Height);
SetBkMode(Canvas.Handle, QWindows.TRANSPARENT);
AChar := Character;
if TJvCustomCharMap(Parent).IsValidChar(AChar) then
WideDrawText(Canvas, AChar, R,
DT_SINGLELINE or DT_CENTER or DT_VCENTER or DT_NOPREFIX);
end;
procedure TCharZoomPanel.SetCharacter(const Value: WideChar);
begin
if FCharacter <> Value then
begin
FCharacter := Value;
Invalidate;
end;
end;
procedure TCharZoomPanel.DoEnter;
begin
inherited DoEnter;
if not (csDestroying in ComponentState) and Parent.CanFocus then
Parent.SetFocus;
end;
procedure TCharZoomPanel.BoundsChanged;
begin
inherited;
UpdateShadow;
end;
procedure TCharZoomPanel.SetParent( const AParent: TWinControl);
begin
inherited SetParent(AParent);
if not (csDestroying in ComponentState) then
begin
if FShadow <> nil then
FShadow.Parent := AParent;
UpdateShadow;
end;
end;
procedure TCharZoomPanel.SetShowShadow(const Value: Boolean);
begin
if FShowShadow <> Value then
begin
FShowShadow := Value;
UpdateShadow;
end;
end;
procedure TCharZoomPanel.UpdateShadow;
var
R: TRect;
begin
if HandleAllocated and (FShadow <> nil) and (FShadow.Parent <> nil) then
begin
if ShowShadow then
begin
R := BoundsRect;
OffsetRect(R, ShadowSize, ShadowSize);
FShadow.BoundsRect := R;
FShadow.Visible := Visible;
end
else
FShadow.Visible := False;
end;
end;
procedure TCharZoomPanel.SetShadowSize(const Value: Integer);
begin
if FShadowSize <> Value then
begin
FShadowSize := Value;
UpdateShadow;
end;
end;
//=== { TJvCharMapRange } ====================================================
constructor TJvCharMapRange.Create;
begin
inherited Create;
FFilter := ufUndefined;
FStartChar := 33;
FEndChar := 255;
end;
procedure TJvCharMapRange.Change;
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
function TJvCharMapRange.GetEndChar: Cardinal;
begin
if Filter = ufUndefined then
Result := FEndChar
else
Result := FFilterEnd;
end;
function TJvCharMapRange.GetStartChar: Cardinal;
begin
if Filter = ufUndefined then
Result := FStartChar
else
Result := FFilterStart;
end;
procedure TJvCharMapRange.SetEndChar(const Value: Cardinal);
begin
if FEndChar <> Value then
begin
FEndChar := Value;
if Filter = ufUndefined then
Change;
end;
end;
procedure TJvCharMapRange.SetFilter(const Value: TJvCharMapUnicodeFilter);
begin
if FFilter <> Value then
begin
FFilter := Value;
case Value of
ufBasicLatin:
SetRange($0000, $007F);
ufLatin1Supplement:
SetRange($0080, $00FF);
ufLatinExtendedA:
SetRange($0100, $017F);
ufLatinExtendedB:
SetRange($0180, $024F);
ufIPAExtensions:
SetRange($0250, $02AF);
ufSpacingModifierLetters:
SetRange($02B0, $02FF);
ufCombiningDiacriticalMarks:
SetRange($0300, $036F);
ufGreek:
SetRange($0370, $03FF);
ufCyrillic:
SetRange($0400, $04FF);
ufArmenian:
SetRange($0530, $058F);
ufHebrew:
SetRange($0590, $05FF);
ufArabic:
SetRange($0600, $06FF);
ufSyriac:
SetRange($0700, $074F);
ufThaana:
SetRange($0780, $07BF);
ufDevanagari:
SetRange($0900, $097F);
ufBengali:
SetRange($0980, $09FF);
ufGurmukhi:
SetRange($0A00, $0A7F);
ufGujarati:
SetRange($0A80, $0AFF);
ufOriya:
SetRange($0B00, $0B7F);
ufTamil:
SetRange($0B80, $0BFF);
ufTelugu:
SetRange($0C00, $0C7F);
ufKannada:
SetRange($0C80, $0CFF);
ufMalayalam:
SetRange($0D00, $0D7F);
ufSinhala:
SetRange($0D80, $0DFF);
ufThai:
SetRange($0E00, $0E7F);
ufLao:
SetRange($0E80, $0EFF);
ufTibetan:
SetRange($0F00, $0FFF);
ufMyanmar:
SetRange($1000, $109F);
ufGeorgian:
SetRange($10A0, $10FF);
ufHangulJamo:
SetRange($1100, $11FF);
ufEthiopic:
SetRange($1200, $137F);
ufCherokee:
SetRange($13A0, $13FF);
ufUnifiedCanadianAboriginalSyllabics:
SetRange($1400, $167F);
ufOgham:
SetRange($1680, $169F);
ufRunic:
SetRange($16A0, $16FF);
ufKhmer:
SetRange($1780, $17FF);
ufMongolian:
SetRange($1800, $18AF);
ufLatinExtendedAdditional:
SetRange($1E00, $1EFF);
ufGreekExtended:
SetRange($1F00, $1FFF);
ufGeneralPunctuation:
SetRange($2000, $206F);
ufSuperscriptsAndSubscripts:
SetRange($2070, $209F);
ufCurrencySymbols:
SetRange($20A0, $20CF);
ufCombiningMarksForSymbols:
SetRange($20D0, $20FF);
ufLetterlikeSymbols:
SetRange($2100, $214F);
ufNumberForms:
SetRange($2150, $218F);
ufArrows:
SetRange($2190, $21FF);
ufMathematicalOperators:
SetRange($2200, $22FF);
ufMiscellaneousTechnical:
SetRange($2300, $23FF);
ufControlPictures:
SetRange($2400, $243F);
ufOpticalCharacterRecognition:
SetRange($2440, $245F);
ufEnclosedAlphanumerics:
SetRange($2460, $24FF);
ufBoxDrawing:
SetRange($2500, $257F);
ufBlockElements:
SetRange($2580, $259F);
ufGeometricShapes:
SetRange($25A0, $25FF);
ufMiscellaneousSymbols:
SetRange($2600, $26FF);
ufDingbats:
SetRange($2700, $27BF);
ufBraillePatterns:
SetRange($2800, $28FF);
ufCJKRadicalsSupplement:
SetRange($2E80, $2EFF);
ufKangxiRadicals:
SetRange($2F00, $2FDF);
ufIdeographicDescriptionCharacters:
SetRange($2FF0, $2FFF);
ufCJKSymbolsAndPunctuation:
SetRange($3000, $303F);
ufHiragana:
SetRange($3040, $309F);
ufKatakana:
SetRange($30A0, $30FF);
ufBopomofo:
SetRange($3100, $312F);
ufHangulCompatibilityJamo:
SetRange($3130, $318F);
ufKanbun:
SetRange($3190, $319F);
ufBopomofoExtended:
SetRange($31A0, $31BF);
ufEnclosedCJKLettersAndMonths:
SetRange($3200, $32FF);
ufCJKCompatibility:
SetRange($3300, $33FF);
ufCJKUnifiedIdeographsExtensionA:
SetRange($3400, $4DB5);
ufCJKUnifiedIdeographs:
SetRange($4E00, $9FFF);
ufYiSyllables:
SetRange($A000, $A48F);
ufYiRadicals:
SetRange($A490, $A4CF);
ufHangulSyllables:
SetRange($AC00, $D7A3);
ufHighSurrogates:
SetRange($D800, $DB7F);
ufHighPrivateUseSurrogates:
SetRange($DB80, $DBFF);
ufLowSurrogates:
SetRange($DC00, $DFFF);
ufPrivateUse:
SetRange($E000, $F8FF);
// $E000..$F8FF, $F0000..$FFFFD, $100000..$10FFFD;
ufCJKCompatibilityIdeographs:
SetRange($F900, $FAFF);
ufAlphabeticPresentationForms:
SetRange($FB00, $FB4F);
ufArabicPresentationFormsA:
SetRange($FB50, $FDFF);
ufCombiningHalfMarks:
SetRange($FE20, $FE2F);
ufCJKCompatibilityForms:
SetRange($FE30, $FE4F);
ufSmallFormVariants:
SetRange($FE50, $FE6F);
ufArabicPresentationFormsB:
SetRange($FE70, $FEFE);
ufSpecials:
// $FEFF..$FEFF, $FFF0..$FFFD;
SetRange($FFF0, $FFFD);
ufHalfwidthAndFullwidthForms:
SetRange($FF00, $FFEF);
ufOldItalic:
SetRange($10300, $1032F);
ufGothic:
SetRange($10330, $1034F);
ufDeseret:
SetRange($10400, $1044F);
ufByzantineMusicalSymbols:
SetRange($1D000, $1D0FF);
ufMusicalSymbols:
SetRange($1D100, $1D1FF);
ufMathematicalAlphanumericSymbols:
SetRange($1D400, $1D7FF);
ufCJKUnifiedIdeographsExtensionB:
SetRange($20000, $2A6D6);
ufCJKCompatibilityIdeographsSupplement:
SetRange($2F800, $2FA1F);
ufTags:
SetRange($E0000, $E007F);
else
SetRange(StartChar, EndChar);
end;
end;
end;
procedure TJvCharMapRange.SetRange(AStart, AEnd: Cardinal);
begin
FFilterStart := AStart;
FFilterEnd := AEnd;
Change;
end;
procedure TJvCharMapRange.SetStartChar(const Value: Cardinal);
begin
if FStartChar <> Value then
begin
FStartChar := Value;
if Filter = ufUndefined then
Change;
end;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQCharMap.pas,v $';
Revision: '$Revision: 1.18 $';
Date: '$Date: 2005/02/06 14:06:01 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -