사용한 개발 툴 : Microsoft Visual Studio 2005

2009년 4월 7일

거의 독학 수준이었던 MFC ㅍ0ㅍ

1.1. 움직이는 로직에 대한 설명.

1.1.1. 툴바의 곡선 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_nType가 곡선 ID_DrawCurve 이므로 if문 실행 한다.CreatePen()함수의 pen의 style을 설정하는데 PS_SOLID는 실선을 의미하고, 1은 펜의 굵기, m_colLine 은 선의 색깔을 지정한다. 선그리기를 할때에는 MoveTo() 함수와 LineTo() 함수가 필요하다.

1.1.2. 툴바의 곡선 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_nType가 곡선 ID_DrawLine 이므로 if문 실행 한다.CreatePen()함수의 pen의 style을 설정하는데 PS_SOLID는 실선을 의미하고, 1은 펜의 굵기, m_colLineXor 은 선의 색깔을 지정한다. 선그리기를 할때에는 MoveTo() 함수와 LineTo() 함수가 필요하다.

1.1.3. 툴바의 사각형 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawRectangle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 사각형을 그려준다.

1.1.4. 툴바의 사각형 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawRectangle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 사각형을 그려준다. Rectangle(int x1, int y1, int x2, int y2)

1.1.5. 툴바의 원 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawCircle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 원을 그려준다. Ellipse()

1.1.6. WM_MOUSEMOVE에서 사각형을 그려주며, WM_LBUTTONUP에서 사각형의 내부 색을 채워준다.

1.1.7. CColorDialog를 이용해 선택한 색은 GetColor()를 이용해 얻을 수 있다.

1.1.8. m_LineColorXor은 직전 도형의 모양 뿐만 아니라 m_LineColor의 Xor 연산 결과가 저장 되어 있어야 한다.

1.1.9. 메뉴바에 있는 색상에서 예를 들어 선색-> 빨강을 누르면 OnColorLineRed() 함수가 실행되어 선색이 빨강이 된다. 도형->빨강을 누르면 OnFillRed() 함수가 실행되어 도형의 안이 채워진다.


// CPainter1View 메시지 처리기
void CPainter1View::OnChangeTool(UINT nID) {

m_nType = (int)GetCurrentMessage()->wParam; //툴바의 항목 리턴

void CPainter1View::OnUpdateChageTool(CCmdUI* pCmdUI){

pCmdUI->SetCheck(m_nType == (int)pCmdUI->m_nID);

}

void CPainter1View::OnCPen() {

CColorDialog dig;
if(dig.DoModal()==IDOK){
m_colLine = dig.GetColor();
m_colLineXor = (RGB(GetRValue(m_colLine)^255, GetGValue(m_colLine)^255, GetBValue(m_colLine)^255));
}

}

void CPainter1View::OnUpdatePaintred(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
m_colLine = (RGB(255,0,0));
m_colLineXor = (RGB(225, 0, 0));

}

void CPainter1View::OnPainter(){

CColorDialog dig;
if(dig.DoModal()==IDOK)
m_colFill = dig.GetColor();

}

void CPainter1View::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default
m_pntOld = point;
m_pntCur = point;
SetCapture();
CView::OnLButtonDown(nFlags, point);

}

void CPainter1View::OnLButtonUp(UINT nFlags, CPoint point){

// TODO: Add your message handler code here and/or call default
ReleaseCapture();
CClientDC dc(this);
CBrush brush, *pOldBrush;
if(m_nType == ID_DrawRectangle){

brush.CreateSolidBrush(m_colFill);
pOldBrush = (CBrush *)dc.SelectObject(brush);
dc.Rectangle(m_pntOld.x, m_pntOld.y, point.x, point.y);

} else if(m_nType == ID_DrawCircle) {
brush.CreateSolidBrush(m_colFill);
pOldBrush = (CBrush *)dc.SelectObject(brush);
dc.Ellipse(m_pntOld.x, m_pntOld.y, point.x, point.y);

CView::OnLButtonUp(nFlags, point);

}

void CPainter1View::OnMouseMove(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default
//왼쪽 버튼 누른 상태
if(nFlags & MK_LBUTTON) {
CClientDC dc(this);
CPen pen, *pOldPen;
CBrush brush, *pOldBrush;

if(m_nType == ID_DrawCurve){

pen.CreatePen(PS_SOLID, 1, m_colLine);
pOldPen = (CPen *)dc.SelectObject(&pen);
dc.MoveTo(m_pntOld.x, m_pntOld.y);
dc.LineTo(point.x,point.y);
m_pntOld = point;
dc.SelectObject(pOldPen);

  } else if(m_nType==ID_DrawLine){

pen.CreatePen(PS_SOLID, 1, m_colLineXor); 
dc.SelectObject(GetStockObject(NULL_BRUSH));
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.MoveTo(m_pntOld.x, m_pntOld.y);
d
c.LineTo(m_pntCur.x, m_pntCur.y); 
dc.MoveTo(m_pntOld.x, m_pntOld.y);
d
c.LineTo(point.x, point.y); 
dc.SelectObject(pOldPen);

else if(m_nType == ID_DrawRectangle) {

pen.CreatePen(PS_SOLID, 1, m_colLineXor); 
dc.SelectObject(GetStockObject(NULL_BRUSH)); 
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.Rectangle(m_pntOld.x, m_pntOld.y, point.x, point.y); 
dc.SelectObject(pOldPen);

else if(m_nType == ID_DrawCircle) {

//펜생성
pen.CreatePen(PS_SOLID,1,m_colLineXor);
dc.SelectObject(GetStockObject(NULL_BRUSH)); 
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.Ellipse(m_pntOld.x, m_pntOld.y, m_pntCur.x, m_pntCur.y);
dc.Ellipse(m_pntOld.x, m_pntOld.y, point.x, point.y); 
dc.SelectObject(pOldPen);

}

m_pntCur = point; 

  }

CView::OnMouseMove(nFlags, point);

}

void CPainter1View::OnInitialUpdate(){

CView::OnInitialUpdate();

}

void CPainter1View::OnPaint(){

CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages

}

 

 

void CPainter1View::OnUpdatePaintgreen(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_colLine==RGB(0,255,0));

}

void CPainter1View::OnUpdatePaintblue(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_colLine == RGB(0,0,255));

}


 

 


mfc.zip

Posted by 검지발가락♡