2016-07-21 10 views
0

나는 내 자신의 시각 소설 게임 엔진을위한 프로토 타입을 만들고 있습니다.클릭하면 어떻게 텍스트를 제거 할 수 있습니까?

while (i < 5) 
{ 
    switch (iMessage) 
    { 
    case WM_LBUTTONDOWN: 
    { 
     //InvalidateRect(hWnd, NULL, TRUE); 
     HDC hdc; 
     hdc = GetDC(hWnd); 
     _wsetlocale(LC_ALL, L"Korean"); 
     ReadScn(buf); 
     //MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, char, strlen(buf), buf3, 256); 
     CharToWChar(buf, buf2); 
     TextOut(hdc, 320, 300, buf2, lstrlen(buf2)); //읽어들여서 출력함. 
     //TCHAR*str = TEXT("beautiful korea"); 
     //TextOut(hdc, 320, 240, str, lstrlen(str)); 
     ReleaseDC(hWnd, hdc); 
     i++; 
     return 0; 
    } 
} 

나는 5 행의 텍스트를 scn.txt에 작성했습니다. 그런 다음 프로그램은 텍스트를 창에 인쇄하지만 텍스트 행은 겹칩니다.

새 텍스트 줄을 클릭하고 인쇄 한 후 이전 텍스트를 제거하려면 어떻게합니까?

+0

사용'와 ExtTextOut'을'ETO_OPAQUE' 하나의 방법입니다. –

+0

'switch()'블록 안에'while' 블록을 넣을 수는 없지만'case' 블록의 바깥쪽에는'while' 블록을 넣을 수 없습니다. 'while' 블록이'case' 블록 안에 있어야합니까? 아니면'switch()'블록을'while' 블록 안에 넣을까요? 코드 서식을 정리하십시오. –

+0

/레미 감사합니다. 나는 그것을 고쳤다. – 8berry

답변

3

올바른 방법 처리 방법은 WM_LBUTTONDOWN 메시지 처리기 내부에서 창에 아무 것도 그리지 않는 것입니다. 그 논리는 대신 WM_PAINT 메시지 처리기에 속합니다. 처리기에서 현재 텍스트 줄을 변수에 저장 한 다음 InvalidateRect() 창에 다시 그리기를 트리거합니다. WM_PAINT 핸들러는 창을 그릴 필요가있을 때마다 현재 라인을 그릴 수 있습니다 (버튼 클릭 사이에서 두 번 이상 발생할 수 있음).

이 시도 :

case WM_LBUTTONDOWN: 
{ 
    _wsetlocale(LC_ALL, L"Korean"); 
    ReadScn(buf); //read text from scn.txt and keep it in buf line by line. 
    CharToWChar(buf, buf2); //convert char into wChar. 
    InvalidateRect(hwnd, NULL, TRUE); //trigger a repaint 
    return 0; 
} 

case WM_PAINT: 
{ 
    PAINTSTRUCT ps; 
    HDC hdc = BeginPaint(hwnd, &ps); 
    TextOut(hdc, 320, 300, buf2, lstrlen(buf2)); 
    EndPaint(hwnd, &ps); 
    return 0; 
} 
+0

오 고마워요. 그것은 완벽하게 작동합니다. BTW,이 프로그램은'while '없이 한 줄씩 한 줄씩 텍스트를 인쇄합니다. 어떻게 그 일을 할 수 있니? – 8berry

+0

동시에 5 줄을 표시하려면 'WM_LBUTTONDOWN'이 5 줄을 별도의 변수 또는 배열에로드 한 다음'WM_PAINT'를 각 줄마다 다른 좌표로 5 번 'TextOut'을 호출하게합니다. –

관련 문제