如何在点击后删除文字?

时间:2016-07-21 03:04:34

标签: c winapi

我正在制作我自己的视觉小说游戏引擎的原型。

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

我向scn.txt写了5行文字。然后程序将文本打印到窗口,但文本行重叠。

如何在点击并打印新文本行后删除以前的文本?

1 个答案:

答案 0 :(得分: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;
}