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
[45809] Re:Bitmap을 메모리DC에서 불러들일때요.....
박영목 [gsbsoft] 2030 읽음    2006-07-24 11:15
소스를 보니 뭐지 잘 모르겠습니다. 하여튼 그림을 조금 빠르게 보여 주고 싶으신 것 같습니다.
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();
: }
: //---------------------------------------------------------------------------
: 이렇게 하면 되는건지 확실치도 않고.....
: ?????? 란에 메일이미지 핸들을 잡아주면 이미지가 뜨긴 뜨는데..... 서브폼에서 버턴처리가 가능해지는지...이것도 궁금하고....

+ -

관련 글 리스트
45803 Bitmap을 메모리DC에서 불러들일때요..... 아야 1087 2006/07/24
45809     Re:Bitmap을 메모리DC에서 불러들일때요..... 박영목 2030 2006/07/24
45811         자답... 그리고 읽어봐 주셔서 감사합니다... 아야 1022 2006/07/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.