2016-07-21 8 views
0

Ich mache den Prototyp für meine eigene Visual Novel Game Engine.Wie kann ich Text nach dem Klicken entfernen?

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; 
    } 
} 

Ich schrieb 5 Zeilen Text scn.txt. Dann druckt das Programm die Texte in ein Fenster, aber die Textzeilen überlappen sich.

Wie kann ich den vorherigen Text nach dem Klicken entfernen und neue Textzeile drucken?

+0

Verwenden 'ExtTextOut' mit' ETO_OPAQUE' ist eine Möglichkeit. –

+0

Sie können keinen 'while' Block innerhalb eines' switch() 'Blocks haben, aber außerhalb von' case' Blöcken, und Sie können keinen 'case' Block innerhalb eines' while' Blocks haben. Soll der 'while' Block innerhalb des 'case' Blocks liegen? Oder der 'switch()' Block innerhalb des 'while' Blocks? Bitte bereinigen Sie die Codeformatierung. –

+0

/Remy Danke. Ich habe es repariert. – 8berry

Antwort

3

Die richtige Weg, um dies zu behandeln ist, nichts auf dem Fenster von innerhalb der WM_LBUTTONDOWN Nachricht Handler überhaupt zeichnen. Diese Logik gehört stattdessen in den Nachrichtenhandler WM_PAINT. Lassen Sie den WM_LBUTTONDOWN Handler die aktuelle Textzeile in einer Variablen speichern und dann InvalidateRect() das Fenster, um ein Repaint auszulösen. Der Handler WM_PAINT kann dann die aktuelle Zeile zeichnen, wann auch immer das Fenster gemalt werden muss (was mehr als einmal zwischen den Tastenklicks passieren kann).

Try this:

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

Oh Danke. Es funktioniert perfekt. BTW, das Programm druckt die 5 Textzeilen Zeile für Zeile ohne 'while'. Wie kann das funktionieren? – 8berry

+0

Wenn Sie 5 Zeilen gleichzeitig anzeigen möchten, laden Sie 'WM_LBUTTONDOWN' die 5 Zeilen auf separate Variablen oder in ein Array und rufen Sie' WM_PAINT' 5 Mal mit verschiedenen Koordinaten für jede Zeile auf. –

Verwandte Themen