|
소스를 보니 뭐지 잘 모르겠습니다. 하여튼 그림을 조금 빠르게 보여 주고 싶으신 것 같습니다.
DC를 사용하면 왠만큼 빠릅니다.... 그래서 CODE를 조금 했습니다. 토일도 일하느라 너무 피곤해서 그냥 아침에 기분전환으로 ... ㅋㅋㅋㅋ
실행파일 소스 있으니 참고하시고 소스는 아래와 같습니다. 보시고 응용해 보세요...
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hMemDC_img1 = NULL;
hMemDC_img2 = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnLoadImage1Click(TObject *Sender)
{
HBITMAP bmp;
bmp = (HBITMAP)LoadImage(0, "Image\\img_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject( bmp, sizeof(BITMAP), &BITMAP_img1);
//Image1의 DC에 대한 호환 DC를 생성한다.
//그러면 Image1->Canvas의 HDC와 같은 DC가 만들어 진다.
hMemDC_img1 = CreateCompatibleDC( Image1->Canvas->Handle );
SelectObject(hMemDC_img1, bmp);
//------------------------------------------------------
bmp = (HBITMAP)LoadImage(0, "Image\\img_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject( bmp, sizeof(BITMAP), &BITMAP_img2);
//Image1의 DC에 대한 호환 DC를 생성한다.
//그러면 Image1->Canvas의 HDC와 같은 DC가 만들어 진다.
hMemDC_img2 = CreateCompatibleDC( Image1->Canvas->Handle );
SelectObject( hMemDC_img2, bmp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnViewImag1Click(TObject *Sender)
{
if( hMemDC_img1 )
{
BitBlt( Image1->Canvas->Handle, 0 ,0 , BITMAP_img1.bmWidth,BITMAP_img1.bmHeight, hMemDC_img1, 0,0, SRCCOPY);
Image1->Refresh();
}
else
ShowMessage( "이미지를 불러 주세요" );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnViewImag2Click(TObject *Sender)
{
if( hMemDC_img2 )
{
BitBlt( Image1->Canvas->Handle, 0 ,0 , BITMAP_img2.bmWidth,BITMAP_img2.bmHeight, hMemDC_img2, 0,0, SRCCOPY);
Image1->Refresh();
}
else
ShowMessage( "이미지를 불러 주세요" );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Picture->Bitmap->Width = Image1->Width;
Image1->Picture->Bitmap->Height = Image1->Height;
}
//---------------------------------------------------------------------------
아야 님이 쓰신 글 :
: 안녕하세요~~~~~~또다시 이렇게 질문을 올리게 되었습니당.... m(- -)m
: 즐거운 주말 보내셨나요??? 전.... 이것땜시 잠을 설쳤답니당...... - -;
: 다름이 아니라 우선 구조가...
:
: ---------- 전송 |------------| 복사 |----------- |
: - Main - <======= |MainmemDC | <========= | virmemDC |
: - 화면 - | | | |
: - -------- |----------- | |-----------|
: ^ ^
: 이미지로드 | | 이미지로드
: |-------------| |-------------|
: | Main용이미지 | | 특정이미지 |
: |-------------| |-------------|
: 왜 메모리DC를 두개를 만들었냐면요 특정이미지에 마우스로 클릭하면 팝업의 서브폼이 열러 거기에서 버턴을 클릭하면 선택한 이미지가 위로 회전하고 아래로 회전가능하게 하고 싶어서....
: 그러려면 MaimmemDC 랑 virmemDC 에서 변화가 있으면 MainmemDC 변환시켜 메인화면에 전송...
: 이런식으로 하고 싶은데.... 메인DC 랑 virDC의 핸들이 안잡혀요....우선 소스가...
: //----------------------------
: TMainForm *MainForm;
: TPoint Cam_lst[] = {
: ( Point)( 269, 151),
: ( Point)( 354, 410),
: ( Point)(NULL, NULL)
: };
: //---------------------------------------------------------------------------
: __fastcall TMainForm::TMainForm(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: void __fastcall TMainForm::FormPaint(TObject *Sender)
: {
: TPoint *list;
: BOOL res = FALSE;
: int sx, sy, cx, cy;
: // 메인용 화면 로드
: scr_bmp = (HBITMAP)LoadImage(0, "Image\\Map_Test.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
: // 메인위로 표시할 화면 로드
: cam_bmp = (HBITMAP)LoadImage(0, "Image\\BlueCam_Img.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
: GetObject(scr_bmp,sizeof(BITMAP),&scr_info);
: GetObject(cam_bmp,sizeof(BITMAP),&cam_info);
: scrdc = CreateCompatibleDC( NULL);
: virdc = CreateCompatibleDC( NULL); <--------------virmemDC도 작성해야한는지 궁금
: SelectObject(scrdc, scr_bmp);
: //SelectObject(virdc, cam_bmp);
: // 전송을 메인DC에 복사하고 싶은데 모르겠어요...........핸들을 어떻게...--;
: res = BitBlt( ?????????, 0 ,0 , scr_info.bmWidth,scr_info.bmHeight,scrdc,0,0,SRCCOPY);
: list = &Cam_lst[ 0];
: do {
: SelectObject(scrdc, cam_bmp);
: // 전송을 메인DC에 복사하고 싶은데 모르겠어요...........--;
: BitBlt( ????????????????,list->x, list->y, cam_info.bmWidth, cam_info.bmHeight, scrdc, 0, 0, SRCC OPY);
: list++;
: } while(( list->x != NULL)||( list->y != NULL));
: // Image1->Canvas->CopyRect(Rect(0,0,Image1->Picture->Width,Image1->Picture->Height),
: // Image1->Picture->Bitmap->Canvas,Rect(0,0,scr_info.bmWidth,scr_info.bmHeight));
: Image1->Refresh();
: DeleteDC(scrdc);
: // DeleteDC(camdc);
: }
: //---------------------------------------------------------------------------
: void __fastcall TMainForm::FormDestroy(TObject *Sender)
: {
: if ( cam_bmp != NULL) {
: DeleteObject( cam_bmp);
: }
: if ( scr_bmp != NULL) {
: DeleteObject(scr_bmp);
: }
: }
: //----------------------------------------------------------------
: void __fastcall TMainForm::Image1MouseDown(TObject *Sender,
: TMouseButton Button, TShiftState Shift, int X, int Y)
: {
: TPoint *cam_list;
: if(Button == mbRight){
: // 팝업처리작성
: }
: }
: //---------------------------------------------------------------------------
: void __fastcall TMainForm::CamTestClick(TObject *Sender)
: {
: CamForm->Show();
: }
: //---------------------------------------------------------------------------
: 이렇게 하면 되는건지 확실치도 않고.....
: ?????? 란에 메일이미지 핸들을 잡아주면 이미지가 뜨긴 뜨는데..... 서브폼에서 버턴처리가 가능해지는지...이것도 궁금하고....
|