CreateCompatibleDC 和 CreateCompatibleBitmap

来源:互联网 发布:网络用语jqk什么意思 编辑:程序博客网 时间:2024/05/29 15:08


HDC CreateCompatibleDC( HDC hdc );

hdc是一个已存在的DC.如果为NULL,将创建一个与当前程序显示器兼容的内存DC


HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);

nWidth,nHeight为该bitmap的宽和高
 hdc必须为一个已存在的DC,不能为NULL,而且不能为没有HBITMAP的HDC

 

在OnLButtonDown函数中,填入如下代码: 
CDC *pDC=GetDC(); 
CDC de; 
CRect rect; 
GetClientRect(&rect); 
de.CreateCompatibleDC(pDC); 
CBitmap *pBmp; 
pBmp=new CBitmap; 
pBmp->CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); 
de.SelectObject(pBmp); 
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&de,0,0,SRCCOPY); 

运行,点鼠标左键,为什么会出现黑屏?是不是因为CreateCompatibleBitmap有什么问题?请问具体原理是什么~~

你使用CreateCompatibleBitmap创建了一个兼容位图并选入de,但因为并没有在de中进行任何绘图操作,所以此时对应的位图没有数据(就是都是0),而RGB(0,0,0)就是黑色,所以将de显示到pDC(对应程序的客户区)时就是黑色的。 

你可以加一些绘图代码再试试。 
比如加上填充背景: 
在 
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&de,0,0,SRCCOPY); 
前面添加一行 
de.FillSolidRect(rect, RGB(255,255,0));//填充背景(颜色为黄色) 

然后点击完左键就是黄色的了。

 

CreateCompatibleBitmap

  函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
  函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
  参数:
  hdc: 设备环境句柄。
  nWidth:指定位图的宽度,单位为像素。
  nHeight:指定位图的高度,单位为像素。
  返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用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   lpszDriver,     //   pointer   to   string   specifying   driver   name   
      LPCTSTR   lpszDevice,     //   pointer   to   string   specifying   device   name   
      LPCTSTR   lpszOutput,     //   do   not   use;   set   to   NULL   
      CONST   DEVMODE   *lpInitData    //   pointer   to   optional   printer   data   
  );   
  HDC   CreateCompatibleDC(   
      HDC   hdc       //   handle   to   the   device   context   
  );   
    
  CreateDC是从一个设备创建DC,而CreateCompatibleDC是从一个已有的DC创建一个与原有的DC兼容的内存DC  
 
我在ondraw()里面这么做的 

CDC scrdc,memdc; 
scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
pDC->BitBlt(20,20,300,300,&memdc,0,0,SRCCOPY); 
不能显示截取的区域。 

但是如果这样: 
CDC scrdc,memdc; 
scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
pDC->BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
可以显示。 
为什么通过一个兼容的dc就不行了呢?请说明白点。在线等;
兼容DC就象一部照相机,你底片都没装,拍不出照片的。兼容DC的底片就是兼容位图。 
1)CDC scrdc,memdc; 
2)scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
3)memdc.CreateCompatibleDC(&scrdc); 
4)CBitmap memBMP;//做底片 
memBMP.CreateCompatibleBitmap(&scrdc, 300, 300); 
5)memDC.SelectObject(&memBMP);//装底片 
//少了4),5)两步 
6)memDC.BitBlt(0, 0, 300, 300, &scrdc, 0, 0, SRCCOPY); 
7)pDC->BitBlt(20,20,300,300,&memDC,0,0,SRCCOPY); 
CPaintDC dc(this); 

CDC scrdc,memdc; 
CBitmap buf; 

scrdc.CreateDC(L"DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
buf.CreateCompatibleBitmap(&scrdc,300,300); 
memdc.SelectObject(buf); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
dc.BitBlt(20,20,300,300,&memdc,0,0,SRCCOPY); 

光有CreateCompatibleDC是不够的,要有CreateCompatibleBitmap 
然后 SelectObject
0 0
原创粉丝点击