'MFC Control'에 해당되는 글 9건

  1. 2010.01.17 ProgressCtrl
  2. 2010.01.17 Ower-draw
  3. 2010.01.17 서브클래싱
2010.01.17 21:04

//프로그레스컨트롤을 상속받은 CTextProgressCtrl
void CTextProgressCtrl::OnPaint()
{
	CPaintDC dc(this);

	CString strTmp = _T("");
	strTmp.Format(_T("%d%%"), m_nData);

	//윈도우를 둘로 나눌 영역 셋팅
	CRect LeftRect, RightRect, ClientRect;
	GetClientRect(ClientRect);
	LeftRect = ClientRect;
	RightRect = ClientRect;

	//1%에 해당하는 윈도우 크기를 계산
	//각각의 영역을 다른색으로 채움
	LeftRect.right = (ClientRect.right * m_nData) / 100;
	RightRect.left = (ClientRect.right * m_nData) / 100;
	dc.FillSolidRect(LeftRect, RGB(0, 0, 128));
	dc.FillSolidRect(RightRect, RGB(255, 255, 255));

	//왼쪽과 오른쪽을 두 영역으로 구분
	CRgn LeftRgn, RightRgn;
	LeftRgn.CreateRectRgnIndirect(LeftRect);
	RightRgn.CreateRectRgnIndirect(RightRect);
	
	//왼쪽영역에 비율 표시 텍스트를 중앙 정렬하여 출력한다.
	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(RGB(255, 255, 255));
	dc.SelectClipRgn(&LeftRgn);
	dc.DrawText(strTmp, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	//오른쪽 영역에 비율 표시 텍스트를 중앙 정렬하여 출력한다.
	dc.SetTextColor(RGB(0, 0, 128));
	dc.SelectClipRgn(&RightRgn);
	dc.DrawText(strTmp, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

void CTextProgressCtrl::SetValue(int nPos)
{
	m_nData = nPos;
	RedrawWindow();
}

'MFC' 카테고리의 다른 글

도형그리기  (0) 2010.01.19
GDI. Pen, Brush  (0) 2010.01.19
ProgressCtrl  (0) 2010.01.17
Ower-draw  (0) 2010.01.17
서브클래싱  (0) 2010.01.17
타이머  (0) 2010.01.17
Posted by hyunny82
2010.01.17 20:59
//버튼컨트롤을 상속받은 CImageButton의 클래스를 생성.
//WM_MOUSEMOVE 처리
void CImageButton::OnMouseMove(UINT nFlags, CPoint point)
{
	if(!m_bTracking)
	{
		TRACKMOUSEEVENT tme;
		::ZeroMemory(&tme, sizeof(tme));

		tme.cbSize		= sizeof(tme);
		tme.hwndTrack	= m_hWnd;
		tme.dwFlags		= TME_LEAVE | TME_HOVER;
		tme.dwHoverTime	= 1;

		m_bTracking = ::_TrackMouseEvent(&tme);
	}
	CButton::OnMouseMove(nFlags, point);
}

//WM_MOUSEHOVER 처리
void CImageButton::OnMouseHover(UINT nFlags, CPoint point)
{
	m_bHover = TRUE;
	RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);

	CButton::OnMouseHover(nFlags, point);
}
//WM_MOUSELEAVE 처리
void CImageButton::OnMouseLeave()
{
	m_bHover	= FALSE;
	m_bTracking	= FALSE;
	RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);

	CButton::OnMouseLeave();
}
//버튼이미지 다시 그리기
void CImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);

	CBitmap Bmp;
	Bmp.LoadBitmap(IDB_Button_Image);
	CBitmap* pOldBitmap = MemDC.SelectObject(&Bmp);

	if(lpDrawItemStruct->itemState & ODS_SELECTED)
	{
		pDC->BitBlt(0, 0, 40, 40, &MemDC, 40, 0, SRCCOPY);
	}
	else
	{
		if(m_bHover)	pDC->BitBlt(0, 0, 40, 40, &MemDC, 80, 0, SRCCOPY);
		else			pDC->BitBlt(0, 0, 40, 40, &MemDC, 0, 0, SRCCOPY);
	}

	MemDC.SelectObject(pOldBitmap);
}

//배경 하얗게 그리기
BOOL CImageButtonDemoDlg::OnEraseBkgnd(CDC* pDC)
{
	CRect Rect;
	GetClientRect(&Rect);
	pDC->FillSolidRect(&Rect, RGB(255, 255, 255));
	return TRUE;
//	return CDialog::OnEraseBkgnd(pDC);
}

'MFC' 카테고리의 다른 글

GDI. Pen, Brush  (0) 2010.01.19
ProgressCtrl  (0) 2010.01.17
Ower-draw  (0) 2010.01.17
서브클래싱  (0) 2010.01.17
타이머  (0) 2010.01.17
사용자 정의 메시지  (0) 2010.01.17
Posted by hyunny82
2010.01.17 17:00

서브클래싱은 현재 프로시저를 다른 프로시저로 대체하는 기법
//컨트롤 변수와 서브클래스를 선언.
class CFileDlgDlg : public CDialog
{
// 생성입니다.
public:
	CFileDlgDlg(CWnd* pParent = NULL);	// 표준 생성자입니다.
	CSubClassTest m_wndTest;
	CListCtrl m_List;
        ...
};
//컬럼삽입후 현재 헤더컨트롤 포인터를 가져와서 서브클래싱.
BOOL CFileDlgDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
        ....
	m_List.InsertColumn(0,_T(" "),LVCFMT_LEFT,20);
	m_List.InsertColumn(1,_T("Name"),LVCFMT_LEFT,220);
	m_List.InsertColumn(2,_T("Test"),LVCFMT_LEFT,220);
	CHeaderCtrl* pHeaderCtrl=m_List.GetHeaderCtrl();
	m_wndTest.SubclassWindow(pHeaderCtrl->m_hWnd);
}
//서브클래스
class CSubClassTest : public CWnd
{
	DECLARE_DYNAMIC(CSubClassTest)
public:
	CSubClassTest();
	virtual ~CSubClassTest();
	bool m_bFlag;
        ....
};
//서브클래스 메시지 처리
//플래그값에 따른 색상변환
void CSubClassTest::OnPaint()
{
	CWnd::OnPaint();
	CClientDC dc(this);
	CRect Rect(3,3,16,16);
	if(m_bFlag)dc.FillSolidRect(&Rect,RGB(192,0,0));
	else	dc.FillSolidRect(&Rect,RGB(255,255,255));
	//CPaintDC dc(this); // device context for painting
	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	// 그리기 메시지에 대해서는 CWnd::OnPaint()을(를) 호출하지 마십시오.
}
//왼쪽버튼 눌려지면 특정좌표안에 있는지 확인후 토글
void CSubClassTest::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CWnd::OnLButtonDown(nFlags,point);
	CRect Rect(3,3,16,16);
	if(PtInRect(&Rect,point))
	{
		m_bFlag=!m_bFlag;
		RedrawWindow();
	}
	CWnd::OnLButtonDown(nFlags, point);
}
//서브클래싱 해제
void CSubClassTest::OnDestroy()
{
	UnsubclassWindow();
	CWnd::OnDestroy();	
	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}

'MFC' 카테고리의 다른 글

ProgressCtrl  (0) 2010.01.17
Ower-draw  (0) 2010.01.17
서브클래싱  (0) 2010.01.17
타이머  (0) 2010.01.17
사용자 정의 메시지  (0) 2010.01.17
CFile 클래스  (0) 2010.01.17
Posted by hyunny82
이전버튼 1 2 3 이전버튼

티스토리 툴바