但用的是CDC::BitBlt(..),有问题嘛?还是要用BitBlt(..) API

解决方案 »

  1.   

    我想OnDraw里面有一些资源没有释放,如Pen,Brush,Bitmap等,需要用Object.DeleteObject()释放
      

  2.   

    int i,j;
    CDC dc;
    Position *Currentpos;
    dc.CreateCompatibleDC(pDC); for(i=0;i<MaxCol;i++)
    for(j=0;j<MaxRow;j++)
    {
    if(flag[i][j]==0)
    {
    dc.SelectObject(&Road);
    pDC->BitBlt(StartX+i*Size,StartY+j*Size,
    Size,Size,&dc,0,0,SRCINVERT);
    }
    else
    {
    dc.SelectObject(&Road2);
    pDC->BitBlt(StartX+i*Size,StartY+j*Size,
    Size,Size,&dc,0,0,SRCCOPY);
    }
    } dc.SelectObject(&Head);
    pDC->BitBlt(StartX+SnakeHead->col*Size,StartY+SnakeHead->row*Size,
    Size,Size,&dc,0,0,SRCCOPY);
    Currentpos=SnakeHead->next; dc.SelectObject(&Body);
    while(Currentpos)
    {
    if(Currentpos->col>=0&&Currentpos->col<MaxCol&&Currentpos->row>=0&&Currentpos->row<MaxRow)
    {
    pDC->BitBlt(StartX+Currentpos->col*Size,StartY+Currentpos->row*Size,
    Size,Size,&dc,0,0,SRCCOPY);
    Currentpos=Currentpos->next;
    }
    } dc.SelectObject(&OneHundred);
    for(i=0;i<MaxCol;i++)
    for(j=0;j<MaxRow;j++)
    if(flag[i][j]==1)
    pDC->BitBlt(StartX+i*Size,StartY+j*Size,
    Size,Size,&dc,0,0,SRCCOPY); dc.DeleteDC();Head等是CBitmap,全局变量
      

  3.   

    如果你需要系统为你重画某一块区域,其需要通过调用InvalidateRect函数,不然系统并不会调用OnDraw。我想问题应该是在这里
      

  4.   

    最好通过发消息的形式来重画...
    PostMessage(WM_PAINT....);
      

  5.   

    不要把处理过程放在OnDraw函数里,可以先计算好画在一个缓冲区了,然后
    再贴到屏幕上啊,
      

  6.   

    我非常赞同 Nownow(林子) 的想法
    如果图像很大,可以采样。
      

  7.   

    最好用BitBlt函数 
     
      

  8.   

    可以创建一个CBitmap之类的成员变量,第一次把各个小位图组成一个大位图,存到CBitmap中。以后在ondraw中直接贴CBitmap。
    如果位图太大可以按照实际的屏幕点素数对位图进行采样。