Данный пример показывает использование компонента ColorDialog.
По нажатию клавиши на клавиатуре вызывается диалог выбора цвета для окна этого приложения.
В примере указываются размеры
вроде как это и не обязательно, но если их не указать, то при первом запуске ColorDialog его позиция не по центру относительно окна, при последующих запусках — всё нормально.
Похоже, что это недоработка в самом компоненте ColorDialog или в библиотеке ProcLib.
▼код примера
program ColorDialogTest;
uses
KolibriOS;
Const
// ColorDialog.Mode constants
CDM_PALETTE_TONE = 0;
// ColorDialog.Status constants
CDS_CANCEL = 0;
CDS_OK = 1;
CDS_ALTER = 2;
// ColorDialog.ColorType constants
CDCT_RGB = 0;
type
TColorDialog = packed record
Mode: LongWord;
ProcInfo: Pointer;
ComAreaName: PAnsiChar;
ComArea: Pointer;
StartPath: PAnsiChar;
DrawWindow: procedure;
Status: LongWord;
XSize: Word;
XStart: SmallInt;
YSize: Word;
YStart: SmallInt;
ColorType: LongWord;
Color: LongWord;
end;
const
PROC_INFO_BUFFER_SIZE = SizeOf(TThreadInfo);
var
ProcLib: Pointer;
ColorDialogInit: procedure(var ColorDialog: TColorDialog); stdcall;
ColorDialogStart: procedure(var ColorDialog: TColorDialog); stdcall;
ProcInfoBuffer: array [0..PROC_INFO_BUFFER_SIZE - 1] of Byte;
WndLeft, WndTop, WndWidth, WndHeight: Integer;
WndBackColor: LongWord = $00FAFBFC;
procedure On_Redraw;
begin
BeginDraw;
DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'Test ColorDialog, press key to select window backcolor', WndBackColor,
WS_SKINNED_SIZABLE + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
DrawText(2, 75, 'press key to select window backcolor', not WndBackColor and $00FFFFFF, 0,
DT_CP866_8X16 + DT_TRANSPARENT_FILL + DT_ZSTRING + DT_X2, 0);
EndDraw;
end;
var
ColorDialog: TColorDialog = (
Mode: CDM_PALETTE_TONE;
ProcInfo: @ProcInfoBuffer;
ComAreaName: 'FFFFFFFF_color_dialog';
StartPath: '/sys/colrdial';
DrawWindow: On_Redraw;
XSize: 510;
YSize: 310;
ColorType: CDCT_RGB;
);
begin
ProcLib := LoadLibrary('/sys/lib/proc_lib.obj');
ColorDialogInit := GetProcAddress(proclib, 'ColorDialog_init');
ColorDialogStart := GetProcAddress(proclib, 'ColorDialog_start');
ColorDialogInit(ColorDialog);
with GetScreenSize do
begin
WndWidth := 600;
WndHeight := Height div 3;
WndLeft := (Width - WndWidth) div 2;
WndTop := (Height - WndHeight) div 2;
end;
while True do
case WaitEvent of
REDRAW_EVENT:
On_Redraw;
KEY_EVENT:
begin
GetKey;
ColorDialogStart(ColorDialog);
with ColorDialog do
if Status = CDS_OK then
WndBackColor := Color;
end;
BUTTON_EVENT:
Break;
end;
end.