|
VC의 PictureBox를 써보진 않았지만
VC의 PictureBox는 CBuilder에서는 System탭에 있는 PaintBox가 아닐까 싶은데요..
1. Paint 이벤트가 계속 발생는 문제..
TImage는 Handle이 없습니다. HDC도 없구요
결론적으로 Form의 DC에다가 draw하는겁니다.
그래서 Image에서 Draw하면 그것을 화면에 반영하기 위해 WM_PAINT 이벤트가 발생합니다.
TImage는 Canvas에 Draw한것을 기억합니다.
그러므로 아무때나 한번만 draw해주면 됩니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) // TImage에는 한번만..
{
Image1->Canvas->TextOut(20,20,"하하하");
Image1->Canvas->MoveTo(0,0);
Image1->Canvas->LineTo(100,100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender) // Form의 Canva에 그리는것은?
{
Canvas->TextOut(20,20,"하하하");
Canvas->MoveTo(0,0);
Canvas->LineTo(100,100);
}
//---------------------------------------------------------------------------
2. Lock / UnLock 문제
그냥은 안해도 됩니다.
쓰레드가 여럿 있을때 , 여러 쓰레드에서 Canvas에 접근할때 사용합니다.
vcl 소스에...
Lock ==> EnterCriticalSection(FLock);
UnLock ==> LeaveCriticalSection(FLock);
Lock()함수에 커서 갇다 두고 F1 Help를 보세요 설명이 나옵니다.
그럼...
android 님이 쓰신 글 :
: 빌더를 처음 사용하는지라 툴도 익힐겸 간단히 테트리스를 짜보려고 합니다.
: VC의 PictureBox에 해당하는것이 TImage인가요?
:
: void __fastcall Form1Paint(Tobject *Sender)
: {
: static int i=0;
: TRACE("Test = %d", i++);
:
: Image1->Canvas->Lock();
: Image1->Canvas->TextOut(20,20,"하하하");
: Image1->Canvas->MoveTo(0,0);
: Image1->Canvas->LineTo(100,100);
: Image1->Canvas->Unlock();
: }
:
: 두가지 질문입니다.
:
: 1.
: Paint는 화면이 가려진다거나 했을때 호출되는건데 위의 소스는 계속 호출됩니다.
: 그래서 매우 깜빡깜빡거리고 있고 TRACE문도 쉴새없이 실행되고있죠.
: 아무래도 TImage 때문인거같은데.. 어떻게 끄나요?
:
: 2.
: 스레드를 실행하는것도 아니고 TImage위에 선과 글씨만 쓰는건데 Lock, Unlock이 왜 필요합니까?
: Q&A 검색해봤는데 대부분 그걸 쓰더군요.
|