有个常见的例子:
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);就是把“显存”相应位子填充了,就直接显示了?
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);就是把“显存”相应位子填充了,就直接显示了?
显存中有一部分对应显示屏,也就是说分辨率越高需要的显存就越大。但目前动辄几G的显存对任何分辨率都没有问题。显存剩余部分用来存纹理模型等。
bitblt就是从内存到显存的映射。双缓冲相当于把整个绘图过程中映射显存的次数缩短为一次,从而消除了闪烁现象。
不太理解,假如不用“双缓冲”,它为什么闪烁,要知道hdc对应这“显存”,始终只有一个映射。还要构造一个“一样的 兼容dc”做什么?
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“之间到底是什么区别,他们在内存视角上有什么不同?
DIB要想在输出设备上输出,必须通过一定的色深与颜色表转换操作变成DDB才行。如果已经是DDB的话就不需要,所以DDB输出速度要比DIB快,即使是32位真彩色下也是如此。
问题一: DIB文件中的色彩,是怎么转化为DDB中的索引的,“DIB中的颜色”和“DDB所用的调色板”是怎么兼容的?
问题二:为什么直接的 SelectObject(hdc,bimp) 不可以,非要用一个兼容的“DC“做过渡,这个”兼容的dc“和原来的”hdc“之间到底是什么区别,他们在内存视角上有什么不同?(5楼的老问题)