2013-03-14 41 views
0

首先,這個函數被調用很多次。應該指出,wString []確實包含字符常量'\ n'。lParam或WCHAR有問題[]

void D2DResources::PutToLog(WCHAR wString[]) 
{ 
    int strLen=wcslen(wString); 
    int logLen=wcslen(log); 

    if(strLen+logLen>=MaxLogSize) 
     wcsncpy(log, log, logLen-strLen); 

    wcscat (log, wString); 

    int nLines=0; 

    for(int x=0; x<wcslen(log); x++) 
    { 
     if(log[x]=='\n') 
     { 
      nLines++; 
      if(nLines>5) 
      { 
       log[x]='\0'; 
      } 
     } 
    } 

    SendMessage (m_hWnd, WM_PAINT, NULL, (LPARAM)nLines); 
} 

最後,發送WM_PAINT消息,而nLines應該爲非零,因爲日誌包含倍數'\ n'。我的WndProc收到消息並處理它。

case WM_PAINT: 
    { 
     pD2DResources->OnRender((int)lParam); 
     ValidateRect(hWnd, NULL); 
    } 
    break; 

之後,OnRender與一個(推測)非零int作爲lParam調用。

void D2DResources::OnRender(int nLogLines) 
{ 
    D2D1_SIZE_F screenSize = pCurrentScreen->GetSize(); 

    D2D1_SIZE_F rTSize = pRT->GetSize(); 

    pRT->BeginDraw(); 

    pRT->DrawBitmap(
     pCurrentScreen, 
     D2D1::RectF(0.0f, 0.0f, screenSize.width, screenSize.height) 
     ); 

    pRT->DrawText(
     log, 
     ARRAYSIZE(log) - 1, 
     pTextFormat, 
     D2D1::RectF(0, rTSize.height - ((nLogLines*textSize)+textSize) , rTSize.width, rTSize.height), 
     pWhiteBrush 
     ); 

    pRT->EndDraw(); 
} 

由於某種原因,在OnRender函數中,nLogLines的值爲0.什麼是錯誤的?

+2

發送或發佈WM_PAINT不是一個好主意。無論你的窗口需要重繪的部分。那麼當您下次訪問消息隊列時,會生成WM_PAINT * *。 – 2013-03-14 00:24:56

+0

我現在使用了WCHAR *並且nLines確實獲得了它應有的價值。但是,我indead有另一個問題,可能與WM_PAINT正在發送的消息有關。我將使用invalidateRect來代替。謝謝。 – 2013-03-14 00:33:32

+0

\ n對不起。我的意思是\ n – 2013-03-14 00:37:02

回答

2

「怎麼了?」

最有可能你正在處理WM_PAINT沒有從你的SendMessage幹

一般的建議是:不要發送或郵寄WM_PAINT,讓系統生成消息(當您檢索了一種消息,它線程的消息隊列和一個窗口需要重新繪製)

+0

我現在使用了WCHAR *並且nLines確實獲得了應有的價值。但是,我indead有另一個問題,可能與WM_PAINT正在發送的消息有關。我將使用invalidateRect來代替。 – 2013-03-14 00:32:40

+0

@MickaelBergeronNéron:兩個形式化的參數聲明'WCHAR wString []'和'WCHAR * wString'是等價的,沒有區別。 – 2013-03-14 00:36:33

+0

出於某種原因,我改變了這一點,它現在起作用。 – 2013-03-14 00:39:18