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画点速度比较慢,所以我想直接往内存位图的相应位置写像素点的颜色值。我觉得上面的代码应该是正确的,可是,为什么什么都画不出来呢?
{
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画点速度比较慢,所以我想直接往内存位图的相应位置写像素点的颜色值。我觉得上面的代码应该是正确的,可是,为什么什么都画不出来呢?
{
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类的方法
我觉得怎么delphi做得软件画图怎么那么快,而且占用cpu 又比较少,不知道是不是跟技术有关,
vb的有些慢,占用比较高,vc++也不是很好 ,
不知道是不是有什么技巧
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);
太感谢了!!!!按照你给的代码,可以了!!!