files
SDK/Examples/GUI/SetCursor/SetCursor.dpr

135 lines
3.7 KiB
ObjectPascal

program SetCursorApp;
uses
KolibriOS;
const
ARROW_BUTTON = 2;
POINT_BUTTON = 3;
WAIT_BUTTON = 4;
type
TBitmapFileHeader = packed record
bfType: Word;
bfSize: LongWord;
bfReserved1: Word;
bfReserved2: Word;
bfOffBits: LongWord;
end;
TBitmapInfoHeader = packed record
biSize: LongWord;
biWidth: LongInt;
biHeight: LongInt;
biPlanes: Word;
biBitCount: Word;
biCompression: LongWord;
biSizeImage: LongWord;
biXPelsPerMeter: LongInt;
biYPelsPerMeter: LongInt;
biClrUsed: LongWord;
biClrImportant: LongWord;
end;
PBitmapFile = ^TBitmapFile;
TBitmapFile = packed record
BitmapFileHeader: TBitmapFileHeader;
BitmapInfoHeader: TBitmapInfoHeader;
end;
procedure ExtractFileDirectory(Src, Dst: PKolibriChar); stdcall;
asm
PUSH ESI
PUSH EDI
XOR EAX, EAX
MOV EDI, Src
MOV ESI, EDI
MOV ECX, $FFFFFFFF
REPNE SCASB
MOV AL, '/'
STD
REPNE SCASB
CLD
SUB EDI, ESI
MOV ECX, EDI
INC ECX
MOV EDI, Dst
REP MOVSB
MOV BYTE [EDI], 0
POP EDI
POP ESI
end;
var
WndLeft, WndTop, WndWidth, WndHeight: Integer;
ArrowBitmapFile, PointBitmapFile, WaitBitmapFile: PBitmapFile;
ArrowBitmap, PointBitmap, WaitBitmap: Pointer;
hArrowCursor, hPointCursor, hWaitCursor: THandle;
FileSize: LongWord;
begin
HeapInit;
ExtractFileDirectory(AppPath, AppPath);
SetCurrentDirectory(AppPath);
ArrowBitmapFile := LoadFile('arrow.bmp', FileSize);
PointBitmapFile := LoadFile('point.bmp', FileSize);
WaitBitmapFile := LoadFile('wait.bmp', FileSize);
ArrowBitmap := Pointer(LongWord(ArrowBitmapFile) + ArrowBitmapFile.BitmapFileHeader.bfOffBits);
PointBitmap := Pointer(LongWord(PointBitmapFile) + PointBitmapFile.BitmapFileHeader.bfOffBits);
WaitBitmap := Pointer(LongWord(WaitBitmapFile) + WaitBitmapFile.BitmapFileHeader.bfOffBits);
hArrowCursor := LoadCursorIndirect(ArrowBitmap^, 0, 0);
hPointCursor := LoadCursorIndirect(PointBitmap^, 12, 0);
hWaitCursor := LoadCursorIndirect(WaitBitmap^, 0, 0);
with GetScreenSize do
begin
WndWidth := Width div 4;
WndHeight := Height div 4;
WndLeft := (Width - WndWidth) div 2;
WndTop := (Height - WndHeight) div 2;
end;
while True do
case WaitEvent of
REDRAW_EVENT:
begin
BeginDraw;
DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'Set Cursor', $00FFFFFF,
WS_SKINNED_FIXED + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
DrawText( 8, 8, 'Click on picture buttons', 0, $00FFFFFF, DT_CP866_8x16 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
DrawText( 8, 25, 'below to select cursor:', 0, $00FFFFFF, DT_CP866_8x16 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
DrawButton(8, 40, 32, 32, 0, BS_TRANSPARENT_FILL, ARROW_BUTTON);
DrawButton(52, 40, 32, 32, 0, BS_TRANSPARENT_FILL, POINT_BUTTON);
DrawButton(96, 40, 32, 32, 0, BS_TRANSPARENT_FILL, WAIT_BUTTON );
Blit(ArrowBitmap^, 0, 0, 32, 32, 8, 40, 32, 32, 32*4, BLIT_CLIENT_RELATIVE);
Blit(PointBitmap^, 0, 0, 32, 32, 52, 40, 32, 32, 32*4, BLIT_CLIENT_RELATIVE);
Blit(WaitBitmap^, 0, 0, 32, 32, 96, 40, 32, 32, 32*4, BLIT_CLIENT_RELATIVE);
EndDraw;
end;
KEY_EVENT:
GetKey;
BUTTON_EVENT:
case GetButton.ID of
ARROW_BUTTON:
SetCursor(hArrowCursor);
POINT_BUTTON:
SetCursor(hPointCursor);
WAIT_BUTTON:
SetCursor(hWaitCursor);
1:
Break;
end;
end;
end.