D-H,appy

관리자 글쓰기
블로그 »
블로그 »

1. 다이얼로그 헤더에 비트맵 변수 추가

CBitmap m_bmpDlg;

2. 클래스 위자드로  함수 추가
void CngssDlg::LoadSkin()
{
      //추가한 비트맵 리소스를 비트맵 변수에 연결
      m_bmpDlg.LoadBitmap( IDB_BITMAP_BACKGROUND );
      BITMAP bmp;
      m_bmpDlg.GetBitmap( &bmp );

      //비트맵 크기대로 Dialog사이즈 변경 및 다이얼로그 위치를 중앙으로
      SetWindowPos( NULL, 0, 0, bmp.bmWidth, bmp.bmHeight, SWP_NOZORDER );
      CenterWindow();
}

3. 클래스에서 메시지 함수 OnEraseBkgnd추가

CRect rc;
GetClientRect(&rc);

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);

CBitmap* pbmpOld = MemDC.SelectObject( &m_bmpDlg );
pDC->BitBlt(0, 0, rc.right, rc.bottom, &MemDC, 0, 0, SRCCOPY);

MemDC.SelectObject( pbmpOld );
ReleaseDC(pDC);
return TRUE;

4. OnInitDialog함수에서 LoadSkin()함수 호출

LoadSkin();

5. 테스트

2009/12/18 16:23 2009/12/18 16:23

(go to top)

블로그 »

MFC 비트맵에 투명 배경을 사용해본다

보통 picture control을 static 필드로 비트맵을 쓰는데 (!?!?)

투명 배경 사용을 위해 CStatic를 상속하는 클래스를 만들어본다

1. MFC클래스 생성-> 이름 넣고-> 생성 한다 (이름 예 : CCTransparentStatic )
2. 클래스 메시지 함수인 OnPaint()를 생성
3.  다음을 입력

void CMyStatic::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: Add your message handler code here

 HBITMAP old,bmp  = GetBitmap();
 BITMAP bminfo;
 CDC memDC;

 memDC.CreateCompatibleDC(&dc);
 old = (HBITMAP)::SelectObject(memDC.m_hDC,bmp);

 ::GetObject(bmp,sizeof(BITMAP),&bminfo);

 ::TransparentBlt(dc.m_hDC,0,0,bminfo.bmWidth,bminfo.bmHeight,memDC.m_hDC,0,0,bminfo.bmWidth,bminfo.bmHeight,RGB(255,255,255));

 ::SelectObject(memDC.m_hDC,old);
 memDC.DeleteDC();
 // Do not call CStatic::OnPaint() for painting messages
}

* 255.255.255로 함수 변수를 넘겼기 때문에 이미지 중 색이 하얀색(255.255.255)인 것은 투명처리된다

4. 이제 원래의 다이얼로그로 돌아가서 픽쳐컨트롤을 올리고 비트맵을 삽입한다
5. 컨트롤에 멤버변수를 만든다. (안만들어지면 컨트롤 ID를 기본인 IDB_STATIC말고 다른걸로 쓰면 된다)
6. 다이얼로그 헤더파일에 방금 만든 멤버 변수가 CStatic XXX 형태로 되어있는 것을
   방금 만든 클래스 타입으로 바꾼다. (ex CTransparentStatic XXX)

2009/12/14 16:09 2009/12/14 16:09

(go to top)

블로그 »

비트맵 다룰줄몰라서 엄청 헤맸는데
엄청 쉬운 법 발견...ㅋㅋㅋ

일단 배경 사각형을 그리려면 onpaint()를 오버라이딩해서
void sdf::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.

 CPen pen;
 pen.CreatePen(PS_SOLID ,1,RGB(0,0,0));
 dc.SelectObject(pen);
 dc.MoveTo(CPoint(50,50));
 dc.LineTo(CPoint(250,50));
 dc.MoveTo(CPoint(250,50));
 dc.LineTo(CPoint(250,250));
 dc.MoveTo(CPoint(250,250));
 dc.LineTo(CPoint(50,250));
 dc.MoveTo(CPoint(50,250));
 dc.LineTo(CPoint(50,50));
}
하면 사각형이 그려진다~

마우스를 클릭해서 움직이면 그림이 그려지게 하려면??
뭐 로직은 사람마다 다르겠지만
왼쪽 버튼 누를때 flag, 왼쪽버튼 뗄때 flag설정하여
mousemove를 오버라이딩해버리면 된다

void sdf::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 isdraw = true;
 m_StartPoint = point;
 // TODO: 여기에 메시지 처리기 코드를 추가합니다. //todo
 CDialog::OnLButtonDown(nFlags, point);
}

void sdf::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 //m_EndPoint = point;
 isdraw = false;
 CDialog::OnLButtonUp(nFlags, point);
}

void sdf::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 if(isdraw)
 {
 
  m_EndPoint = point;
  CClientDC dc(this);
  CPen pen;
  pen.CreatePen(PS_SOLID ,1,RGB(255,0,0));  //펜 색을 빨간색으로
  dc.SelectObject(pen);
  dc.MoveTo(m_StartPoint);
  dc.LineTo(m_EndPoint);
  m_StartPoint = m_EndPoint;
 //그리기

 }
 CDialog::OnMouseMove(nFlags, point);
}

사용자 삽입 이미지

2009/12/02 16:12 2009/12/02 16:12

(go to top)