로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!====== 편집: Sliding PuzzleView.cpp ====== [[파일:쉽게 배우는 CPP 클래스 뷰 선택.png|300픽셀]] 오른쪽 탭에서 Class View를 누르면 나오는 화면에서 Sliding Puzzle 항목을 열고, CSlidingPuzzleView 항목을 선택한다. [[파일:쉽게 배우는 CPP 속성에서 WM PAINT 메시지 처리 함수 추가.png|300픽셀]] Properties 창에 있는 아이콘들 중 오른쪽에서 3번째 아이콘을 클릭한 후 스크롤을 내려 WM_PAINT를 찾는다. WM_PAINT의 오른쪽 칸의 화살표가 있는 흰색 박스(빈칸 옆의 흰색 박스)를 누른다. 누르면 나오는 <nowiki><Add></nowiki> OnPaint를 누른다. 같은 방법으로, WM_KEYDOWN, WM_LBUTTONDOWN, WM_LBUTTONUP의 처리함수(OnKeyDown, OnLButtonDown, OnLButtonUp)을 추가한다. [[파일:쉽게 배우는 CPP Sliding PuzzleView cpp.png|300픽셀]] Solution Explorer에서 Source Files 항목을 열고 Sliding PuzzleView.cpp를 더블클릭해서 연다. #include "Sliding PuzzleView.h" 다음 줄에 추가한다. <syntaxhighlight lang=cpp> #include <chrono> using namespace std::chrono; </syntaxhighlight> Sliding Puzzle.cpp를 편집할 때처럼 텍스트를 직접 편집하는 부분 위의 콤보박스(이하 콤보박스)의 2, 3번째 항목을 CSlidingPuzzleView, CSlidingPuzzleView()으로 선택한 후 CSlidingPuzzleView::CSlidingPuzzleView() 안에 다음과 같이 입력한다. <syntaxhighlight lang=cpp> Gdiplus::Bitmap *pbitmap = Gdiplus::Bitmap::FromResource( AfxGetInstanceHandle(), (WCHAR*)MAKEINTRESOURCE(IDB_BITMAP1)); pimage = dynamic_cast<Gdiplus::Image*>(pbitmap); for (int i = 0; i < 4; ++i){ for (int j = 0; j < 4; ++j){ state[i][j] = i * 4 + j + 1; } } state[3][3] = 0; pmembitmap = ::new Gdiplus::Bitmap{ board.Width, board.Height }; Gdiplus::Graphics memgraphics(pmembitmap); memgraphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); Gdiplus::SolidBrush BlackBrush{ Gdiplus::Color(32, 0, 0, 0) }; memgraphics.FillRectangle(&BlackBrush, Gdiplus::Rect{ 0, 0, board.Width, board.Height }); const Gdiplus::REAL tmpW = static_cast<Gdiplus::REAL>(pimage->GetWidth()), tmpH = static_cast<Gdiplus::REAL>(pimage->GetHeight()); for (int i = 0; i < 4; ++i){ for (int j = 0; j < 4; ++j){ if (i * j == 9) continue; memgraphics.DrawImage(pimage, Gdiplus::RectF(static_cast<Gdiplus::REAL>(52) * i, static_cast<Gdiplus::REAL>(52) * j, static_cast<Gdiplus::REAL>(50), static_cast<Gdiplus::REAL>(50)), tmpW / board.Width * 52 * (state[i][j] / 4), tmpH / board.Height * 52 * (state[i][j] % 4), tmpW / board.Width * 50, tmpH / board.Height * 50, Gdiplus::UnitPixel); } } </syntaxhighlight> 콤보박스(이하 콤보박스)의 2, 3번째 항목을 CSlidingPuzzleView, OnPaint()으로 선택한 후 CPaintDC dc(this); 다음 줄에 입력한다. <syntaxhighlight lang=cpp> Gdiplus::Graphics graphics(dc.GetSafeHdc()); graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); graphics.DrawImage(pmembitmap, board.X, board.Y); </syntaxhighlight> 콤보박스(이하 콤보박스)의 2, 3번째 항목을 CSlidingPuzzleView, OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)으로 선택한 후 CView::OnKeyDown(nChar, nRepCnt, nFlags); 이전 줄에 입력한다. <syntaxhighlight lang=cpp> switch (nChar) { case VK_LEFT: if (!isMoving && loc0.x < 3) movePiece(CPoint{ loc0.x + 1, loc0.y }); break; case VK_RIGHT: if (!isMoving && loc0.x > 0) movePiece(CPoint{ loc0.x - 1, loc0.y }); break; case VK_UP: if (!isMoving && loc0.y < 3) movePiece(CPoint{ loc0.x, loc0.y + 1 }); break; case VK_DOWN: if (!isMoving && loc0.y > 0) movePiece(CPoint{ loc0.x, loc0.y - 1 }); break; } </syntaxhighlight> 콤보박스(이하 콤보박스)의 2, 3번째 항목을 CSlidingPuzzleView, OnLButtonDown(UINT nFlags, CPoint point)으로 선택한 후 CView::OnLButtonDown(nFlags, point); 이전 줄에 입력한다. <syntaxhighlight lang=cpp> isClicked = true; </syntaxhighlight> 콤보박스(이하 콤보박스)의 2, 3번째 항목을 CSlidingPuzzleView, OnLButtonUp(UINT nFlags, CPoint point)으로 선택한 후 CView::OnLButtonUp(nFlags, point); 이전 줄에 입력한다. <syntaxhighlight lang=cpp> if (isClicked && !isMoving){ auto locInclude = [](int value, int measure){ if ((value - measure) / 52 >= 0 && (value - measure) / 52 <= 3) return (value - measure) / 52; else return -1; }; auto abs = [](int value){ if (value < 0) return -value; return value; }; isClicked = false; CPoint loc{ locInclude(point.x, board.X), locInclude(point.y, board.Y) }; if (loc.x >= 0 && loc.y >= 0 && abs(loc.x - loc0.x) + abs(loc.y - loc0.y) == 1 && !isMoving) movePiece(loc); } </syntaxhighlight> 파일의 맨 끝 줄에서 개행하고 다음과 같이 입력한다. <syntaxhighlight lang=cpp> void CSlidingPuzzleView::movePiece(const CPoint& loc) { isMoving = true; Gdiplus::Graphics memgraphics(pmembitmap); memgraphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); Gdiplus::SolidBrush WhiteBrush{ Gdiplus::Color::White }; Gdiplus::SolidBrush BlackBrush{ Gdiplus::Color(32, 0, 0, 0) }; const Gdiplus::REAL tmpW = static_cast<Gdiplus::REAL>(pimage->GetWidth()), tmpH = static_cast<Gdiplus::REAL>(pimage->GetHeight()), tmp2_5 = static_cast<Gdiplus::REAL>(2.5); const int n = 13; int m = 4; Gdiplus::RectF moverect{ static_cast<Gdiplus::REAL>(52) * loc.x, static_cast<Gdiplus::REAL>(52) * loc.y, static_cast<Gdiplus::REAL>(50), static_cast<Gdiplus::REAL>(50) }; while (m != 0){ system_clock::time_point tp = system_clock::now(); while (duration_cast<milliseconds>(system_clock::now() - tp) <= static_cast<milliseconds>(60)); --m; memgraphics.FillRectangle(&WhiteBrush, Gdiplus::RectF{ moverect.X - (2 * (loc.x - loc0.x)) - tmp2_5, moverect.Y - (2 * (loc.y - loc0.y)) - tmp2_5, moverect.Width + (2 * (loc.x - loc0.x)) + tmp2_5, moverect.Height + (2 * (loc.y - loc0.y)) + tmp2_5 }); memgraphics.FillRectangle(&BlackBrush, Gdiplus::RectF{ moverect.X - (2 * (loc.x - loc0.x)) - tmp2_5, moverect.Y - (2 * (loc.y - loc0.y)) - tmp2_5, moverect.Width + (2 * (loc.x - loc0.x)) + tmp2_5, moverect.Height + (2 * (loc.y - loc0.y)) + tmp2_5 }); moverect.X -= (n * (loc.x - loc0.x)); moverect.Y -= (n * (loc.y - loc0.y)); memgraphics.DrawImage(pimage, moverect, tmpW / board.Width * 52 * (state[loc.x][loc.y] / 4), tmpH / board.Height * 52 * (state[loc.x][loc.y] % 4), tmpW / board.Width * 50, tmpH / board.Height * 50, Gdiplus::UnitPixel); RedrawWindow(); } state[loc0.x][loc0.y] ^= state[loc.x][loc.y]; state[loc.x][loc.y] ^= state[loc0.x][loc0.y]; state[loc0.x][loc0.y] ^= state[loc.x][loc.y]; loc0 = loc; isMoving = false; } </syntaxhighlight> 요약: 리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다. 취소 편집 도움말 (새 창에서 열림) | () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |} {{lang|}} · {{llang||}} · {{인용문|}} · {{인용문2|}} · {{유튜브|}} · {{다음팟|}} · {{니코|}} · {{토막글}} {{삭제|}} · {{특정판삭제|}}(이유를 적지 않을 경우 기각될 가능성이 높습니다. 반드시 이유를 적어주세요.) {{#expr:}} · {{#if:}} · {{#ifeq:}} · {{#iferror:}} · {{#ifexist:}} · {{#switch:}} · {{#time:}} · {{#timel:}} · {{#titleparts:}} __NOTOC__ · __FORCETOC__ · __TOC__ · {{PAGENAME}} · {{SITENAME}} · {{localurl:}} · {{fullurl:}} · {{ns:}} –(대시) ‘’(작은따옴표) “”(큰따옴표) ·(가운뎃점) …(말줄임표) ‽(물음느낌표) 〈〉(홑화살괄호) 《》(겹화살괄호) ± − × ÷ ≈ ≠ ∓ ≤ ≥ ∞ ¬ ¹ ² ³ ⁿ ¼ ½ ¾ § € £ ₩ ¥ ¢ † ‡ • ← → ↔ ‰ °C µ(마이크로) Å °(도) ′(분) ″(초) Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η Θ θ Ι ι Κ κ Λ λ Μ μ(뮤) Ν ν Ξ ξ Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ Φ φ Χ χ Ψ ψ Ω ω · Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ · Ϊ ϊ Ϋ ϋ · ΐ ΰ Æ æ Đ(D with stroke) đ Ð(eth) ð ı Ł ł Ø ø Œ œ ß Þ þ · Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź · À à È è Ì ì Ǹ ǹ Ò ò Ù ù · İ Ż ż ·  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û · Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ · ǘ ǜ ǚ ǖ · caron/háček: Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž · breve: Ă ă Ğ ğ Ŏ ŏ Ŭ ŭ · Ā ā Ē ē Ī ī Ō ō Ū ū · à ã Ñ ñ Õ õ · Å å Ů ů · Ą ą Ę ę · Ç ç Ş ş Ţ ţ · Ő ő Ű ű · Ș ș Ț ț