mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-26 01:27:42 +00:00
95 lines
2.9 KiB
ObjectPascal
95 lines
2.9 KiB
ObjectPascal
unit UKeyBitmap;
|
|
|
|
interface
|
|
|
|
uses Windows, SysUtils, Classes, Graphics, KeyNames;
|
|
|
|
procedure CreateKeyBitmap(imgKeyCap: TBitmap; PanelColor: TColor; ShiftFlags, VirtualKey: Integer; Character: WideChar; var KeyBitmap: TBitmap);//, Virtuakey:
|
|
|
|
implementation
|
|
|
|
uses
|
|
kmxfileconsts;
|
|
|
|
procedure CreateKeyBitmap(imgKeyCap: TBitmap; PanelColor: TColor; ShiftFlags, VirtualKey: Integer; Character: WideChar; var KeyBitmap: TBitmap);//, Virtuakey:
|
|
function CreateKey(txt: string): TBitmap;
|
|
var
|
|
bmp: TBitmap;
|
|
x, y: Integer;
|
|
begin
|
|
bmp := TBitmap.Create;
|
|
with bmp.Canvas do
|
|
begin
|
|
Font.Name := 'Tahoma';
|
|
Font.Size := 8;
|
|
Font.Style := [fsBold];
|
|
|
|
x := TextWidth(txt);
|
|
y := TextHeight(txt);
|
|
|
|
if x + 14 > 30 then bmp.Width := x + 14 else bmp.Width := 30;
|
|
bmp.Height := 30;
|
|
|
|
Brush.Color := PanelColor;
|
|
FillRect(Rect(0, 0, bmp.Width, bmp.Height));
|
|
|
|
SetBkMode(Handle, TRANSPARENT);
|
|
|
|
BitBlt(Handle, 0, 0, 6, 30, imgKeyCap.Canvas.Handle, 0, 0, SRCCOPY);
|
|
StretchBlt(Handle, 6, 0, bmp.Width-12, bmp.Height, imgKeyCap.Canvas.Handle, 6, 0, imgKeyCap.Width-12, imgKeyCap.Height, SRCCOPY);
|
|
BitBlt(Handle, bmp.Width-6, 0, 6, 30, imgKeyCap.Canvas.Handle, 24, 0, SRCCOPY);
|
|
|
|
TextOut(7, 15 - y div 2 - 3, txt);
|
|
end;
|
|
|
|
Result := bmp;
|
|
end;
|
|
|
|
function AddKeyPicture(srcbmp: TBitmap; txt: string): TBitmap;
|
|
var
|
|
bmp: TBitmap;
|
|
begin
|
|
bmp := CreateKey(txt);
|
|
if not Assigned(srcbmp) then
|
|
begin
|
|
Result := bmp;
|
|
Exit;
|
|
end;
|
|
srcbmp.Width := srcbmp.Width + bmp.Width + 20;
|
|
with srcbmp.Canvas do
|
|
begin
|
|
Draw(srcbmp.Width - bmp.Width, 0, bmp);
|
|
MoveTo(srcbmp.Width - bmp.Width - 15, 15);
|
|
LineTo(srcbmp.Width - bmp.Width - 4, 15);
|
|
MoveTo(srcbmp.Width - bmp.Width - 10, 10);
|
|
LineTo(srcbmp.Width - bmp.Width - 10, 21);
|
|
end;
|
|
bmp.Free;
|
|
Result := srcbmp;
|
|
end;
|
|
|
|
var
|
|
s: WideString;
|
|
bmp: TBitmap;
|
|
begin
|
|
FreeAndNil(KeyBitmap);
|
|
|
|
bmp := nil;
|
|
if (ShiftFlags and (KMX_CTRLFLAG or KMX_LCTRLFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'Ctrl');
|
|
if (ShiftFlags and (KMX_RCTRLFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'R Ctrl');
|
|
if (ShiftFlags and (KMX_SHIFTFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'Shift');
|
|
if (ShiftFlags and (KMX_ALTFLAG or KMX_LALTFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'Alt');
|
|
if (ShiftFlags and (KMX_RALTFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'AltGr');
|
|
if (ShiftFlags and (KMX_CAPITALFLAG)) <> 0 then bmp := AddKeyPicture(bmp, 'Caps Lock');
|
|
if Character <> #0 then
|
|
if Character = ' '
|
|
then s := StringOfChar(' ', 48) // Special handling for spacebar
|
|
else s := Character
|
|
else
|
|
if VirtualKey = VK_SPACE
|
|
then s := StringOfChar(' ', 48) // Special handling for spacebar
|
|
else s := SKeyNames[VirtualKey];
|
|
KeyBitmap := AddKeyPicture(bmp, s);
|
|
end;
|
|
|
|
end.
|