2013-12-19 73 views
0

當前我從窗口中的文本框中繪製文本。我成功地獲得了我需要繪製的文本並繪製​​了文本。沒關係。使用DrawText重繪C++

下面是問題:當我在輸入框中寫入其他內容並再次繪製文本(通過按鈕按下)時,新文本將在前面的文本頂部繪製出來,以期待。

我是新來的所有這一切,我無法找到一種方式來清除之前的文本,然後繪製新的文本。

這裏是我的代碼:

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更像是一個畫布渲染調用,並沒有考慮太多關於它所控制的控件的類型。 SetWindowText是一個明確的「將此窗口的文本設置爲該特定值」,並且特定於基於文本的控件。更重要的是,它將用新的文本值替換當前文本。

如果您絕對必須使用DrawText(即您更喜歡上面的畫布方法),那麼您必須手動使用InvalidateRect()(使用文本區域的RECT)來清除文本區域, 。或者,通過繪製與文本區域大小相同且與背景顏色相同的矩形。讓我知道如果這不夠詳細。

+0

非常感謝。我絕對想使用其他任何東西,但我絕對必須使用DrawText,這是一項大學任務。我想着背景顏色,但我想把它留作最後的可能選項。我嘗試了'InvalidateRect(hwnd,&canvas,TRUE);'在我再次繪製之前,它似乎什麼都不做。我做錯了嗎? –

+0

嗯。而不是InvalidateRect(),請嘗試FillRect(wdc,&canvas,brush),其中brush是您創建的簡單畫筆,用於清除背景(可能只是白色?)。 InvalidateRect()應該強制重繪,但取決於你所做的任何事情都很棘手。 FillRect可能會給你更好的結果。顯然,在調用DrawText之前一定要做FillRect。 – MikeD

+0

我喜歡噴霧比喻。 'InvalidateRect'通常是正確的做法,但它需要你處理最終的繪製消息並在重繪後臺後繪製文本。 –

1

如果其他窗口覆蓋,然後揭示你畫的文本的地方它將會消失!窗戶可以坐在彼此頂部的錯覺被破壞! Windows提供了一種方案來解決這個問題,但是你並沒有與該方案合作。

僅使用BeginPaint和EndPaint API調用來繪製文本以響應WM_PAINT消息。點擊按鈕後,只需調用InvalidateRect,它會要求Windows向您發送WM_PAINT。 BeginPaint會在您繪製之前擦除您的窗口。所以通過將您的繪畫代碼放在正確的位置 - WM_PAINT處理程序 - 您可以解決兩個問題:它會擦除所有舊文本,並且每當您的窗口被遮蓋時就會重新繪製。