C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[28061] Re:Re:Re:답변에 감사드리며... 이제 길이 보이네요. (냉무)
유영인 Cuperido [cuperido] 1555 읽음    2003-12-02 15:33
원초적인 방법이지만.. :)
어쨌거나 XOR 글자 출력..

수정하셔서 좋은 결과 만들어내시길.. ^^


cuperido

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1            *Form1;

struct srFocus {
  Graphics::TBitmap     *BACKGROUND;
  int                   X;
  int                   Y;
} FOCUS;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{

FOCUS.BACKGROUND = NULL;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)
{

// 아무 이미지나 로드. 테스트용
Image1->Picture->LoadFromFile("C:\\Windows\\바람부는 들판.bmp");
Image1->Picture->Bitmap->PixelFormat = pf24bit;

// 깜빡거림 방지
DoubleBuffered = true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

PrintText(Image1->Canvas, X, Y, "CLICK");

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

PrintText(Image1->Canvas, -1, -1, "CLICK");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::PrintText(TCanvas *tcCanvas, int itX, int itY, String stText)
{

Graphics::TBitmap *btFontBitmap;
TRect             trSourceRect, trTargetRect;
int               itFontX, itFontY;
RGBTRIPLE         *rtFontColor, *rtSourceColor;


if(!FOCUS.BACKGROUND) {
   // 그리기
   btFontBitmap                  = new Graphics::TBitmap;
   FOCUS.BACKGROUND              = new Graphics::TBitmap;
   btFontBitmap->Width           = tcCanvas->TextWidth(stText);
   btFontBitmap->Height          = tcCanvas->TextHeight(stText);
   FOCUS.BACKGROUND->Width       = tcCanvas->TextWidth(stText);
   FOCUS.BACKGROUND->Height      = tcCanvas->TextHeight(stText);
   btFontBitmap->PixelFormat     = pf24bit;
   FOCUS.BACKGROUND->PixelFormat = pf24bit;

   trSourceRect = Rect(0, 0, btFontBitmap->Width, btFontBitmap->Height);
   trTargetRect = Rect(itX, itY, itX + btFontBitmap->Width, itY + btFontBitmap->Height);

   // 폰트 비트맵을 설정하고 폰트를 찍는다
   btFontBitmap->Canvas->Brush->Color = clBlack;
   btFontBitmap->Canvas->Font->Color  = clWhite;
   btFontBitmap->Canvas->FillRect(trSourceRect);
   btFontBitmap->Canvas->TextOut(0, 0, stText);

   // 백업용 캔버스 갱신
   FOCUS.BACKGROUND->Canvas->CopyRect(trSourceRect, tcCanvas, trTargetRect);

   // 픽셀 정보 알아내기. 24Bit Bitmap용 포맷용
   for(itFontY = 0; itFontY < btFontBitmap->Height; itFontY ++) {
     rtFontColor   = (RGBTRIPLE *)btFontBitmap->ScanLine[itFontY];
     rtSourceColor = (RGBTRIPLE *)FOCUS.BACKGROUND->ScanLine[itFontY];

     for(itFontX = 0; itFontX < btFontBitmap->Width; itFontX ++)
       if((TColor)RGB(rtFontColor[itFontX].rgbtRed, rtFontColor[itFontX].rgbtGreen, rtFontColor[itFontX].rgbtBlue) == btFontBitmap->Canvas->Font->Color) {
         // 글자일 경우 처리
         rtFontColor[itFontX].rgbtRed   = rtSourceColor[itFontX].rgbtRed   ^ clWhite;
         rtFontColor[itFontX].rgbtGreen = rtSourceColor[itFontX].rgbtGreen ^ clWhite;
         rtFontColor[itFontX].rgbtBlue  = rtSourceColor[itFontX].rgbtBlue  ^ clWhite;
        } else {
         // 글자가 아닐경우 처리
         rtFontColor[itFontX] = rtSourceColor[itFontX];
       }
   }

   // Xor된 폰트 복사
   tcCanvas->CopyRect(trTargetRect, btFontBitmap->Canvas, trSourceRect);

   FOCUS.X = itX;
   FOCUS.Y = itY;

   delete btFontBitmap;
  } else {
   // 지우기
   itX = FOCUS.X;
   itY = FOCUS.Y;

   trSourceRect = Rect(0, 0, FOCUS.BACKGROUND->Width, FOCUS.BACKGROUND->Height);
   trTargetRect = Rect(itX, itY, itX + FOCUS.BACKGROUND->Width, itY + FOCUS.BACKGROUND->Height);
   tcCanvas->CopyRect(trTargetRect, FOCUS.BACKGROUND->Canvas, trSourceRect);

   delete FOCUS.BACKGROUND;
   FOCUS.BACKGROUND = NULL;
}

}

//---------------------------------------------------------------------------

이운국 님이 쓰신 글 :
: .

+ -

관련 글 리스트
28044 Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 이운국 1028 2003/12/02
28059     Re:Re:답변에 감사드리며... 이제 길이 보이네요. (냉무) 이운국 1126 2003/12/02
28061         Re:Re:Re:답변에 감사드리며... 이제 길이 보이네요. (냉무) 유영인 Cuperido 1555 2003/12/02
28057     Re:Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 투명 1819 2003/12/02
34101         Re:Re:Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 이운국 1173 2003/12/02
28048     Re:Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 유영인 Cuperido 1666 2003/12/02
34100         Re:Re:Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 이운국 1085 2003/12/02
28060         Re:Re:Canvas->TextOut 시 문자를 XOR 로 찍을려면 어케 하나요.(냉무) 유영인 Cuperido 1400 2003/12/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.