1

Тема: ColorDialog

Данный пример показывает использование компонента ColorDialog.
По нажатию клавиши на клавиатуре вызывается диалог выбора цвета для окна этого приложения.

В примере указываются размеры

    XSize:       510;
    YSize:       310;

вроде как это и не обязательно, но если их не указать, то при первом запуске 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.