中易网

奇了怪了,内存兼容DC无论如何就是画不到窗口,但文件位图DC却可以

答案:3  悬赏:0  
解决时间 2021-03-12 01:41
奇了怪了,内存兼容DC无论如何就是画不到窗口,但文件位图DC却可以
最佳答案
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个都能自己解决.
所以,不管怎样,只要有人能热心回答,就能给我很好的启发.
全部回答
不明白你要做什么,目的是显示还是保存呢。如果是显示,你在DC上直接画就可以了,为什么一定要CreateCompatibleBitmap呢,不理解你的做法。
追问:我要建立一个内存DC,然后在WM_PAINT消息中重画.
直接在DC上画的话,一个是速度慢,另外,
上次做的图也无法保存..
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); 没效果
拷贝到桌面则是一堆麻点...
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
用当初这个词,造一句话。
国民家电维修地址在哪,我要去那里办事
中国古代传统崇尚自然的设计的优缺点
哈尔滨哪里的公园不用门票,而且还能玩 能休息
2015年江苏高考一本录取分是多少
饼丝的添加剂都有哪些
清镇市教育工会在哪里啊,我有事要去这个地方
三相四线制星形电机如何接
以精神为话题600字作文
环法自行车赛几年举行一次?每一次的地点都相
鸿盛房产信息部地址有知道的么?有点事想过去
办信用卡写亲戚朋友的电话要担责吗
久节马桶节水器哪里有买的?
金鼎足浴地址在哪,我要去那里办事
做完系统后电子表格乱码了,怎么办?
推荐资讯
我是一个没有恋爱史的女孩..昨晚我梦见我怀梦
一道小学六年级的奥数题
我家狗狗得狗瘟去世了,我还想再养一只,可以
明春建筑机械修造厂地址在哪,我要去那里办事
西游记里的一首歌
为什么 新买的m2内存卡在电脑上能存进东西 安
台版原来是美男中,高美男真名叫什么???
电动汽车能用点烟器插车充吗
复合材料的研究生好就业吗
栀子,胎菊,黄芪,胖大海,金银花放一起喝有
赛琪牌子怎么样?
小小后生韩国童装馆在哪里啊,我有事要去这个
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?