본문 바로가기
개발/C++,MFC

[MFC, C++] MFC 배경 이미지 관련

by 언제나초심. 2012. 12. 7.
반응형

아래 방법들은 다이얼로그의 OnPaint 에서 쓰는 방법이다. 

CDialog 를 상속하는 다이얼로그 클래스에서 써봤던 방법을 적어둔 것이고,


CDialogEx 라는 게 있는데, 이걸 상속했다면 구문은 한줄로 되는 것 같다.


0. CDialogEx에서 상속받은 친구(?) 일 때에는


SetBackgroundImage(IDB_BG);//백그라운드 이미지 호출


이 밑으로는 CDialog 를 상속받은 친구들에서 사용해본 방법이다. 


1. 첫번째 시도 했던 방법



    CPaintDC dc(this);
    CBitmap bmp;
    CRect Rect;
    CPen NewPen;
    CPen *OldPen;

    //배경 그리는 부분
    bmp.LoadBitmap(IDB_BG);//배경이미지 지정.
    NewBrush.CreatePatternBrush(&bmp);//브러시.

    GetClientRect(&Rect);
    dc.FillRect(Rect, &NewBrush);

    dc.SelectObject(OldPen);

>>큰 문제는 없었는데, 원래는 작은 bg 이미지로 패턴 브러시 그리는 방식이었다. 그냥 통짜 이미지로 바꿔도 이상 없이 됐다. 

  그러나 아무래도 찜찜하기 때문에, 정상적인(?) 방법을 찾아보기로 했다.


2. 2번째 시도 했던 방법



    CPaintDC dc(this);
    //==========================================
    //배경이미지 설정
    UINT tBG_IMAGE_ID = IDB_BG;//사용할 배경이미지 ID 지정
    CRect tRect;
    GetClientRect(&tRect);
    //------------------------------------------
    //배경이미지 그리기
    CBitmap tBitmap, *pOldBitmap;
    CDC tMemdc;
	
    tMemdc.CreateCompatibleDC(&dc);
    tBitmap.LoadBitmap(tBG_IMAGE_ID);
    pOldBitmap = tMemdc.SelectObject(&tBitmap);
    dc.BitBlt(0,0,tRect.Width(),tRect.Height(),&tMemdc,0,0,SRCCOPY);
    tMemdc.SelectObject(pOldBitmap);
    DeleteObject(tBitmap);
    DeleteObject(tMemdc);
    DeleteDC(dc);
    //==========================================

>> 구글링 중에 나왔던 방식을, 좀 쓰기 편하게 바꿔보았다. 어차피, 리소스 ID 만 바꾸고, 자주 쓰게 될 구문이기 때문에, 

 수정하기 쉽게 해보았다. 그러나, 뭔가 해제 쪽에서 문제가 있는 듯, 화면이 잘 안 지워지는 문제 발생.


3. 3번째 시도 했던 방법



    CPaintDC dc(this);
    //==========================================
    //배경이미지 설정
    UINT tBG_IMAGE_ID = IDB_BG;//사용할 배경이미지 ID 지정
    CRect tRect;
    GetClientRect(&tRect);
    //------------------------------------------
    //배경이미지 그리기. 사용될 선언
    CBitmap tBitmap, *pOldBitmap;
    CDC tMemdc; //메모리 DC 생성
    //메인 DC 와 호환 가능한 메모리 DC 생성
    tMemdc.CreateCompatibleDC(&dc); 
    //리소스 가져오기.
    tBitmap.LoadBitmap(tBG_IMAGE_ID);
    pOldBitmap = tMemdc.SelectObject(&tBitmap);
    //이미지 뿌리기. bitblt 고속 복사
    dc.BitBlt(0,0,tRect.Width(),tRect.Height(),&tMemdc,0,0,SRCCOPY);

    //메모리 해제
    tMemdc.SelectObject(pOldBitmap);
    tBitmap.DeleteObject();
    tMemdc.DeleteDC();
    //==========================================


>> 일단은, 크게 바뀐 것이 없고, 메모리 해제 하는 부분만 바꿔보았다. 

 MFC 는 구문을 다양하게 짤 수 있어서, 좋은건지 나쁜건지 모르겠다. ㅜㅜ

반응형