http://alexander-bagel.blogspot.ru/2013/12/2_23.html
На самом деле я про проблему - "знал, но забыл" :-)
СПАСИБО автору, что напомнил и освежил в памяти.
Это кстати одна из мотиваций того почему я написал "собственную канву" и стараюсь пользоваться исключительно ею.
И ещё я писал вот что - http://18delphi.blogspot.ru/2013/04/vcl.html
Что до собственной канвы...
Она правда "сложна". Но оно того стоит.
Вот её интерфейсная секция:
На самом деле я про проблему - "знал, но забыл" :-)
СПАСИБО автору, что напомнил и освежил в памяти.
Это кстати одна из мотиваций того почему я написал "собственную канву" и стараюсь пользоваться исключительно ею.
И ещё я писал вот что - http://18delphi.blogspot.ru/2013/04/vcl.html
Что до собственной канвы...
Она правда "сложна". Но оно того стоит.
Вот её интерфейсная секция:
type Tl3Canvas = class(Tl3CanvasPrim, Il3Canvas, Il3InfoCanvas, Il3Font, Il3EffectiveColors) {* - объект реализующий свой уровень абстракции над TCanvas и Device Context (hDC). } private // internal fields f_OldBrushChange : TNotifyEvent; f_OldFontChange : TNotifyEvent; f_CheckingColors : Long; f_CheckingDrawing : Long; f_SuffixedFont : Boolean; private // property fields f_Zoom : Long; f_FrameLines : Il3FrameLines; f_etoFlags : Word; f_Invert : Long; f_Fore : Long; f_Filled : Tl3Region; f_Drawing : Long; f_BackColor : TColor; f_TextColor : TColor; f_FontIndex : Tl3FontIndex; f_FontIndexSet : Tl3FontIndexes; f_WindowOrg : Tl3Point; f_WindowOrgInited : Boolean; f_ClipRect : Tl3Rect; f_ClipRectS : Tl3SRect; f_Kerning : Tl3MemoryPool; f_Canvas : TCanvas; f_AlienCanvas : Bool; f_Owner : TObject; f_Painter : Il3HAFPainter; f_AverageCharHeight : Long; f_AverageCharWidth : Long; f_pxAverageCharWidth : Long; f_TextMetrics : TTextMetric; f_TextMetricsValid : Bool; f_PageOrientation : Tl3PageOrientation; f_SectionExtent : Tl3Point; f_ConvertBuf : PAnsiChar; f_Tabs : Long; f_TabOffset : Long; f_TabStops : Il3TabStops; f_NotFocused : Bool; f_DC : hDC; f_RegionBottomRight : Tl3SPoint; f_WOs : Tl3LongintList; f_Rgns : Tl3LongintList; f_BCs : Tl3LongintList; f_FCs : Tl3LongintList; f_SaveOrientation : Tl3PageOrientation; f_Font : Il3Font; f_PasswordChar : AnsiChar; f_OutString : Tl3String; f_ConvertTable : array [Bool] of Tl3MemoryPool; f_VirtualCanvas : Il3Canvas; protected // property fields f_DCFlag : TevDCFlag; private // event fields f_OnDrawSpecialChange : TNotifyEvent; protected // property methods function Get_EffectiveColors: Il3EffectiveColors; {-} function Get_FontColor: Tl3Color; {-} function Get_PasswordChar: AnsiChar; procedure Set_PasswordChar(aValue: AnsiChar); {-} function pm_GetInvert: Bool; {-} function pm_GetDrawing: Bool; {-} function pm_GetBackColor: TColor; procedure pm_SetBackColor(Value: TColor); {-} function pm_GetDC: hDC; override; procedure pm_SetDC(aValue: hDC); {-} function pm_GetTextColor: TColor; procedure pm_SetTextColor(Value: TColor); {-} function pm_GetFontIndexSet: Tl3FontIndexes; procedure pm_SetFontIndexSet(Value: Tl3FontIndexes); {-} function Get_Index: Tl3FontIndex; procedure pm_SetFontIndex(Value: Tl3FontIndex); {-} function pm_GetWindowOrg: Tl3Point; override; procedure pm_SetWindowOrg(const Value: Tl3Point); override; {-} function pm_GetSWindowOrg: Tl3SPoint; override; procedure pm_SetSWindowOrg(const Value: Tl3SPoint); override; {-} function pm_GetClipRect: Tl3Rect; override; procedure pm_SetClipRect(const Value: Tl3Rect); override; {-} function pm_GetGlobalClipRect: Tl3Rect; override; {-} function pm_GetDrawSpecial: Bool; procedure pm_SetDrawSpecial(Value: Bool); {-} function pm_GetPrinted: Bool; procedure pm_SetPrinted(Value: Bool); {-} procedure pm_SetNotFocused(Value: Bool); {-} function pm_GetShowCursor: Bool; procedure pm_SetShowCursor(Value: Bool); {-} function pm_GetDrawEnabled: Bool; {-} procedure pm_SetDrawEnabled(Value: Bool); {-} function pm_GetCanvas: TCanvas; procedure pm_SetCanvas(Value: TCanvas); {-} function pm_GetFrameLines: Il3FrameLines; {-} procedure pm_SetPainter(const aValue: Il3HAFPainter); {-} function pm_GetVCLFont: TFont; procedure pm_SetVCLFont(Value: TFont); {-} function pm_GetBrush: TBrush; procedure pm_SetBrush(Value: TBrush); {-} function pm_GetPen : TPen; procedure pm_SetPen(const aValue : TPen); {-} (* function GetOwner: TPersistent; virtual{override}; {-}*) procedure DoSetOwner(Value: TObject); //virtual{override}; {-} function pm_GetZoom: Long; procedure pm_SetZoom(Value: Long); {-} function pm_GetPageSetup: Il3PageSetup; {-} function pm_GetPenWidth: Long; {-} function pm_GetPageOrientation: Tl3PageOrientation; procedure pm_SetPageOrientation(Value: Tl3PageOrientation); {-} function pm_GetSectionExtent: Tl3Point; procedure pm_SetSectionExtent(const Value: Tl3Point); {-} function pm_GetetoFlags: Word; {-} function GetGlobalClipRectWithZoom: Tl3Rect; override; {-} protected // interface methods // Il3Font function Get_ForeColor: TColor; procedure Set_ForeColor(Value: TColor); {-} function Get_BackColor: TColor; procedure Set_BackColor(Value: TColor); {-} function Get_Height: Long; procedure Set_Height(Value: Long); {-} function Get_Name: TFontName; procedure Set_Name(const Value: TFontName); {-} function Get_Pitch: TFontPitch; procedure Set_Pitch(Value: TFontPitch); {-} function Get_Size: Long; procedure Set_Size(Value: Long); {-} function Get_Style: TFontStyles; procedure Set_Style(Value: TFontStyles); {-} procedure Il3Font.Set_Index = pm_SetFontIndex; {-} function Get_Bold: Boolean; procedure Set_Bold(Value: Boolean); {-} function Get_Italic: Boolean; procedure Set_Italic(Value: Boolean); {-} function Get_Underline: Boolean; procedure Set_Underline(Value: Boolean); {-} function Get_Strikeout: Boolean; procedure Set_Strikeout(Value: Boolean); {-} function AssignFont(aFont: TFont): Bool; {-} function IsAtomic: Boolean; {-} function FM: Il3FontMetrics; {-} procedure Assign2Font(const aFont: Il3Font); {-} function HF: hFont; {-} // Il3InfoCanvas function Get_Font: Il3Font; {-} procedure Set_Font(const Value: Il3Font); {-} function AdjustMarginsByPrintableArea(const aMargins: Tl3_Rect): Tl3_Rect; {* Откорректировать поля с учетом непечатаемой области } protected // internal methods procedure DoDrawLineTo(aX, aY: Integer); {-} procedure CheckColors; {-} procedure BrushChanged(ABrush: TObject); {-} procedure FontChanged(AFont: TObject); {-} function xCheckFilled: Tl3Region; {-} procedure AddRgn(const aRgn: Il3Region); virtual; {-} procedure FreeDC; {-} procedure FreeAlienDC(aDC: hDC); virtual; {-} function AsIl3Canvas: Il3Canvas; override; function CheckDrawing: Bool; {-} function GetAlienDC: hDC; virtual; {-} function DrawingIsValid: Bool; {* - проверяет возможно ли рисование. } function DeviceCaps(anIndex: Integer): Integer; override; {* - возвращает свойства устройства рисования. } procedure DoStartPage; virtual; {-} procedure StartPage; {-} procedure CheckOrientation; {-} procedure Cleanup; override; {-} procedure FillRectPrim(const R: TRect); virtual; {-} function WO(const aRect: Tl3Rect): Tl3SRect; overload; {-} function WO(const aPt: Tl3Point): Tl3SPoint; overload; {-} function WO(const aPt: Tl3SPoint): Tl3SPoint; overload; {-} procedure KerningTextOut(const P: Tl3Point; const R: Tl3Rect; const S: Tl3PCharLenPrim); overload; {-} procedure KerningTextOut(const P: Tl3SPoint; const R: Tl3SRect; const S: Tl3PCharLenPrim); overload; {-} function GetTabWidth: Long; {-} function KerningTextExtent(const S : Tl3PCharLenPrim): Tl3Point; virtual; {-} function TabOffset: Long; {-} procedure RestoreTabInfo(const aTabInfo: Il3TabInfo); {-} procedure AssignDeviceCaps; override; {-} function IsPreview: Boolean; virtual; {-} function GetClientRect: Tl3Rect; {-} function DoGetClientRect: Tl3Rect; virtual; {-} procedure Invalidate; virtual; {-} function IsVirtual: Boolean; virtual; {-} procedure FireDCSetToNull; virtual; {-} procedure MakeScreenDC; {-} function GetCaret: Il3Caret; virtual; {-} procedure DoAddRect(const aRect: Tl3SRect); {-} procedure DoAddRectPrim(const aRect: Tl3SRect); virtual; {-} procedure StartRegion; {-} procedure FinishRegion; {-} function pm_GetRegionBottomRight: Tl3Point; {-} procedure RecordRegionBottomPrim(const aBottom: Tl3SPoint); {-} procedure PushWO; {-} procedure PopWO; {-} procedure PushBC; {-} function TopBC: TColor; {-} procedure PopBC; {-} procedure PushFC; {-} procedure PopFC; {-} function CheckOutString(const aStr: Tl3PCharLen): Tl3PCharLen; {-} function CheckConvertTable(OEM : Bool): PAnsiChar; {-} function CheckConvertString(const aStr : Tl3PCharLen): Tl3PCharLen; {-} procedure InitFields; override; {-} protected // internal properties property VCLFont: TFont read pm_GetVCLFont write pm_SetVCLFont; {-} public // public methods constructor CreateOwned(anOwner : TObject); {-} constructor CreateForPrinting(const aPrinter: Il3Printer); {-} class function Make: Il3Canvas; {-} class function MakeForPrinting(const aPrinter: Il3Printer): Il3InfoCanvas; {-} class function MakeForScreen: Il3InfoCanvas; {-} procedure SetCanvas(Value: TCanvas; Alien: Bool); virtual; {-} procedure AddRect(const aRect: Tl3SRect); {-} procedure DoFillForeRect(const R: Tl3SRect); virtual; {-} procedure FillForeRect(const R: Tl3SRect); {-} procedure FillRect(const R: Tl3SRect); overload; {-} procedure FillRect(const R: Tl3Rect); overload; {-} function FillRgn(const Region: Il3Region): Bool; {-} procedure ExtTextOut(const aPt : Tl3Point; const aRect : Tl3Rect; const aSt : Tl3PCharLenPrim; aFl : Tl3TextFormatFlag = l3_tffLeft; aKerning : PInteger = nil); overload; {-} procedure ExtTextOut(const P: Tl3SPoint; const R: Tl3SRect; const S: Tl3PCharLenPrim; aFl: Tl3TextFormatFlag = l3_tffLeft; aKerning: PInteger = nil); overload; {-} function CaretLineOut(const aSt : Tl3PCharLenPrim; LineHeight : Long; aHidden : Boolean; var CaretPos : Long): Tl3Point; {* - выводит строку текста высотой LineHeight, со сдвигом курсора отрисовки. устанавливает курсор в CaretPos. Возвращает размеры выведенной строки. } function DrawText(const aSt : Tl3PCharLenPrim; var R : TRect; aFormat : uInt; AFl : TObject = nil): Il3MultiLines; {-} function StringOut(const P: Tl3Point; const Text: Tl3WString): Tl3Point; {-} function InvertColor(aColor: TColor): TColor; {-} procedure StretchDraw(const R: Tl3Rect; Graphic: TGraphic); {-} function LP2DP(const P: Tl3_Point; NeedZoom : Bool = false): Tl3SPoint; {-} function LR2DR(const R: Tl3Rect): Tl3SRect; {-} function DR2LR(const R: Tl3SRect): Tl3Rect; {-} function TextExtent(const S : Tl3PCharLenPrim; aNoTabs : Boolean = false): Tl3Point; {* - возвращает размеры строки текста в дюймах. } function Pos2Index(W: Long; const S: Tl3PCharLen): Long; {* - находит индекс символа на рассоянии W дюймов от начала строки S. } function Pos2IndexQ(W : Long; const S : Tl3PCharLen; var aNoTabs : Boolean): Long; {* - находит индекс символа на рассоянии W дюймов от начала строки S. } function pxAverageCharWidth: Long; {* - средняя ширина символов контекста в пикселях. } function AverageCharWidth: Long; {* - средняя ширина символов контекста в дюймах. } function AverageCharHeight: Long; {* - средняя высота символов контекста в дюймах. } procedure MoveTo(const aPt: Tl3Point); overload; {-} procedure LineTo(const aPt: Tl3Point); overload; {-} procedure MoveTo(const aPt: Tl3SPoint); overload; {-} procedure LineTo(const aPt: Tl3SPoint); overload; {-} procedure Line(const A, B: Tl3Point); overload; {* - нарисовать линию. } procedure Line(const A, B: Tl3SPoint); overload; {* - нарисовать линию. } function CaretExtent: Tl3Point; {-} procedure StartTabs(out theTabInfo : Il3TabInfo; const aTabStops : Il3TabStops; aTabOffset : Long = 0); overload; {-} procedure StartTabs(out theTabInfo : Il3TabInfo; const aTabInfo : Il3TabInfo); overload; {-} procedure FinishTabs(var aTabInfo: Il3TabInfo); {-} function TabInfo: Il3TabInfo; {-} function EQ(const aCanvas: Il3InfoCanvas): Bool; {-} function NeedOpenRealPage(aDoc : Boolean; ByWidth: Boolean = false): Tl3OpenPageResult; virtual; {-} procedure StartPrinterPage(aDoc : Boolean); virtual; {-} procedure BeginPaint; {-} procedure StartObject(anObjectID: Integer); {-} procedure DoStartObject(anObjectID: Integer); virtual; {-} procedure DoSetPageTop; virtual; {-} procedure SetPageTop; {-} procedure DoEndPaint; virtual; {-} procedure EndPaint; {-} procedure BeginInvert; {-} procedure EndInvert; {-} function CreateRectRgn(const aRect: Tl3SRect): Tl3Rgn; {-} function OffsetRgn(const Rgn: Il3Region; const Pt: Tl3Point): Integer; {-} procedure FillEmptyRect(const R: Tl3Rect); overload; virtual; {-} procedure FillEmptyRect(const R: Tl3SRect); overload; virtual; {-} function GetKerning(const aSt : Tl3PCharLenPrim; aKerning : PLong): Tl3Point; {-} function TextOut(const P : Tl3Point; const S : Tl3PCharLen; FC : TColor = clDefault; BC : TColor = clDefault): Tl3Point; {-} procedure SetDC(DC: HDC; Flag: TevDCFlag); {-} function CheckKerning(Size: Long): Pointer; {-} function NewPage(ByWidth: Bool = false): Boolean; {-} procedure SetCaret(const Origin, Extent: Tl3Point; aHidden: Bool = false); {-} procedure IncCaret(aDeltaX: Long); {-} function DrawRgnOrBlock: Bool; {-} function HasToDraw: Bool; {-} function NearestColor(C: TColor): TColor; {-} procedure Lock; {-} procedure Unlock; {-} procedure MoveWindowOrg(const aDelta: Tl3Point); overload; {-} procedure MoveWindowOrg(const aDelta: Tl3SPoint); overload; {-} function TextMetrics: PTextMetric; {-} procedure TabbedTextOut(const P: Tl3Point; const R: Tl3Rect; const S: Tl3PCharLenPrim; const aTabStops: Il3TabStops); overload; {-} procedure TabbedTextOut(const P: Tl3SPoint; const R: Tl3SRect; const S: Tl3PCharLenPrim; const aTabStops: Il3TabStops); overload; {-} procedure TabbedMultilineTextOut(const aSt : Tl3PCharLenPrim; const Tabs : Il3TabStops; var Rect : Tl3Rect; Precalculate : Boolean; aGap : Integer); {-} procedure DrawFocusRect(const aRect: Tl3SRect); {-} public // public properties property NotFocused: Bool read f_NotFocused write f_NotFocused; {-} property DCFlag: TevDCFlag read f_DCFlag; {-} property etoFlags: Word read pm_GetetoFlags write f_etoFlags default eto_Opaque{ + eto_Clipped}; {-} property Invert: Bool read pm_GetInvert; {-} property Drawing: Bool read pm_GetDrawing; {-} property Canvas: TCanvas read pm_GetCanvas write pm_SetCanvas; {-} property FrameLines: Il3FrameLines read pm_GetFrameLines; {* - Парень, ответственный за выравниваение и отрисовку линий. } property Painter: Il3HAFPainter read f_Painter write f_Painter; {-} property BackColor: TColor read pm_GetBackColor write pm_SetBackColor default def_PaperColor; {-} property Printed: Bool read pm_GetPrinted write pm_SetPrinted; {-} property ShowCursor: Bool read pm_GetShowCursor write pm_SetShowCursor; {-} property DrawEnabled: Bool read pm_GetDrawEnabled write pm_SetDrawEnabled; {-} property Font: Il3Font read Get_Font write Set_Font; {-} property Brush: TBrush read pm_GetBrush write pm_SetBrush; {-} property Pen : TPen read pm_GetPen write pm_SetPen; {-} property TextColor: TColor read pm_GetTextColor write pm_SetTextColor default clBlack; {-} property FontIndexSet: Tl3FontIndexes read pm_GetFontIndexSet write pm_SetFontIndexSet default []; {-} property FontIndex: Tl3FontIndex read Get_Index write pm_SetFontIndex; {-} property PageNumber: Long read pm_GetPageNumber; {-} property PageWidthNumber: Long read pm_GetPageWidthNumber; {-} property PageSetup: Il3PageSetup read pm_GetPageSetup; {-} property PageOrientation: Tl3PageOrientation read pm_GetPageOrientation write pm_SetPageOrientation; {-} property SectionExtent: Tl3Point read pm_GetSectionExtent write pm_SetSectionExtent; {-} property DC: hDC read pm_GetDC; {-} property Owner: TObject read f_Owner{GetOwner}; {-} public // public events property OnDrawSpecialChange: TNotifyEvent read f_OnDrawSpecialChange write f_OnDrawSpecialChange; {-изменение свойства - показывать или нет спецсимволы} public // public properties property DrawSpecial: Bool read pm_GetDrawSpecial write pm_SetDrawSpecial default false; {-} property Zoom: Long read f_Zoom write pm_SetZoom default def_Zoom; {-} end;//Tl3Canvas
Комментариев нет:
Отправить комментарий