2013-12-19 8 views
0

В настоящее время я рисую текст из текстового поля в моем окне. Я успешно получаю текст, который нужно рисовать, и он рисует текст. Все нормально.C++ redraw with DrawText

Вот проблема: когда я пишу что-то еще в своем поле ввода и снова рисую текст (с помощью нажатия кнопки), новый текст рисуется прямо поверх предыдущего текста, что и следовало ожидать.

Я новичок во всем этом, и я не могу найти способ очистить предыдущий текст до рисования нового текста.

Вот мой код:

void DrawMyText(HWND hwnd) { 

    int iTextLength = GetWindowTextLength(hDrawInput) + 1; 
    char cDrawText[1000] = ""; 
    HDC wdc = GetWindowDC(hwnd);  
    RECT canvas; 
    canvas.left = 168; 
    canvas.top = 108; 
    canvas.right = 500; 
    canvas.bottom = 500; 

    GetWindowText(hDrawInput, cDrawText, iTextLength); 

    SetTextColor(wdc, 0x00FF0066); 
    SetBkMode(wdc,TRANSPARENT); 
    DrawText(wdc, cDrawText, -1, &canvas, DT_LEFT); 

    DeleteDC(wdc); 
} 

Любые советы о том, как это сделать? Я с удовольствием предоставу любую дополнительную информацию, если потребуется. Заранее спасибо!

ответ

2

DrawText больше похожа на брызговик - он красит сверху, что уже есть. Я бы рекомендовал переключиться на SetWindowText. Разница заключается в том, что DrawText больше похож на вызов рендеринга canvas и не учитывает тип управления, к которому он обращается. SetWindowText - это явный «набор текста этого окна для этого конкретного значения» и специфичен для текстовых элементов управления. Более того, он заменит текущий текст новым текстовым значением.

Если вы абсолютно должны сделать это с помощью DrawText (т. Е. Вы предпочитаете подход к холсту, как указано выше), вам придется вручную очистить область текста с помощью чего-то вроде InvalidateRect() (используя RECT текстовой области) , Или, рисуя прямоугольник, равный размеру текстовой области и того же цвета, что и фон. Дайте мне знать, если этого недостаточно.

+0

спасибо. Я бы очень хотел использовать что-нибудь другое, но я абсолютно должен использовать DrawText, это университетское задание. Я должен рисовать с цветом фона, но я хотел бы оставить его в качестве последнего возможного варианта. Я попробовал 'InvalidateRect (hwnd, & canvas, TRUE);' прямо перед тем, как я рисую снова, но, похоже, ничего не делает. Я делаю это неправильно? –

+0

Хм. Вместо InvalidateRect() попробуйте FillRect (wdc, & canvas, brush), где кисть - это простая кисть, которую вы создали, чтобы очистить фон (возможно, только белый?). InvalidateRect() должен принудительно перерисовать, но в зависимости от того, что вы делаете, это сложно. FillRect может дать вам лучшие результаты. Очевидно, не забудьте сделать FillRect перед вызовом DrawText. – MikeD

+0

Мне нравится спрей может аналогию. 'InvalidateRect', как правило, правильная вещь, но для этого требуется обработать полученное сообщение с краской и нарисовать текст после того, как фон был перерисован. –

1

Если какие-то другие окна покрывают, а затем раскрывают место, где вы нарисовали текст, он исчезнет! Иллюзия, что окна могут сидеть друг над другом, уничтожается! Windows предоставляет схему для решения этой проблемы, но вы не сотрудничаете со схемой.

Покрасьте текст только в ответ на сообщение WM_PAINT, используя вызовы API BeginPaint и EndPaint. На кнопке нажмите только вызов InvalidateRect, который просит Windows отправить вам WM_PAINT. BeginPaint стирает ваше окно перед краской. Поэтому, поместив свой код рисования в нужное место - обработчик WM_PAINT, вы решаете две проблемы: он удаляет любой старый текст и регенерирует всякий раз, когда открывается ваше окно.