std::vector 와 std::string 은 둘다 가변적이기 때문에 배열의 동적 할당없이 ( 물론 내부적으론 동적할당이 이루어 지지만 )
메모장같은 가로 + 세로를 나타내기에 적합함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC; static std::vector<std::string> vecstr; switch (uMsg) { case WM_CREATE: { vecstr.push_back(std::string()); break; } case WM_PAINT: { hDC = BeginPaint(hWnd, &ps); int j = 0; for (auto i = vecstr.begin(); i != vecstr.end(); ++i, ++j) TextOut(hDC, 0, j * 16, i->c_str(), i->size()); EndPaint(hWnd, &ps); break; } case WM_KEYDOWN: { switch (wParam) { case VK_RETURN: vecstr.push_back(std::string()); //move semantics break; case VK_BACK: if (vecstr.back().size() == 0) // 현재 작성 중인 줄의 글자가 하나도 없을 때, 지우기를 시도하면 이 전 줄로 넘어감 그때 std::string 을 하나 제거 함 vecstr.pop_back(); else vecstr.back().pop_back(); // 현재 작성 중인 줄에 글자가 하나라도 ㅡ면 이std::string 내의 맨 뒷글자를 지워줌 break; } InvalidateRect(hWnd, NULL, true); break; } case WM_CHAR: if (wParam != VK_BACK && wParam != VK_RETURN) // 이부분은 KEYDOWN 에서 처리해주어도 됨, 대소문자를 구분하기 위해 작성함 vecstr.back().push_back(wParam); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } | cs |
vector 는 내부적으로 T&& 생성자를 받을 수 있으므로, 임시 객체로 push_back 해주었음
만약 한글도 작성하고싶다면 std::basic_string 이 wchar 형으로 만들어져야 할것임