사용한 개발 툴 : 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);
dc.LineTo(m_pntCur.x, m_pntCur.y);
dc.MoveTo(m_pntOld.x, m_pntOld.y);
dc.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));
}
'공대생의 일기 > 2009年 1학기' 카테고리의 다른 글
[리눅스시스템프로그래밍]Shell의 이해 (0) | 2010.12.21 |
---|---|
[리눅스시스템프로그래밍]레코드의 이해 (0) | 2010.12.21 |
[인터넷프로토콜]RIP, OSPF 테이블 갱신 (0) | 2010.12.21 |
[데이터베이스프로그래밍]인터넷뱅킹 서비스 (0) | 2010.12.21 |