Avatar billede htm Nybegynder
05. september 2005 - 10:20 Der er 5 kommentarer og
1 løsning

Gentegne problem i eVC++

Hej

Jeg har en timer i mit eVC++ program der tæller en variable op hvert 5. sekund. Så kalder jeg PostMessage i timeren for at gentegne vinduet.

Det virker også fint, WM_PAINT bliver postet og kørt igennem men vinduet bliver ikke gentegnet før jeg har eks. flyttet vinduet manuelt.

Hvordan får jeg den til at gentegne vinduet så snart min timer er blevet trigget?

Jeg bruger eVC++ 4.0 og jeg bruger IKKE MFC.

Min testkode:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    int wmId, wmEvent;
    PAINTSTRUCT ps;

    switch (message)
    {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
                case IDM_FILE_EXIT:
                  DestroyWindow(hWnd);
                  break;
                default:
                  return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_CREATE:
            iTimerID = SetTimer(hWnd,1, 5000, NULL);
            GetSystemPowerStatusEx(&sps, TRUE);
            _stprintf(szText,TEXT("%d"), nValue);

            break;
        case WM_TIMER:
            GetSystemPowerStatusEx(&sps, TRUE);
            nValue++;
            _stprintf(szText,TEXT("%d"), nValue);
            PostMessage(hWnd,WM_PAINT,wParam,lParam);
            break;
        case WM_PAINT:
           
            SetWindowPos(hWnd,HWND_TOPMOST, 0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
            RECT rt;           
            hdc = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rt);
            DrawText(hdc, szText, _tcslen(szText), &rt,
                DT_SINGLELINE | DT_VCENTER | DT_CENTER);
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            KillTimer(hWnd,iTimerID);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
Avatar billede krismort Nybegynder
05. september 2005 - 16:28 #1
eVC++ == MSVC ? rigtigt : forkert ? :)

Prøv og send WM_PAINT til dit vindue umilbart efter du har oprettet det.
Avatar billede htm Nybegynder
05. september 2005 - 17:36 #2
eVC++ = Microsoft embedded Visual C++ - for Windows CE og PocketPC.

efter jeg har lavet PostMessage(hWnd,WM_PAINT,wParam,lParam); i min WM_TIMER kommer den rigtigt nok ind i WM_PAINT og kører alt koden igennem, men vinduet bliver ikke opdateret.
Avatar billede bertelbrander Novice
05. september 2005 - 19:23 #3
Fra windows programmørens 10 bud:

$7:
Du skal ikke sende WM_PAINT, du skal modtage WM_PAINT når systemet, hin mægtige, finder det fornødent. Ethvert forsøg på at sende WM_PAINT skal vise sig nyttesløse.

Skulle du virkelig ønske at modtage en WM_PAINT kan du kalde:
InvalidateRect(hWnd, 0, TRUE);
Avatar billede htm Nybegynder
06. september 2005 - 08:50 #4
Bertelbrander>> Det virkede perfekt ved at bruge invalidateRect i stedet. Hvis du lige ligger et svar, så er der nogle point på vej til dig.
Avatar billede bertelbrander Novice
06. september 2005 - 17:00 #5
Det var måske bedre at tegne direkte når du modtager WM_TIMER, derved vil du undgå at programmet står og flimrer.

Du får fat i en DC med GetDC() og frigiver igen med ReleaseDC().

Jeg samler ikke på point.
Avatar billede htm Nybegynder
08. september 2005 - 08:27 #6
OK.

Tusind tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester