void CwglView::ImageMasaic (CImage *pImgm,int n)
{
struct IMAGEPARAMENT P;
int     Dx,Dy,i,j,s,t;
BYTE *buf,*buf1;
 
GetImageParament(pImgm,&P);              
Dx=P.nWidth/n*n;
Dy=P.nHeight/n*n;
  for (j=0;j<Dy;j+=n)          
{
buf=(BYTE*) pImgm->GetPixelAddress(0,j); 
for (i=0;i<Dx;i+=n)
{
for (s=1;s<n;s++)
memcpy(&buf[(i+s)*P.nBytesPerPixel],&buf[i*P.nBytesPerPixel],P.nBytesPerPixel);   
}
for (t=1;t<n;t++) {                             
buf1=(BYTE*) pImgm->GetPixelAddress(0,j+t);
memcpy(buf1,buf,P.nBytesPerLine);
}
  }
}
void CwglView::OnImageMasxaic()
{
// TODO: 在此添加命令处理程序代码
ImageMasaic(&m_im,4);
}
其中m_im为CImage类,struct IMAGEPARAMENT P是关于图像参数据的一个自定义结构,GetImageParament()是关于图像参数的。编译没有问题,就是点击菜单项以后图像没有变化,不知道出了什么问题,帮忙看看啊!

解决方案 »

  1.   

    试试Invalidate(),或者重载OnPaint()或OnEraseBkgrd(),应该是小问题
      

  2.   

    /*马赛克特效显示*/
    void CDynSplitView2::OnMasaike() 
    {
    //刷新屏幕
    CDC *pDC=GetDC();
    CRect rect(0,0,1000,1000);
    CBrush brush(RGB(255,255,255));
    pDC->FillRect(&rect,&brush);
        //复制图像数据
    clearmem();
    CDSplitDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    long mx=0;
    long my=0;
    int nscanline=8;  //设置显示定位量
    int k=0;
    if(!pDoc ->statedoc&&state2==1)
    {
            BYTE* pBitmapData = CDibNew1->GetData();
            LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
            int bitmapHeight = CDibNew1->GetHeight();
          //  int bitmapWidth = CDibNew1->GetWidth();
     int bitmapWidth = CDibNew1->GetDibWidthBytes();
    int nrw=0; 
    int nrh=0;
    if((bitmapWidth%12)!=0)nrw=1;
    if((bitmapHeight%12)!=0)nrh=1;
    long ltilenum=(bitmapWidth/12+nrw)*(bitmapHeight/12+nrh);
    POINT* point=new POINT[ltilenum];
    POINT* point1=new POINT[ltilenum]; if (CDibNew1->GetRGB()) // Has a color table
    {
    CPalette * hPalette1=CreateBitmapPalette(CDibNew1);
                CPalette * hOldPalette =
    pDC->SelectPalette(hPalette1, true);
                pDC->RealizePalette();
    for(int mi=0;mi<ltilenum;mi++)
    {
    point[mi].x=mx;
    point[mi].y=my;
    mx=mx+12;
    if(mx>bitmapWidth)
    {mx=0;my=my+12;}
    }
    for(int i=0;i<=2;i++)
    for(mi=ltilenum-1;mi>0;mi--)
    {
    int n=(int)((double)ltilenum*rand()/RAND_MAX);
    mx=point[n].x;my=point[n].y;
    ::StretchDIBits(pDC->GetSafeHdc(),mx, my, 12,12,
    mx,bitmapHeight-my-12, 12,12,
    pBitmapData, pBitmapInfo,
    DIB_RGB_COLORS, SRCCOPY);
    point[n].x=point[mi].x;
    point[n].y=point[mi].y;

    Sleep(1);
    }
    pDC->SelectPalette(hOldPalette, true);
    ::DeleteObject(hPalette1);
              
    delete point;  
    }
    else
    {
    for(int mi=0;mi<ltilenum;mi++)
    {
    point[mi].x=mx;
    point[mi].y=my; mx=mx+12;
    if(mx>bitmapWidth)
    {mx=0;my=my+12;}
    }
    CString str , temp;
    // for(int i=0;i<1;i++)
    {
    str = "" ;
    int i, random;

    bool * check = new bool [ltilenum ] ;
    int * index = new int [ltilenum ] ;

    //zero all values in the check array--this will keep track of #'s we've used
    for(i=0; i<ltilenum; ++i) check[i] = false;

    int got_a_good_one = 0;

    // int n ;
    for(i=0; i < ltilenum ; ++i)    // we will get a random number for each index value
    {
    while( got_a_good_one == 0)   // loop until we get a non-used number
    {
    random = (int)((double)ltilenum*rand()/RAND_MAX);  // gives us a number between 0 - 51
    if(check[random] == false)
    {

    index[i] = random;     // set the indexput random into index array
    check[random] = true;   // set check on--this number has been used
    got_a_good_one = 1;
    }
    }
    got_a_good_one = 0;  // ready for next one
    //}

    // for(mi=ltilenum-1;mi>=0;mi--)
    // {
    // int n=(int)((double)ltilenum*rand()/RAND_MAX);
    // int n=(int)(rand()/ltilenum);
    temp.Format ( "数%d" , index[i] ) ;
    str +=temp ;
        
    mx=point[index[i]].x;my=point[index[i]].y;
    // mx=point[i].x;my=point[i].y;
    ::StretchDIBits(pDC->GetSafeHdc(), mx, my, 12,12,
    mx , bitmapHeight-my-12 , 12,12,
    pBitmapData, pBitmapInfo,
    DIB_RGB_COLORS, SRCCOPY);
    // point[index[i]].x=point[i].x;
    // point[index[i]].y=point[i].y;



    Sleep(1);
    //this->MessageBox ( str ) ;
    }

    //this->MessageBox ( str ) ;
    // Sleep(500);
    delete [] index ;
    delete [] check ;
    }

    delete point;

    }
    }
    Invalidate();
    }