void Ctest3Dlg::OnBnClickedButton1()
{
    CRect rc;
    GetClientRect(&rc);            //得到窗口的宽和高
    CClientDC dc(this);                CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());        //创建内存兼容位图
    ::DeleteObject(memDC.SelectObject(bitmap));                    //将位图选入内存DC
    memDC.BitBlt(0,0,rc.Width(),rc.Height(),&dc,0,0,SRCCOPY);        void * pbits32=NULL; 
    BITMAPINFOHEADER RGB32BITSBITMAPINFO={sizeof(BITMAPINFOHEADER),rc.Width(),rc.Height(),1,32,BI_RGB,0,0,0,0,0};
    HBITMAP hbm32=CreateDIBSection(memDC,(BITMAPINFO *)&RGB32BITSBITMAPINFO,DIB_RGB_COLORS,&pbits32,NULL,0);        BITMAP bm32;
    GetObject(hbm32,sizeof(bm32),&bm32);
    while (bm32.bmWidthBytes%4) bm32.bmWidthBytes++;    //让指针指向内存里位图最后那一行的第一个像素点
    BYTE * p32=(BYTE *)bm32.bmBits+(bm32.bmHeight-1)*bm32.bmWidthBytes;            for (int y=0;y<rc.Height();y++)            //每一行
    {
        for (int x=0;x<rc.Width();x++)        //每一列
        {
            LONG *p=(LONG *)p32+x;
            *p=RGB(255,0,255);            //画红色像素点
        }        p32 -= bm32.bmWidthBytes;        //换行
    }    dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
}因为用SetPixel画点速度比较慢,所以我想直接往内存位图的相应位置写像素点的颜色值。我觉得上面的代码应该是正确的,可是,为什么什么都画不出来呢? 

解决方案 »

  1.   

    inline void* CImage::GetPixelAddress( int x, int y ) throw()
    {
    ATLASSUME( m_hBitmap != NULL );
    ATLASSERT( IsDIBSection() );
    ATLASSERT( (x >= 0) && (x < m_nWidth) );
    ATLASSERT( (y >= 0) && (y < m_nHeight) ); return( LPBYTE( m_pBits )+(y*m_nPitch)+((x*m_nBPP)/8) );
    }可以参考一下CImage类的方法
      

  2.   

    帮你顶,我也想知道到底该如何画图比较快,
    我觉得怎么delphi做得软件画图怎么那么快,而且占用cpu 又比较少,不知道是不是跟技术有关,
    vb的有些慢,占用比较高,vc++也不是很好 ,
    不知道是不是有什么技巧
      

  3.   

    如果要速度快,建议你使用MMX指令,更快!
      

  4.   

    MMX的操作还不是很熟,目前比较急,能用VC先用VC实现,等以后有时间再改用汇编。
      

  5.   

    删除以下几行 CBitmap bitmap;
        bitmap.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());        //创建内存兼容位图
        ::DeleteObject(memDC.SelectObject(bitmap));                    //将位图选入内存DC
        memDC.BitBlt(0,0,rc.Width(),rc.Height(),&dc,0,0,SRCCOPY);    添加
    memDC.SelectObject(hbm32);
       CRect rc;
        GetClientRect(&rc);            //得到窗口的宽和高
        CClientDC dc(this);                CDC memDC;
        memDC.CreateCompatibleDC(&dc);    void * pbits32=NULL; 
        BITMAPINFOHEADER RGB32BITSBITMAPINFO={sizeof(BITMAPINFOHEADER),rc.Width(),rc.Height(),1,32,BI_RGB,0,0,0,0,0};
        HBITMAP hbm32=CreateDIBSection(memDC,(BITMAPINFO *)&RGB32BITSBITMAPINFO,DIB_RGB_COLORS,&pbits32,NULL,0);        BITMAP bm32;
        GetObject(hbm32,sizeof(bm32),&bm32);
        while (bm32.bmWidthBytes%4) bm32.bmWidthBytes++; //选入位图
    memDC.SelectObject(hbm32);    //让指针指向内存里位图最后那一行的第一个像素点
        BYTE * p32=(BYTE *)bm32.bmBits+(bm32.bmHeight-1)*bm32.bmWidthBytes;            for (int y=0;y<rc.Height();y++)            //每一行
        {
            for (int x=0;x<rc.Width();x++)        //每一列
            {
                LONG *p=(LONG *)p32+x;
                *p=RGB(255,0,255);            //画红色像素点
            }        p32 -= bm32.bmWidthBytes;        //换行
        }    dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
      

  6.   

    To: Conry 
    太感谢了!!!!按照你给的代码,可以了!!!