|
this 포인터는 아마도 폼일테고...
비트맵에 미리 그려놓고 그걸 폼에 엎어씌우려는 것인지요.
어떤 목적이든, 보여주신 코드에는 좀 문제가 있습니다.
비트맵을 생성한 직후 비트맵의 캔바스에는 이미 DC가 할당된 상태입니다.
또 폼의 캔바스에도 DC가 할당된 상태이구요.
따라서 보여주신 것처럼 비트맵 캔바스의 DC 핸들에 폼 캔바스의 DC 핸들을 할당해버리면 원래의 비트맵 캔바스 핸들은
갈곳을 잃어버리고 누수(leak)됩니다.
또한 비트맵과 폼의 캔바스 각각에 이미 생성되어 할당된 DC가 있으므로 어떤 이유이든 그넘들을 ReleaseDC()를
해버리면 문제가 생깁니다.
아마도 빈 TCanvas 객체를 생성해서 다른 객체의 DC를 할당하고 그림을 그리는 루틴을 보시고 따라하신 듯 한데,
그러려면 비트맵의 캔바스가 아니라 그냥 캔바스 객체만 생성해서 그려주셔야 합니다.
TCanvas *MyCanvas = new TCanvas;
MyCanvas->Handle = 어떤DC;
위의 코드는 주로 API 코딩을 통해 VCL 컴포넌트가 아닌 API 객체의 DC를 생성하거나 얻어왔을 경우, 그 DC에 그림을
그리는 작업을 간단히 하기 위해 흔히 쓰는 코드입니다. 주로 메시지핸들러 등에서 쓰이지요.
따라서 원하시는 결과가 무엇인지는 모르겠으나 위의 코드가 이 경우에 적용할 수 있는 것이 아닙니다.
만약 비트맵에 미리 그려놓고 폼에 한번에 엎으려고 하는 것이라면,
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
pBitmap->Canvas 에 그림.
this->Canvas->Draw(0, 0, pBitmap);
delete pBitmap;
이것만으로 충분합니다.
그럼...
잠스타 님이 쓰신 글 :
: bitmap 에 그린 후 canvas 에서 한번에 bitmap 을 그릴려고 합니다.
:
: Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
: HDC hdc = ::GetDC(this->Canvas->Handle);
: pBitmap->Canvas->Handle = hdc;
: pBitmap->Width = this->Width;
: pBitmap->Height= this->Height;
:
: //pBitmap->Canvas 에 그림.
:
: this->Canvas->Draw(0, 0, pBitmap);
: ::ReleaseDC(pBitmap->Canvas->Handle, hdc);
: delete pBitmap;
:
: 이런 식으로 되어 있습니다. 여기서 궁금한건,
: 현재 canvas 의 handle 을 구해서 bitmap 의 canvas 의 handle 에 붙이는게 맞는가요?
: 또 다 쓰고 해제할 때, bitmap의 canvas 의 handle 에서 GetDC 로 구한 hdc 를 해제하는 게 맞는지 햇갈림니다..
:
: 이렇게 bitmap 을 생성해서 그릴 때, handle 을 붙여서 사용하는지도 궁금하고요...
: 답변 부탁드릴께요...
|