기술탐구

[오픈캡쳐] 마우스 오른쪽 버튼을 눌러서 브러쉬 색으로 그리기

appleii 2009. 9. 6. 12:27


그림판은 네모나 원을 그릴 때 마우스 오른쪽 버튼을 누르면 브러쉬 색으로 그려지는 기능이 있다. 현재 오픈 캡쳐에는 이 기능이 없는데 간단한 방법으로 기능을 추가해 보자.

우선, 문제점으로 지적되었던 펜과 브러쉬 색상의 배열 문제를 해결해 보자.

 1. 색상 팔레트 표시 순서 바꾸기

현재의 오픈 캡쳐는 펜 색상이 뒤에 브러쉬 색상이 앞에 놓이는 형태이다. 대부분의 그래픽 에디터나 포토샵 같은 경우는 펜 색상(전경색)이 앞에 놓인다. 이것을 해결하기 위해서는 uMain.pas 의 OnCreate 이벤트 핸들러를 수정해야 한다.

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  
  ...
  

  FPaletteBrush.Parent := pnlPaintBox;
  FPalettePen.Parent := pnlPaintBox;

  ...  
  
end;


FPaletteBrush 의 부모(Parent)를 pnlPaintBox 로 지정한다. 부모(Parent)는 화면에 표시되는 방법을 나타낸다. 자식은 부모 위에 표시되며 폰트나 색상을 이어받을 수 있다.  부모가 같을 경우 먼저 부모를 지정한 개체가 밑에 놓인다. 이것을 이용하면 오픈 캡쳐에서 색상 팔레트의 표시 순서를 바꿀 수 있다.

 Before  After
 
 
FPalettePen.Parent := pnlPaintBox;
FPaletteBrush.Parent := pnlPaintBox;
FPaletteBrush.Parent := pnlPaintBox;
FPalettePen.Parent := pnlPaintBox;


2. 브러쉬 색으로 선 그리기

그림판은 마우스 오른쪽 버튼을 누르면 브러쉬 색으로 선 그리기가 가능하다. 그러나 현재의 오픈 캡쳐는 오른쪽 버튼을 누르면 팝업 창이 뜬다. 팝업 창이 뜨는 것은 일부 툴에 한에서만 허용하고 나머지는 브러쉬 색으로 그리기가 가능하도록 바꾸어 보자.

일단, 팝업창을 툴에 따라서 선별해서 뜨도록 바꾸어 본다.

uMDI.pas 에는 PopupMenu 의 OnPopup 이벤트 핸들러인 PopupMenuPopup 이 있다. 그 부분에 조건문이 있는데 그 부분을 다음처럼 수정해 준다.


if (ToolSel in [tsDrag, tsText, tsSelect]) = True then

 
다음 그림에서 보이는 도구 3개는 Popup 이 뜨며 나머지는 오른쪽 버튼을 다른 용도로 쓸 수 있다.




procedure TfrmMDI.AImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);

  procedure DrawingToolSetup;
  begin

    ...

        if Button in [mbLeft] then
        begin
          Pen.Color := FPalettePen.Color;
          Brush.Color := FPaletteBrush.Color;
        end
        else if Button in [mbRight] then
        begin
          Pen.Color := FPaletteBrush.Color;
          Brush.Color := FPalettePen.Color;
        end;
    ...


왼쪽 버튼이 눌려졌을 경우 (if Button in [mbLeft]) 펜과 브러쉬 색상을 팔레트 색상과 일치시킨다. 그러나, 오른쪽 버튼이 눌려졌을 경우 (if Button in [mbRight]) 에는 펜과 브러쉬 색상을 팔레트 색상과 반대로 대입시킨다.


오픈 캡쳐는 마우스 버튼이 눌려진 상태를 나타내기 위해서 FDown 이라는 변수를 사용한다. 따라서 오른쪽 버튼이 눌려진 상태를 나타내기 위해서 다음과 같이 바꾸어 주어야 한다.

if (Button in [mbLeft, mbRight]) or (ToolSel = tsZoom) then FDown := True;
 
추가된 부분은 mbRight 이다. 집합연산은 일종의 or 연산과 같으므로 다음과 같이 해도 마찬가지다.
if (Button in [mbLeft) or (Button in [mbRight]) or (ToolSel = tsZoom) then FDown := True;



3. 오른쪽 버튼으로 브러쉬 색 바꾸기

현재의 오픈 캡쳐는 색상을 선택할 때 마우스 왼쪽 버튼으로 펜 색만 바꿀 수 있다. 이것을 수정해서 오른쪽 버튼을 누르면 브러쉬 색도 바꿀 수 있도록 수정해 보자.

이건 뭐 별로 어려울 것 없이 MouseDown 이벤트 핸들러를 다음과 같이 수정하면 된다.


      tsSelColor: with frmMain do
        begin
          nPt := SetZoomPoint(Point(X, Y));
          if Button in [mbLeft] then
            FPalettePen.Color := FAImage.Bitmap.Canvas.Pixels[nPt.X, nPt.Y]
          else if Button in [mbRight] then
            FPaletteBrush.Color := FAImage.Bitmap.Canvas.Pixels[nPt.X, nPt.Y];


 

색상을 선택하는 도구를 선택하고 오른쪽 버튼을 눌렀을 때 마우스 포인터가 위치한 곳의 색상을 브러쉬 색상에 대입시킨다.