program Color; {$R color.res } uses WinProcs, WinTypes, WObjects; const White = $00FFFFFF; Black = $00000000; LightGray = $00C0C0C0; DarkGray = $00808080; Cyan = $00FFFF00; Magenta = $00FF00FF; Yellow = $0000FFFF; Red = $000000FF; Green = $0000FF00; Blue = $00FF0000; LightBlue = $00800000; LightCyan = $00808000; LightMagenta = $00800080; Brown = $00008080; LightRed = $00000080; LightGreen = $00008000; const id_Color = 101; type PColorDialog = ^TColorDialog; TColorDialog = object(TDialog) ColorPtr : ^longint; constructor Init(AParent : PWindowsObject; var AColor : longint); procedure SetupWindow; virtual; function CanClose : boolean; virtual; procedure wmDrawItem(var Msg : TMessage); virtual wm_First+wm_DrawItem; procedure wmMeasureItem(var Msg : TMessage); virtual wm_First+wm_MeasureItem; end; constructor TColorDialog.Init(AParent : PWindowsObject; var AColor : longint); begin TDialog.Init(AParent,'ColorDlg'); ColorPtr := @AColor; end; { Init } procedure TColorDialog.SetupWindow; const NColors = 16; StdColors : array[1..NColors] of longint = (White, Black, LightGray, DarkGray, Cyan, Magenta, Yellow, Red, Green, Blue, LightBlue, LightCyan, LightMagenta, Brown, LightRed, LightGreen); procedure SetupColors(ID : integer; Color : longint); var i,Sel : integer; begin Sel := -1; for i := 1 to NColors do begin SendDlgItemMsg(ID,cb_AddString,0,StdColors[i]); if StdColors[i] = Color then Sel := pred(i); end; if Sel = -1 then begin SendDlgItemMsg(ID,cb_AddString,0,Color); Sel := NColors; end; SendDlgItemMsg(ID,cb_SetCurSel,Sel,0); end; { SetupColors } begin { SetupWindow } TDialog.SetupWindow; SetupColors(id_Color,ColorPtr^); end; { SetupWindow } function TColorDialog.CanClose : boolean; procedure GetCol(ID : integer; var Color : longint); var Sel : integer; begin Sel := SendDlgItemMsg(ID,cb_GetCurSel,0,0); if Sel > -1 then SendDlgItemMsg(ID,cb_GetLBText,Sel,longint(@Color)); end; { GetCol } begin { CanClose } GetCol(id_Color,ColorPtr^); CanClose := true; end; { CanClose } procedure TColorDialog.wmDrawItem(var Msg : TMessage); var Brush : HBrush; begin with PDrawItemStruct(Msg.lParam)^ do begin if CtlType = odt_ComboBox then begin if ((ItemAction and oda_DrawEntire) <> 0) or ((ItemAction and oda_Select) <> 0) then begin Brush := CreateSolidBrush(ItemData); FillRect(hDC,rcItem,Brush); DeleteObject(Brush); end; if ((ItemState and ods_Focus) <> 0) or ((ItemState and ods_Selected) <> 0) then begin InflateRect(rcItem,-2,-2); DrawFocusRect(hDC,rcItem); end; end; end; end; { wmDrawItem } procedure TColorDialog.wmMeasureItem(var Msg : TMessage); begin PMeasureItemStruct(Msg.lParam)^.ItemHeight := 16; end; { wmMeasureItem } const cm_Color = 100; type PColorWindow = ^TColorWindow; TColorWindow = object(TWindow) Color : longint; constructor Init; procedure Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); virtual; procedure CMColor(var Msg: TMessage); virtual cm_First + cm_Color; end; constructor TColorWindow.Init; begin Color := White; TWindow.Init(nil, 'Color Combo Demo'); Attr.Menu := LoadMenu(HInstance, 'Menu'); end; { Init } procedure TColorWindow.cmColor(var Msg: TMessage); begin if Application^.ExecDialog( New(PColorDialog,Init(@Self,Color))) = id_Ok then InvalidateRect(HWindow,nil,true); end; { cmColor } procedure TColorWindow.Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); var Brush : HBrush; begin Brush := CreateSolidBrush(Color); FillRect(PaintDC,PaintInfo.rcPaint,Brush); DeleteObject(Brush); end; { Paint } type TColorApp = object(TApplication) procedure InitMainWindow; virtual; end; procedure TColorApp.InitMainWindow; begin MainWindow := New(PColorWindow,Init); end; { InitMainWindow } var ColorApp: TColorApp; begin ColorApp.Init('Menu'); ColorApp.Run; ColorApp.Done; end. { ------------------------- COLOR.RES ----------------------- } { USE XX3402 to decode the following block } { Cut out and name COLOR.XX. Use XX3402 d COLOR.XX to create COLOR.RES } { ------------------------ CUT -----------------------------} *XX3402-000206-140792--72--85-25021-------COLOR.RES--1-OF--1 zkE+HIJCJE+k2+w+++++++++U+-Y+0N1PqljQU1z-E-1HolDIYFAFk+k25I+++1++AW+-3Q+ 7U-l+2s+++-1O4xjQqIUMqxgPr6+0+-6NKlq++Q+0E+M++c+zzw+++-EUYBjP4xmCU++6++4 +-s+D+-Z+-A+6J03++-4++M+6k+A++2++E+-I6-DOk++FU+N+0A+1++0+++++J0+Eq3iMqJg ++1z1k1z+E+k2-s++++A++E++M++HIJCJE+E++I++c++EoxAHp72H2Q+++++ ***** END OF BLOCK 1 *****