奇了怪了,内存兼容DC无论如何就是画不到窗口,但文件位图DC却可以
答案:3 悬赏:0
解决时间 2021-03-12 01:41
- 提问者网友:人生佛魔见
- 2021-03-11 21:43
奇了怪了,内存兼容DC无论如何就是画不到窗口,但文件位图DC却可以
最佳答案
- 二级知识专家网友:零点过十分
- 2021-03-11 21:50
m_hBitMap=CreateCompatibleBitmap(hDC,rect.right-rect.left ,rect.bottom-rect.top);
SelectObject(m_hDC,m_hBitMap);//原来的位图先不管他,
这两条语句仅仅是创建一个空的位图并把空的位图选到兼容内存DC中,故把内存DC中的内容显示到屏幕
“BitBlt
(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);”当然是不行的。
而m_hBitMap=(HBITMAP)LoadImage(GetModuleHandle(NULL),file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)是你真正的加载一个位图,当然显示正常。
还有,在你贴出的代码中。int j= BitBlt(hDeskDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);//这里能实现
有一个疑问,你注释说这里能实现,那实现了什么?追答
追问:实现了将红色DC拷贝到了桌面上.
这貌似证明,内存DC的确的创建成功了,但,与窗口DC不兼容.
经过我的实验发现,
m_hDC=CreateCompatibleDC (NULL);
m_hBitMap=CreateCompatibleBitmap(m_hDC,rect.right-rect.left ,rect.bottom-rect.top);
//创建与m_hDC兼容的位图后,
(hDeskDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);也出现错误,桌面显示麻点.不是红色DC
追答:用函数CreateCompatibleBitmap创建的位图是一个空的位图,从内存分配的角度其实就是为所创建的兼容位图分配内存空间,而SelectObject就是把为兼容位图分配的内存空间关联到相应的内存DC;所以以下这两条语句可以这样理解:
m_hBitMap=CreateCompatibleBitmap(hDC,rect.right-rect.left ,rect.bottom-rect.top);
//创建并为兼容位图分配内存空间;
m_hBitMap=SelectObject(m_hDC,m_hBitMap);//关联兼容位图内存空间到内存dc
而BitBlt
(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);”
就是把仅仅分配内存空间的位图复制到屏幕dc上,因为为位图分配的内存中其数据是不固定的,所以显示在屏幕上的内容就比较乱。
如果你要把位图选进内存dc根本就没有必要创建兼容位图,装载位图后直接用SelectObject函数把位图选进内能兼容dc即可。
追问:这些都不是原因啦,
问题原因我已找到,
是我自己的问题哦,,我自己写的CDC的一个开关没打开
不是什么兼容的问题...
笨死啊,我.问题原因找到天边去了
谢谢你的热心回答,,
其实,有很多时候,10个问题有9个别人回答得不对或者我自己的问题本身就有毛病.
但是,10个问题里我自己在提问后有8个都能自己解决.
所以,不管怎样,只要有人能热心回答,就能给我很好的启发.
SelectObject(m_hDC,m_hBitMap);//原来的位图先不管他,
这两条语句仅仅是创建一个空的位图并把空的位图选到兼容内存DC中,故把内存DC中的内容显示到屏幕
“BitBlt
(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);”当然是不行的。
而m_hBitMap=(HBITMAP)LoadImage(GetModuleHandle(NULL),file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)是你真正的加载一个位图,当然显示正常。
还有,在你贴出的代码中。int j= BitBlt(hDeskDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);//这里能实现
有一个疑问,你注释说这里能实现,那实现了什么?追答
追问:实现了将红色DC拷贝到了桌面上.
这貌似证明,内存DC的确的创建成功了,但,与窗口DC不兼容.
经过我的实验发现,
m_hDC=CreateCompatibleDC (NULL);
m_hBitMap=CreateCompatibleBitmap(m_hDC,rect.right-rect.left ,rect.bottom-rect.top);
//创建与m_hDC兼容的位图后,
(hDeskDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);也出现错误,桌面显示麻点.不是红色DC
追答:用函数CreateCompatibleBitmap创建的位图是一个空的位图,从内存分配的角度其实就是为所创建的兼容位图分配内存空间,而SelectObject就是把为兼容位图分配的内存空间关联到相应的内存DC;所以以下这两条语句可以这样理解:
m_hBitMap=CreateCompatibleBitmap(hDC,rect.right-rect.left ,rect.bottom-rect.top);
//创建并为兼容位图分配内存空间;
m_hBitMap=SelectObject(m_hDC,m_hBitMap);//关联兼容位图内存空间到内存dc
而BitBlt
(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY);”
就是把仅仅分配内存空间的位图复制到屏幕dc上,因为为位图分配的内存中其数据是不固定的,所以显示在屏幕上的内容就比较乱。
如果你要把位图选进内存dc根本就没有必要创建兼容位图,装载位图后直接用SelectObject函数把位图选进内能兼容dc即可。
追问:这些都不是原因啦,
问题原因我已找到,
是我自己的问题哦,,我自己写的CDC的一个开关没打开
不是什么兼容的问题...
笨死啊,我.问题原因找到天边去了
谢谢你的热心回答,,
其实,有很多时候,10个问题有9个别人回答得不对或者我自己的问题本身就有毛病.
但是,10个问题里我自己在提问后有8个都能自己解决.
所以,不管怎样,只要有人能热心回答,就能给我很好的启发.
全部回答
- 1楼网友:夜余生
- 2021-03-11 23:23
不明白你要做什么,目的是显示还是保存呢。如果是显示,你在DC上直接画就可以了,为什么一定要CreateCompatibleBitmap呢,不理解你的做法。
追问:我要建立一个内存DC,然后在WM_PAINT消息中重画.
直接在DC上画的话,一个是速度慢,另外,
上次做的图也无法保存..
追问:我要建立一个内存DC,然后在WM_PAINT消息中重画.
直接在DC上画的话,一个是速度慢,另外,
上次做的图也无法保存..
- 2楼网友:轻熟杀无赦
- 2021-03-11 23:15
CDC :Defines a class of device-context objects. (设备上下文对象)
CBitmap : 位图对象类。
HDC :display device context handle (显示设备上下文句柄)
你可以把CBitmap理解成画布,把HDC理解成固定画布的画板(画板即MFC的窗体),
CDC 则是一个拥有一块画布,一个画板的对象。CDC相当是把画布和画板联系在了一起,即所谓上下文对象,怎么在画布上作画呢?CDC封装了这些接口。
什么叫内存DC呢?即是在同一块画板上拥有多张画布,当然只有一张画布被固定在画板上(即窗体上能看到的图像就是这张画布)。我们可以使用BitBlt接口将其他画布贴在这块画板上。
所以创建一个内存兼容DC的步骤如下:
1.创建内存兼容DC对象。(调用CreateCompatibleDC(HDC hdc
),必须指定是谁(HDC hdc)的兼容DC,)
2..为内存兼容DC对象创建一块画布。(调用SelectObject())
3.在画布上作画。(调用类似CDC::TextOut()等方法进行作画)
4.将画布上的内容贴在要显示的窗体上。(调用BitBlt等方法进行贴图)
追问:不要用MFC
我使用的全是SDK
1创建桌面兼容DC,
m_hDC=CreateCompatibleDC(NULL);
2,创建兼容位图:,并选入DC
m_hBitMap=CreateCompatibleBitmap(GetDC(0),200,200);
SelectObject(m_hDC,m_hBitMap);
3.用颜色填充DC
FillRect(m_hDC,&rect,CreateSolidBrush(RGB(200,1,1)));
4,将DC拷贝到窗口和桌面
int i=BitBlt(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY); 没效果
拷贝到桌面则是一堆麻点...
CBitmap : 位图对象类。
HDC :display device context handle (显示设备上下文句柄)
你可以把CBitmap理解成画布,把HDC理解成固定画布的画板(画板即MFC的窗体),
CDC 则是一个拥有一块画布,一个画板的对象。CDC相当是把画布和画板联系在了一起,即所谓上下文对象,怎么在画布上作画呢?CDC封装了这些接口。
什么叫内存DC呢?即是在同一块画板上拥有多张画布,当然只有一张画布被固定在画板上(即窗体上能看到的图像就是这张画布)。我们可以使用BitBlt接口将其他画布贴在这块画板上。
所以创建一个内存兼容DC的步骤如下:
1.创建内存兼容DC对象。(调用CreateCompatibleDC(HDC hdc
),必须指定是谁(HDC hdc)的兼容DC,)
2..为内存兼容DC对象创建一块画布。(调用SelectObject())
3.在画布上作画。(调用类似CDC::TextOut()等方法进行作画)
4.将画布上的内容贴在要显示的窗体上。(调用BitBlt等方法进行贴图)
追问:不要用MFC
我使用的全是SDK
1创建桌面兼容DC,
m_hDC=CreateCompatibleDC(NULL);
2,创建兼容位图:,并选入DC
m_hBitMap=CreateCompatibleBitmap(GetDC(0),200,200);
SelectObject(m_hDC,m_hBitMap);
3.用颜色填充DC
FillRect(m_hDC,&rect,CreateSolidBrush(RGB(200,1,1)));
4,将DC拷贝到窗口和桌面
int i=BitBlt(hDC,0,0,m_BITMAP.bmWidth,m_BITMAP.bmHeight,m_hDC,0,0,SRCCOPY); 没效果
拷贝到桌面则是一堆麻点...
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯