我正在制作我自己的视觉小说游戏引擎的原型。
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行文字。然后程序将文本打印到窗口,但文本行重叠。
如何在点击并打印新文本行后删除以前的文本?
答案 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;
}