2012-06-09 54 views
1

我已經在我的printText函數中打了另一面牆,並且一直在尋找一段時間,但沒有運氣的解決方案。WINAPI BeginPaint和TextOut在自定義函數中多次調用

基本上,在WM_PAINT消息中調用printText函數來將文本繪製到win32窗口。它工作正常,但只有一個電話。如果我嘗試用不同的參數第二次調用該函數,則不會出現任何情況。

我確定我只是完全忽略了一些東西,但我看不出它可能是什麼。

的功能如下:

void controls::printText(unsigned char R, unsigned char G, unsigned char B, int x, int y, LPCSTR text, HWND parent, PAINTSTRUCT pss, HDC hdc) 
{ 

    hdc = BeginPaint(parent, &pss); 
    SetBkMode(hdc, TRANSPARENT); 
    SetTextColor(hdc, RGB(R,G,B)); 
    TextOut(hdc, x, y, text, strlen(text));  
    EndPaint(parent, &pss); 

} 

這是一個 '對照' 類內部和呼叫如下:

HDC hdc, hdc2; 
PAINTSTRUCT ps, ps2; 

ctrls->printText(255,0,0,30,50,"Test text",hWnd,ps,hdc); 
ctrls->printText(255,0,0,30,80,"test text 2",hWnd,ps2,hdc2); 

有兩個(2)HDC和PAINTSTRUCT聲明作爲我一直在玩代碼試圖找到一個解決方案;我嘗試從函數中刪除paintstruct和hdc參數,並讓它們在函數內部作爲本地聲明(這對我來說沒有多大意義)而沒有成功。

基本上,第一線,

ctrls->printText(255,0,0,30,50,"Test text",hWnd,ps,hdc); 

會做,因爲它應該和打印「測試文本」,在紅,從(30,50),但第二行不顯示任何信息。如果我刪除第一行,但是,第二行也可以正常工作。

請注意:在描述時,我可能在這裏使用油漆和同義字。

我想我已經包括了相關的一切在這裏,但如果需要任何其他的代碼只是讓我知道,我會盡快發佈它,因爲我看到消息:)提前

再次感謝球員, 你的時間和答案非常感謝。

回答

4

的文檔很清楚地指出

應用程序不應調用BeginPaint除了響應 WM_PAINT消息。

因此,您應該每WM_PAINT調用一次,不再更多。

+0

在那裏,我再次忽略簡單的事情-.- 你,我的朋友,是一個天才。您的響應激發了我在WM_PAINT消息中更改了調用BeginPaint的代碼,並僅將該函數用於TextOut()函數。 非常感謝:) – Timmy

+0

@Timmy,常見的做法是將'BeginPaint'中的'HDC'傳遞給函數。 – chris