|
원초적인 방법이지만.. :)
어쨌거나 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;
}
}
//---------------------------------------------------------------------------
이운국 님이 쓰신 글 :
: .
|