2016-07-21 93 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'塊內不能有'case'塊。 'while'塊應該在'case'塊內嗎?或''while'塊內的'switch()'塊?請清理代碼格式。 –

+0

/雷米謝謝。我修好了它。 – 8berry

回答

3

正確處理這種情況的方法是根本不在窗口內從WM_LBUTTONDOWN消息處理程序中繪製任何東西。相反,該邏輯屬於WM_PAINT消息處理程序。使WM_LBUTTONDOWN處理程序將當前文本行保存到變量,然後用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

哦,謝謝。它完美的作品。順便說一句,該程序打印5行文本行,沒有'while'。那該怎麼辦? – 8berry

+0

如果你想同時顯示5行,使用'WM_LBUTTONDOWN'將5行加載到單獨的變量或數組中,然後讓'WM_PAINT'對每行調用5次不同座標的'TextOut'。 –