×

createcompatibledc pati ate

createcompatibledc(CreateCompatibleBitmap生成的图片都是黑色的吗)

admin admin 发表于2022-09-05 22:34:46 浏览158 评论0

抢沙发发表评论

本文目录

CreateCompatibleBitmap生成的图片都是黑色的吗


首先,用CreateCompatibleBitmap生成的位图不一定是黑白的。这取决于与它兼容的DC格式。
其次,猜一下,你是不是在前面调用了CreateCompatibleDC函数,然后再没有调用SelectObject的情况下就紧接着调用了CreateCompatibleBitmap?如果是,这就是问题的关键。
第三,该怎么解决,我想你应该明白了。表达能力有限,只能说这些了,不好意思。

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));//填充背景(颜色为黄色)
然后点击完左键就是黄色的了。

MFC中CreateCompatibleDC是什么意思


你首先明白DC的含义,Windows不允许程序员直接访问硬件,它对屏幕的操作是通过环境设备,也就是DC来完成的。屏幕上的没一个窗口都对应一个DC,可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。
下面是一个代码段:不长
hDeskTop = GetDesktopWindow();

hDeskTopDC = GetDC(hDeskTop);//桌面窗口DC

hMemDC = CreateCompatibleDC(hDeskTopDC);//这建立的就是与桌面窗口兼容的DC。
-pati

CreateCompatibleBitmap菜鸟问题


CreateCompatibleDC
CreateCompatibleBitmap
均创建了内存实体。
使用SelectObject 会将 bmp(或其它对象)选入dc中,返回旧的对象句柄hOldObj。使用完成以后要selectobject(hOldObj)恢复旧的设备对象。
在使用
DeleteObject,删除hNewBmp,hNewDc;
你的情况是未使用 SelectObject (hOldObj),恢复旧对象。
-ate

请教一下为什么有些时候不需要用CreateCompatibleDC转成兼容DC呢


在图形处理的时候,为了避免画面闪烁,有时是为了图形叠加,常常需要在内存中开辟一个缓冲区,也就是定义一个临时DC,将所有内容先绘制到这个临时的DC中,绘制完毕后,将临时DC中的数据转移到真正的DC中。为了保证内存中的临时DC与真实的DC一致,就需要
CreateCompatibleDC
函数。
如果没有上面提到的两种需求,那么可以将信息直接输出到真实DC中,也就不需要那个函数了。
-pati

如何使用VC画图


画线和形状
使用CPen设置线条颜色,类型,宽度
使用CBrush设置形状的填充颜色,花纹等
使用pDC-》LineTo,pDC-》Ellipse等画线,图形
参考代码如下:
CDC *pDC=GetDC();

CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
pDC-》SelectObject(&pen);

CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
pDC-》SelectObject(&brush);

pDC-》LineTo(100,100);
pDC-》Ellipse(CRect(0,0,100,100));

pen.DeleteObject();//需要释放
brush.DeleteObject();//需要释放
画图像
使用CBitmap载入位图图像
在内存DC中画位图
将内存DC贴到目标DC
可以使用BITMAP获取bitmp的一些属性,如长宽
参考代码如下:
CDC *pDC=GetDC();

/*
CRect r;
GetClientRect(&r);
pDC-》FillRect(&r,NULL);//填充背景
*/

CDC memdc;
memdc.CreateCompatibleDC(pDC);

CBitmap cbmp;
cbmp.LoadBitmap(IDB_BITMAP1);
memdc.SelectObject(&cbmp);

BITMAP bmp;
long width,height;
cbmp.GetBitmap(&bmp);
width = bmp.bmWidth;
height = bmp.bmHeight;

pDC-》StretchBlt(0,0,(int)(width*1.5),(int)(height*1.5),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
-ate

CreateCompatibleDC()和GetDC()区别在哪里


getdc();该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在gdi函数中使用该句柄来在设备上下文环境中绘图。
createcompatibledc(pdc);该函数创建一个与指定设备兼容的内存设备上下文环境(dc)。通过getdc()获取的hdc直接与相关设备沟通,而本函数创建的dc,则是与内存中的一个表面相关联。
以上来自百度百科;
一般用来做双缓冲,防止屏幕刷新闪烁
-pati

提示:本地函数定义是非法的,有谁可以帮我看看吗


错误消息
“function”: 本地函数定义是非法的
代码试图在函数内定义函数。
或者,在该 C2601 错误位置前的源代码中有一个额外的大括号。
下面的示例生成 C2601:
复制代码
// C2601.cpp
int main() {
int i = 0;
void funcname(int j) { // C2601
j++;
}
}

把你的代码试了一下,好像这两个原因都不是,你自己仔细查查。。。
-ate

VC中this的用法


this:指向当前对象的指针,并没什么特别的
如果不用这个关键字,怎么取当前对象的指针呢...?
上述代码中的this指向当前CDDBTestView类的对象,仅此而已
我觉得
this关键字
多数情况可用也可不用,因为在
类函数
中访问成员一般并不需要加上这个关键字,除非是有局部变量或参数名字和类
成员变量
一样,就需要加this以示区分,如下是完整代码示例:
#include
《iostream》
class
A{
int
v;
public:
A(){v=3;}
void
Set(int
v){
std::cout《《“this-》v:“《《this-》v《《“\nv:“《《v《《’\n’;
this-》v=v;
}
};
int
main(){
A
a;
a.Set(4);
return
0;
}
-pati