지난 포스트에 소스에 이이서 GDI그래픽API를 이용해서 당구공이 움직이는 애니메이션을 완성해 봅니다.
결과화면(아래)
마우스 우측메뉴에 대해서 메뉴삽입기능으로 ID_POPUP_EDIT 메뉴를 추가하는 부분(아래)
자동생성된 부분을 제외하고 추가한 코드는 아래와 같다.
.h 정의파일 BallView.h
.cpp 구현파일 BallView.cpp
// CBallView 메시지 처리기
int CBallView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 여기에 특수화된 작성 코드를 추가합니다.
SetTimer(1, 20, NULL);//0.02초마다 onTimer()호출
return 0;
}
void CBallView::OnDestroy()
{
CView::OnDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
KillTimer(1);//타이머 끈다.
}
void CBallView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
CRect r;//클라이언트 영역 크기
GetClientRect(&r);
CBrush brush, *pOldB;
brush.CreateSolidBrush(RGB(255, 255, 255));
dc.SelectStockObject(WHITE_PEN);//이전 공을 지우기 위해 흰색 선택
//pOldB = dc.SelectObject(&brush);//신규브러시 적용하기 전 기존브러시 저장
dc.Ellipse(nX - RAD, nY - RAD, nX + RAD, nY + RAD);//원을 그린다.
nX += nMx;
nY += nMy;
//볼의 방향전환
if (nY + RAD >= r.bottom) nMy = -STEP;
if (nX + RAD >= r.right) nMx = -STEP;
if (nY - RAD <= r.top) nMy = STEP;
if (nX - RAD <= r.left) nMx = STEP;
CBrush redB;
redB.CreateSolidBrush(RGB(255, 0, 0));
pOldB = dc.SelectObject(&redB);
dc.SelectStockObject(BLACK_PEN);
dc.Ellipse(nX - RAD, nY - RAD, nX + RAD, nY + RAD);
CView::OnTimer(nIDEvent);
}
void CBallView::OnStart()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
SetTimer(1, 10, NULL);
}
void CBallView::OnStop()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
KillTimer(1);
}
void CBallView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CMenu menu, *pSub;
menu.LoadMenuW(IDR_POPUP_EDIT);
pSub = menu.GetSubMenu(1);
ClientToScreen(&point);
pSub->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
CView::OnRButtonDown(nFlags, point);
}
빌드힌 실행파일:
VC++ 소켓통신프로그램_클라이언트 (0) | 2018.03.16 |
---|---|
VC++ 소켓통신_서버프로그램 (0) | 2018.03.15 |
VC++ GDI프로젝트_1 (0) | 2018.03.11 |
VC++ 학사관리 실습(대화상자이용) (0) | 2018.03.09 |
VC++ 상품결제폼_SDI실습3 (0) | 2018.03.08 |
댓글 영역