2003. 6. 19. 20:46
안녕하세요?
김태인입니다. (이름 말한다고 누가 아나 ㅡ_ㅡ)

김윤환(alf76)님의 요청으로 꼴에 강좌도 하게됐습니다 ㅡ_ㅡ

다이얼로그에 관련된 또는 Document-View 방식의 스킨 씌우는 방법이
참 많죠? 근대 저는 그거 예제들 보면 솔직히 뭔 소린지 모르겠더군요 ㅡ_ㅡ

또한 최근에 나오는 소규모 어플리케이션들(메신저, 간단한 온라인 게임등)을 보면
다 스킨이 씌워져있죠...

그것에 관한 강좌를 간단히 하겠습니다.

최근에 MS 에서 Media Player 7.0 SDK 를 발표하면서 그안에 스킨 기능이 첨가
되었는데...역시 COM 이라서 이쪽에 지식이 없는 사람은 접근하기도 힘들죠...(저도 지식이 없어서 ㅡ_ㅡ)

그래서 저는 주로 MFC에서 모든걸 처리를 하는데...
MFC 기반의 제가 사용하는 법(?)의 스킨을 알려드릴께여...

스킨 = 그림, 스킨에 있는 클릭 가능한(?) 그림 = 이미지 버튼 이라고 생각하면 좋습니다.

예제를 보면서 설명하겠습니다.

void CMyDialog::OnPaint()
{
    CPaintDC dc(this);
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    BITMAP bm;
    bitmap.LoadBitmap(IDB_BACKGROUND);
    bitmap.GetBitmap(&bm);
    CBitmap* pOld = dc.SelectObject(&bitmap);
    dc.BitBlt(0, 0, bm.bmWidth, bm.Height, &MemDC, 0, 0, SRCCOPY);
    dc.SelectObject(pOld);
    MemDC.DeleteDC();
}

스킨을 씌우고자 하는 다이얼로그의 OnPaint 이벤트 안에 위의 코드를 추가합니다.
저기서 IDB_BACKGROUND 는 이미지 파일 리소스인데...백그라운드로 쓸이미지를
리소스에 추가하면 됩니다.

위의 소스는 보시면 알겠지만 단순히 그림을 다이얼로그에 출력을 합니다.
그리고 그 그림에 쓸 이미지 버튼들을 만들어야 하는데...
CBitmapButton 이라는 클래스로 만들면 됩니다.

다이얼로그 헤더에 사용할 버튼을 선언합니다.

public:
    CBitmapButton click;

void CMyDialog::OnInitDialog()
{
    click.Create(NULL, BS_OWNERDRAW | WS_VISIBLE | WS_CHILD, CRect(114, 320, 180, 360), this,
2001);
    click.LoadBitmaps(IDB_BITBUTTON);
    click.SizeToContent();
}

위의 코드는 비트맵 버튼을 만드는데 IDB_BITBUTTON 이라는 이미지를 사용한다는 뜻입니다.
SizeToContent() 함수는 버튼을 그 이미지 크기만큼 자동으로 조정해줍니다.
그리고 버튼 Create 시에 BS_OWNERDRAW 속성이 있어야 비트맵 버튼으로 생성이 됩니다.
그 버튼에 ON_BN_CLICKED 이벤트만 추가해 주면 되겠죠?
그럼 클릭이 생기죠....

별거 아니죠?

이게 전부입니다.

정리를 하자면...
OnPaint() 에서 그 백그라운드에 쓸 이미지를 불러서 걍 뿌려줍니다.
그리고 OnInitDialog 에서는 비트맵 버튼으로 사용할 버튼을 쭉 만들어서 로딩하면 되고
그 버튼에 대한 이벤트만 추가한 후 처리를 하면 됩니다.
아주아주 간단하죠?
더 간단한 방법이 있을지 모르겠지만 ㅡ_ㅡ
위의 방법이 제가 주로 사용하는 다이얼로그에서의 스킨 방법입니다.


냠...별거 아니었나여 ㅡ_ㅡ
그래도 DevChip 좀 눌러줘여 ^^;
그럼 즐푸하세여~