有个常见的例子:
hdc=BeginPaint(hwnd,&paintinformation);
HBITMAP  bimp = (HBITMAP)LoadImage(NULL,"C:\\aa.bmp",IMAGE_BITMAP,1280,800,LR_LOADFROMFILE);
CreateCompatibleBitmap(hdc,1280,800);
HDC hh=CreateCompatibleDC(NULL);
SelectObject(hh,bimp);
BitBlt(hdc,0,0,400,200,hh,0,0,SRCCOPY);
先是创建一个hdc,这个dc还要经过“HDC hh=CreateCompatibleDC(NULL)”,有两个问题不明白,hdc和hh都是HDC的结构,两者结构一样,但是一个是“兼容的”一个是“不兼容的”,我知道这个地方的兼容“和显示设备有关”,具体的内容是不是和“显存”有关系,那个“CreateCompatibleBitmap(hdc,1280,800)”是不是相当于在“显存”相应的位置开辟一个“1280*800”的“位图存储”?最后,只要 BitBlt(hdc,0,0,400,200,hh,0,0,SRCCOPY);就是把“显存”相应位子填充了,就直接显示了?

解决方案 »

  1.   

    A memory device context is a block of memory that represents a display surface. 
      

  2.   

    dc都是在内存中分配的。
    显存中有一部分对应显示屏,也就是说分辨率越高需要的显存就越大。但目前动辄几G的显存对任何分辨率都没有问题。显存剩余部分用来存纹理模型等。
    bitblt就是从内存到显存的映射。双缓冲相当于把整个绘图过程中映射显存的次数缩短为一次,从而消除了闪烁现象。
      

  3.   


    不太理解,假如不用“双缓冲”,它为什么闪烁,要知道hdc对应这“显存”,始终只有一个映射。还要构造一个“一样的 兼容dc”做什么?
      

  4.   


    CreateCompatibleBitmap(hdc,404,303);
    hh=CreateCompatibleDC(NULL);
    SelectObject(hh,bimp);
    BitBlt(hdc,0,0,404,303,hh,0,0,SRCCOPY);
    问题:为什么直接的  SelectObject(hdc,bimp)   不可以,非要用一个兼容的“DC“做过渡,这个”兼容的dc“和原来的”hdc“之间到底是什么区别,他们在内存视角上有什么不同?
      

  5.   

    Windows中位图分两种,一种是独立设备位图(DIB,Device-Independent Bitmap),另外一种是依赖设备位图(DDB,Device-Dependent Bitmap),后者也叫做兼容位图。两者最大的区别是是否和具体输出设备相关,实际区别是自己带不带颜色表(调色板)。DIB的色深是与设备无关的,例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用(需要褪色处理)。对于16色或者256色的DIB位图是自带颜色表的,这个颜色表独立于系统。,由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。运行于不同计算机的不同输出设备(显示器、绘图仪、打印机等)的应用程序可以通过DIB来交换图象,输出的结果能保持高度一致。DDB则依赖于具体设备,它的色深必需与输出设备相一致。例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的。在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。
    DIB要想在输出设备上输出,必须通过一定的色深与颜色表转换操作变成DDB才行。如果已经是DDB的话就不需要,所以DDB输出速度要比DIB快,即使是32位真彩色下也是如此。
      

  6.   

    很感谢回答,不过我又有其他疑问了:
    问题一: DIB文件中的色彩,是怎么转化为DDB中的索引的,“DIB中的颜色”和“DDB所用的调色板”是怎么兼容的?
    问题二:为什么直接的 SelectObject(hdc,bimp) 不可以,非要用一个兼容的“DC“做过渡,这个”兼容的dc“和原来的”hdc“之间到底是什么区别,他们在内存视角上有什么不同?(5楼的老问题)