关于GDI的Bitblt

关于GDI的Bitblt,第1张

CDC::BitBlt

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC pSrcDC, int xSrc, int ySrc, DWORD dwRop );

返回值:函数成功,返回非零值,否则为0。

参数:

x

指定目标矩形左上角的逻辑x坐标。

y

指定目标矩形左上角的逻辑y坐标。

nWidth

指定目标矩形和源位图的宽度(逻辑单位)。

nHeight

指定目标矩形和源位图的高度(逻辑单位)。

pSrcDC

指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅 *** 作,则它必须为NULL。

xSrc

指定源位图左上角的逻辑X坐标。

ySrc

指定源位图左上角的逻辑Y坐标。

dwRop

指定要执行的光栅 *** 作。光栅 *** 作代码定义GDC如何合并输出 *** 作中的颜色,包括当前画刷、可能的源位图和目标位图。下面对dwRop列出光栅 *** 作代码及其描述:BLACKNESS

所有输出变黑。

DSTINVERT

反转目标位图。

MERGECOPY

使用布尔AND *** 作符合并特征与源位图。

MERGEPAINT

使用布尔OR *** 作符合并特征与源位图。

NOTSRCCOPY

拷贝反转源位图到目标。

NOTSRCERASE

反转使用布尔OR *** 作符合并源和目标位图的结果。

PATCOPY

拷贝特征到目标位图。

PATINVERT

使用布尔XOR *** 作符合并目标位图和特征。

PATPAINT

使用布尔OR *** 作符合并反转源位图和特征。用布尔OR *** 作符合并这项 *** 作结果与目标位图。

SRCAND

使用布尔AND *** 作符合并目标像素和源位图。

SRCCOPY

拷贝源位图到目标位图。

SRCERASE

反转目标位图并用布尔AND *** 作符合并这个结果和源位图。

SRCINVERT

使用布尔XOR *** 作符合并目标像素和源位图。

SRCPAINT

使用布尔OR *** 作符合并目标像素和源位图。

WHITENESS

所有输出变白。 有关光栅 *** 作代码的完整列表,请参阅联机文档“Win32 SDK程序员参考”附录节中的“关于光栅 *** 作代码”。

说明:

从源设备上下文拷贝位图到这个当前设备上下文。

应用可以在字节边界上对齐窗口或客户区域,保证BitBlt *** 作发生在以字节对齐的矩形上(登记窗口类时设置设备CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT标记)。

在字节对齐矩形上的BitBlt *** 作比未经字节对齐的矩形上的BitBlt *** 作快许多。如果想对自己的设备上下文指定字节对齐类风格,必须登记窗口类而不要依赖Microsoft基本类。可使用全局函数AfxRegisterWndClass。

一旦使用目标设备上下文和使用源设备上下文,GDI变形nWidth和nHeight。如果结果延伸不匹配,必要时GDI使用Windows StretchBlt函数压缩或拉伸源位图。

如果目标、源和特征位图颜色格式不同,BitBlt转换源和特征位图以匹配目标。转换中使用目标位图的前景和背景色。

BitBlt函数把单色位图转换为彩色时,它设置白色(1)为背景色,黑色(0)作为前景色。使用目标设备上下文的背景和前景色。要把彩色转换为单色,BitBlt把与背景色匹配的像素设置为白色,其余所有像素设置为黑色。在从彩色到单色的转换中,BitBlt使用彩色设备上下文的前景和背景色。

注意,并非所有的设备上下文都支持BitBlt。为检查给定设备上下文是否支持BitBlt,使用GetDeviceCaps成员函数并指定RASTERCAPS索引。

这种现象我也遇到过,主要的原因是因为窗体上的控件太多,而且过多的设置了控件的Ancher属性,使窗体重绘的控件过多,或者是设置窗体的TransparencyKey的属性,我的解决方案就是用的画虚框的方法,那个程序已经找不着了,给你简单写了个右边框拉伸的,代码如下

//不要设置窗体的TransparencyKey的属性

Rectangle bolderRight;

Rectangle drawRect;

bool draw = false;

int bolderWidth = 4;

int lastWidth = -32000;

private void Form1_Load(object sender, EventArgs e)

{

bolderRight = new Rectangle(thisWidth - bolderWidth, 0, bolderWidth, thisHeight);

drawRect = new Rectangle(thisLocation, thisSize);

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

if (eButton == MouseButtonsLeft || bolderRightContains(eLocation))

{

thisCursor = CursorsSizeWE;

draw = true;

}

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

if (bolderRightContains(eLocation))

thisCursor = CursorsSizeWE;

else

thisCursor = CursorsDefault;

if (draw)

{

if (lastWidth != -32000)//擦出上一次绘制的边框

ControlPaintDrawReversibleFrame(new Rectangle(drawRectLocation, new Size(lastWidth, drawRectHeight)), ColorBlack, FrameStyleDashed);

drawRectWidth = MousePositionX - thisLeft;

ControlPaintDrawReversibleFrame(drawRect, ColorBlack, FrameStyleDashed);

lastWidth = drawRectWidth;

}

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{

draw = false;

ControlPaintDrawReversibleFrame(drawRect, ColorBlack, FrameStyleDashed);

thisSize = drawRectSize;

lastWidth = -32000;

}

private void Form1_Resize(object sender, EventArgs e)

{

bolderRight = new Rectangle(thisWidth - bolderWidth, 0, bolderWidth, thisHeight);

drawRect = new Rectangle(thisLocation, thisSize);

}

using namespace Gdiplus;2 初始化GDI+资源和销毁GDI+资源在项目APP文件中//声明GDI+全局变量ULONG_PTR gdiplusToken;BOOL CMFCAndGDIApp::InitInstance(){// 如果一个运行在 Windows XP 上的应用程序清单指定要

// 使用 ComCtl32dll 版本 6 或更高版本来启用可视化方式,

//则需要 InitCommonControls()。否则,将无法创建窗口。

InitCommonControls();

//GDI+资源初始化

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL); CWinApp::InitInstance(); // 初始化 OLE 库

if (!AfxOleInit()){AfxMessageBox(IDP_OLE_INIT_FAILED);

return FALSE;

}//其他系统自动生成的代码}//添加一个析构函数用来释放GDI+资源CMFCAndGDIApp::~CMFCAndGDIApp(){GdiplusShutdown(gdiplusToken);

}3编译时加入GDIpluslib文件在IDE中选择“项目|添加现有项目”,把GDIpluslib文件添加进来,该文件一般在C:/Program Files/Microsoft Visual Studio NET 2003/Vc7/PlatformSDK/Lib目录下4好了,现在可以在MFC中使用GDI+了void CMFCAndGDIView::OnDraw(CDC /pDC/){CMFCAndGDIDoc pDoc = GetDocument();

ASSERT_VALID(pDoc);if (!pDoc)return; //using GDI+

Graphics myg(this->GetDC()->m_hDC);

Pen pen(Color(255,0,255));

SolidBrush brush(Color(255,0,255));

CRect rect;

分类: 电子数码

解析:

了解什么是句柄就好理解了

就是获得这个窗口的识别代码

句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。

有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一

(如线程句柄,全局的有另一个标识符)。

详细的可分为许多种,都是以H开头的。在VB中使用时全部都用Long。

常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),

文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),

区域句柄(HRGN)等等。

在申请句柄时是要占用资源的,分三类SYSTEM、USER、GDI。

而WINDOWS的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释

放。

>

如果只用VB本身的代码一般是不会用到句柄的,但要是使用API函数的话,

大多数会使用。

再Windows系统中,句柄(我一直觉得这个词翻译得特别别扭)分为三大类:Kernel

Handle、UserHandle和应用程序自定义的Handle。

KernelHandle实际上是进程内Kernel对象的指针表索引,Kernel对象包括进程、文

件、信号等。但是MS为了掩盖着一事实,在系统启动时生成了一个所谓Obsfucator的值

(其实应该是Obfuscator,MicrosoftBugs(R):),生成Handle后将Handle与这个值异

或后返回给应用程序,所以看到的Handle都是一些很大而且毫无意义的数字。这些

Handle和索引的对象是由KRNL32DLL和VMM32VXD共同管理的,所以称之为Kernel

Handle。

UserHandle是用来标示窗口、DC等对象的,他们是真实的指针,但指向的并不是对象

的开头,有一个偏移量。同样,这些对象是由USER32DLL管理的。

第三种Handle不过是应用程序自定义的一些索引之类的东东,具体的意义和应用程序相关

以上就是关于关于GDI的Bitblt全部的内容,包括:关于GDI的Bitblt、Winform改变窗口大小问题、如何在MFC中使用GDI+技术等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9428081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存