правильно ли я обрабатываю WM_PAINT

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 18 май 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Вот обработка WM_PAINT:
    Код (Text):
    1.    case (WM_PAINT):
    2.       {//сообщенение рисования в окне
    3.           PAINTSTRUCT paint = {0};
    4.           BITMAP bm;
    5.         HDC hdc=BeginPaint(hwnd,&paint);
    6.  
    7.         HDC tempHDC = CreateCompatibleDC(0);
    8.         HDC bufHDC = CreateCompatibleDC(0);
    9.         HBITMAP  tempBitMap = CreateCompatibleBitmap(hdc,Width,Height);
    10.         HBITMAP  bufBitMap = CreateCompatibleBitmap(hdc,Width,Height);
    11.         SelectObject(bufHDC,bufBitMap);
    12.         SelectObject(tempHDC,ImageArea);
    13.         GetObject(ImageArea,sizeof(bm),&bm);
    14.         BitBlt(bufHDC,0,0,bm.bmWidth,bm.bmHeight,tempHDC,0,0,SRCCOPY);
    15.        
    16.  
    17.         for (int i=0;i<10;i++)//рисование футболистов
    18.         {
    19.         //  DrawTransparentBitmap(bufHDC,ImageP1,P1[i].GetX(),P1[i].GetY(),RGB(255,255,255));
    20.         //  DrawTransparentBitmap(bufHDC,ImageP2,P2[i].GetX(),P2[i].GetY(),RGB(255,255,255));
    21.         };
    22.       DrawTransparentBitmap(bufHDC,ImageBall,Ball.GetX(),Ball.GetY(),RGB(255,255,255));
    23.     //риусем ворота левые
    24.         MoveToEx(bufHDC,V1.Lx,V1.Ry,0);
    25.         LineTo(bufHDC,V1.Rx,V1.Ry);
    26.         LineTo(bufHDC,V1.Rx,V1.Ly);
    27.         LineTo(bufHDC,V1.Lx,V1.Ly);
    28.     //риусем ворота правые
    29.         MoveToEx(bufHDC,V2.Rx,V2.Ry,0);
    30.         LineTo(bufHDC,V2.Lx,V2.Ry);
    31.         LineTo(bufHDC,V2.Lx,V2.Ly);
    32.         LineTo(bufHDC,V2.Rx,V2.Ly);
    33.     //рисуем всю  картинку на экран
    34.         StretchBlt(hdc,0,0,nWidth,nHeight,bufHDC,0,0,Width,Height,SRCCOPY);
    35.         EndPaint(hwnd,&paint);
    36.        
    37.         DeleteDC(tempHDC);
    38.         DeleteObject(tempBitMap);
    39.             DeleteDC(bufHDC);
    40.         DeleteObject(bufBitMap);
    41.         return 0;
    42.          break;
    43.       };
    Проблема в том что секунд через 10 ЦП загружен до 100%.
    WM_PAINT вызывается по таймеру каждые 300-1000мс .
    Таймер такой код делает:
    Код (Text):
    1.        
    2.  RECT rect;
    3.  GetClientRect(hwnd,&rect);
    4.  InvalidateRect(hwnd,&rect,true);
    Весь проект я подключил к файлу.
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    уже разобрался. в чем дело, оказалось там у меня в расчетах был лишний цикл...
     
  3. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    Ну во первых SelectObject(bufHDC,bufBitMap), SelectObject(tempHDC,ImageArea);
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    djmans
    это временные DC, они удаляются в конце обработки у человека. Вопрос - нафига селектить обратно?)
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    'селектить обратно' надо потому что так сказано в MSDN.