2016-07-21 63 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'。 –