2013-03-14 4 views
0

D'abord, cette fonction est appelée plusieurs fois. Il est à noter que wString [] contient la constante de caractère '\ n'.Quelque chose ne va pas avec lParam ou avec 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); 
} 

A la fin, un message WM_PAINT est envoyé en NLINES devrait être non nulle puisque log contient des multiples de \ n ". Mon WndProc reçoit le message et le traite.

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

Après quoi OnRender est appelée avec un (soi-disant) non nul int comme 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(); 
} 

Pour une raison quelconque, dans la fonction OnRender, la valeur de nLogLines est 0. Qu'est-ce qui ne va pas?

+2

Ce n'est pas une bonne idée d'envoyer ou de poster un WM_PAINT. invalider la partie de votre fenêtre qui doit être repeinte. alors WM_PAINT est * généré * lorsque vous accédez à la file d'attente des messages. –

+0

J'ai utilisé un WCHAR * maintenant et nLines gagne la valeur qu'il était supposé avoir. Cependant, j'ai un autre problème qui peut être lié au message WM_PAINT envoyé. Je vais utiliser invalidateRect à la place. Merci. –

+0

\ n désolé. Je voulais dire \ n –

Répondre

2

"Qu'est-ce qui ne va pas?"

plus probablement que la WM_PAINT vous traitez ne venait pas de votre SendMessage

Conseils généraux: ne pas envoyer ou post WM_PAINT, que le système génère ce message (ce qui fait quand vous récupérez un message la file d'attente des messages du thread et une fenêtre doivent être repeintes)

+0

J'ai utilisé un WCHAR * maintenant et nLines gagne la valeur qu'il était supposé. Cependant, j'ai un autre problème qui peut être lié au message WM_PAINT envoyé. Je vais utiliser invalidateRect à la place. –

+0

@ MickaelBergeronNéron: les deux déclarations d'argument formel 'WCHAR wString []' et 'WCHAR * wString' sont équivalentes, sans différence. –

+0

Pour une raison quelconque, j'ai changé seulement cela et cela fonctionne maintenant. –

Questions connexes