본문으로 바로가기

WINAPI) std::vector 와 std::string 을 사용한 간단한 메모장

category C++/WinApi 2019. 3. 24. 14:29

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, NULLtrue);
        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 형으로 만들어져야 할것임