마음의 안정을 찾기 위하여 - Canvas 없는 컨트롤에서 Canvas 사용하기
1961418
192
322
관리자새글쓰기
태그위치로그방명록
별일없다의 생각
dawnsea's me2day/2010
색상(RGB)코드 추출기(Color...
Connection Generator/2010
최승호PD, '4대강 거짓말 검...
Green Monkey**/2010
Syng의 생각
syng's me2DAY/2010
천재 작곡가 윤일상이 기획,...
엘븐킹's Digital Factory/2010
Canvas 없는 컨트롤에서 Canvas 사용하기
Delphi/Graphics, Draw | 2009/12/17 10:34
Canvas가 없는 Component에 Canvas를 이용할 수 있도록 하는 방법.

1. TControlCanvas를 이용하는 방법

type
  TForm1 = class(TForm)
    Edit1: TEdit;
...
  private
    FCanvas: TCanvas;
...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Edit1;
end;

procedure TForm1.자기함수...
begin
  FCanvas.LineTo(Edit1.Width, Edit1.Height);
end;



2. TCanvas를 이용하는 방법.

var
  EdtCanvas: TCanvas;
begin

  EdtCanvas:=TCanvas.Create;
  EdtCanvas.Handle:=GetDC(Edit1.Handle);

...
  //원하는대로 사용하구..
  EdtCanvas.MoveTo(..
  EdtCanvas.LineTo(...

  ...

  ReleaseDC(EdtCanvas.Handle);
  EdtCanvas.Free;
end;




TControlCanvas가 TCanvas를 상속 받아 DC를 할당하는 것을 구현해놓은 클래스이기 때문에, TCanvas를 이용하는 방법보다는 편함.


Controls.Pas에 포함되어 있는 TControlCanvas의 구현 부분 소스

{ TControlCanvas }

const
  CanvasListCacheSize = 4;

var
  CanvasList: TThreadList;

// Free the first available device context
procedure FreeDeviceContext;
var
  I: Integer;
begin
  with CanvasList.LockList do
  try
    for I := 0 to Count-1 do
      with TControlCanvas(Items[I]) do
        if TryLock then
        try
          FreeHandle;
          Exit;
        finally
          Unlock;
        end;
  finally
    CanvasList.UnlockList;
  end;
end;

procedure FreeDeviceContexts;
var
  I: Integer;
begin
  with CanvasList.LockList do
  try
    for I := Count-1 downto 0 do
      with TControlCanvas(Items[I]) do
        if TryLock then
        try
          FreeHandle;
        finally
          Unlock;
        end;
  finally
    CanvasList.UnlockList;
  end;
end;

destructor TControlCanvas.Destroy;
begin
  FreeHandle;
  inherited Destroy;
end;

procedure TControlCanvas.CreateHandle;
begin
  if FControl = nil then inherited CreateHandle else
  begin
    if FDeviceContext = 0 then
    begin
      with CanvasList.LockList do
      try
        if Count >= CanvasListCacheSize then FreeDeviceContext;
        FDeviceContext := FControl.GetDeviceContext(FWindowHandle);
        Add(Self);
      finally
        CanvasList.UnlockList;
      end;
    end;
    Handle := FDeviceContext;
    UpdateTextFlags;
  end;
end;

procedure TControlCanvas.FreeHandle;
begin
  if FDeviceContext <> 0 then
  begin
    Handle := 0;
    CanvasList.Remove(Self);
    ReleaseDC(FWindowHandle, FDeviceContext);
    FDeviceContext := 0;
  end;
end;

procedure TControlCanvas.SetControl(AControl: TControl);
begin
  if FControl <> AControl then
  begin
    FreeHandle;
    FControl := AControl;
  end;
end;

procedure TControlCanvas.UpdateTextFlags;
begin
  if Control = nil then Exit;
  if Control.UseRightToLeftReading then
    TextFlags := TextFlags or ETO_RTLREADING
  else
    TextFlags := TextFlags and not ETO_RTLREADING;
end;

2009/12/17 10:34 2009/12/17 10:34
Article tag list Go to top
View Comment 0
Trackback URL :: 이 글에는 트랙백을 보낼 수 없습니다
 
 
 
 
: [1] ... [301][302][303][304][305][306][307][308][309] ... [855] :
«   2021/11   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
전체 (855)
출판 준비 (0)
My-Pro... (41)
사는 ... (492)
블로그... (22)
My Lib... (32)
게임 ... (23)
개발관... (3)
Smart ... (1)
Delphi (75)
C Builder (0)
Object... (0)
VC, MF... (9)
Window... (1)
Open API (3)
Visual... (0)
Java, JSP (2)
ASP.NET (0)
PHP (4)
Database (12)
리눅스 (28)
Windows (23)
Device... (1)
Embedded (1)
게임 ... (0)
Web Se... (2)
Web, S... (19)
잡다한... (5)
프로젝트 (0)
Personal (0)
대통령... (9)
Link (2)