硬盘兼容性hdc硬盘;
硬盘是现有的直流。 如果为NULL,则创建与当前程序显示器兼容的内存DC
hbitmapcreatecompatiblebitmap hdc hdc,int nWidth,int nHeight );
nWidth,nHeight是这个位图的宽度和高度
hdc必须是现有DC,不能为空,也不能是没有HBITMAP的hdc
在OnLButtonDown函数中,输入以下代码:
CDC *pDC=GetDC ;
CDC de;
CRect rect;
获取客户端rect;
de.createcompatibledcPDC;
CBitmap *pBmp;
pBmp=new CBitmap;
pbmp -创建兼容bitmap PDC,rect.Width ),rect.Height );
de .选择对象pbmp;
PDC-bitblt 0,0,rect.Width ),rect.Height ),de,0,0,SRCCOPY );
运行,点击鼠标左键,为什么会显示黑色画面? 是因为CreateCompatibleBitmap有什么问题吗? 请告诉我具体的原理~
使用CreateCompatibleBitmap创建兼容位图,并选择用于de,但没有在de中进行绘制操作,因此相应的位图中没有数据。 也就是说,都是0。 RGB 0,0,0 )为黑色,因此在支持PDC PDC )的程序的客户区域)中显示de时为黑色。
请尝试添加绘图代码。
例如,填充背景:
有
PDC-bitblt 0,0,rect.Width ),rect.Height ),de,0,0,SRCCOPY );
前面加一行
de.fillsolidrectrect,RGB ) 255,255,0 ); //填充背景颜色为黄色) )。
然后点击左键变成黄色。
CreateCompatibleBitmap函数功能:创建与指定设备环境相关联的设备兼容的位图。
函数原型: hbitmapcreatecompatiblebitmap hdc hdc,int nWidth,int nHeight );
参数:
hdc :设备环境句柄。
nWidth :指定位图的宽度以像素为单位)。
nHeight :指定位图的高度以像素为单位)。
返回值:如果函数成功执行,则返回值是位图的句柄。 如果函数执行失败,则返回值为空。 要获取更多错误消息,请调用GetLastError。
注:使用CreateCompatibleBitmap函数创建的位图的颜色格式与参数hdc标识的设备的颜色格式匹配。 可以为与原始设备兼容的任何内存设备环境选择位图。 因为内存设备环境允许彩色和单色两种位图。 因此,如果指定的设备环境是内存设备环境,则CreateCompatibleBitmap函数返回的位图格式不一定相同。 但是,为非内存设备环境创建的兼容位图通常具有相同的颜色格式,并使用与指定设备环境相同的调色板。
快查: Windows NT:3.1以上; Windows:95以上Windows CE:1.0以上头文件: wingdi.h; 库文件: gdi32.lib。
PS:与CreateCompatibleDC联合使用为什么有时候CDC的对象建立时用CreateDC,而有时候用CreateCompatibleDC?两者有什么不同?HDC CreateDC
lpctstr lpsz驱动器,//pointertostringspecifyingdrivername
lpctstr lpsz设备,//pointertostringspecifyingdevicename
LPCTSTR lpszOutput,//do not use; 设置为空
const devmode * LP initdata//pointertooptionalprinterdata
);
HDC CreateCompatibleDC
hdc hdc//handletothedevicecontext
);
CreateDC从设备创建直流,CreateCompatibleDC从现有直流创建与现有直流兼容的内存直流。 我在ondraw )上这么做了
CDC scrdc,memdc;
SCR DC.createdc 显示)、NULL、NULL、NULL );
memdc.createcompatibledcSCRDC;
memdc.bitblt 20,20,300,300,scrdc,0,0,SRCCOPY );
PDC-bitblt 20,20,300,300,memdc,0,0,SRCCOPY );
无法显示剪切的区域。
但如果是这样的话:
CDC scrdc,memdc;
SCR DC.createdc 显示)、NULL、NULL、NULL );
memdc.createcompatibledcSCRDC;
memdc.bitblt 20,20,300,300,scrdc,0,0,SRCCOPY );
PDC-bitblt 20,20,300,300,scrdc,0,0,SRCCOPY );
可以显示。
为什么通过兼容的直流就不行呢? 请说明白点。 在线等; 兼容直流就像照相机,里面没有你的底片,不能拍照。 与直流兼容的底片与位图兼容。
1 ) CDC scrdc,memdc;
2 ) SCR DC.createdc 显示)、NULL、NULL、NULL );
3 ) memdc.createcompatibledcSCRDC;
4 ) CBitmap memBMP; //制作底片
mem BMP.createcompatiblebitmap SCR DC,300,300 );
5 ) memdc.selectobjectmembmp ); //加入底片
//4 ),5 )少了两步
6 ) memdc.bitblt 0,0,300,300,scrdc,0,0,SRCCOPY );
7 ) PDC-bitblt 20,20,300,300,memDC,0,0,SRCCOPY ); caintDCDCthis;
CDC scrdc,memdc;
CBitmap buf;
SCRDC.createdcL’display ‘,NULL,NULL,NULL );
memdc.createcompatibledcSCRDC;
buf.createcompatiblebitmap SCR DC,300,300 );
memdc.selectobjectbuf;
memdc.bitblt 20,20,300,300,scrdc,0,0,SRCCOPY );
DC.bitblt 20,20,300,300,memdc,0,0,SRCCOPY );
只有CreateCompatibleDC是不够的,需要CreateCompatibleBitmap
然后选择对象