SelectObject和DeleteObject函数用法

合集下载

js delete用法

js delete用法

js的delete用法详解
JavaScript中的delete关键字用于删除对象的属性或数组的元素。

以下是delete用法的一些详细解释:
1.删除对象属性
使用delete关键字可以删除对象的属性。

例如:
在上面的例子中,我们创建了一个名为obj的对象,并使用delete关键字删除了它的name属性。

2.删除数组元素
delete也可以用于删除数组的元素。

但是,与对象属性不同,数组元素被删除后,其索引将自动调整,以填补删除元素留下的空位。

例如:
在上面的例子中,我们创建了一个名为arr的数组,并使用delete关键字删除了索引为2的元素。

被删除的元素位置被替换为undefined。

需要注意的是,delete操作不会立即减小数组的长度。

即使删除了数组的元素,数组的长度仍然保持不变,直到该索引位置的元素被替换为其他值或重新分配新的索引。

3.删除全局变量和函数
使用delete关键字可以删除全局变量和函数。

例如:
在上面的例子中,我们创建了一个全局变量x和一个函数myFunc,并使用delete 关键字删除了它们。

需要注意的是,删除全局变量和函数并不会立即从内存中释放它们所占用的空间,而是将其标记为垃圾回收,以便将来进行内存清理。

需要注意的是,虽然delete可以用于删除对象的属性或数组的元素,但在实际开发中,我们应该尽量避免使用它来删除对象的属性或数组的元素,因为这可能会导致一些不可预见的问题。

相反,我们应该使用其他方法来操作对象的属性和数组的元素,例如使用对象字面量语法或数组方法来添加或删除属性或元素。

常用的GDI绘图函数(免费)

常用的GDI绘图函数(免费)
CreateDIBPatternBrushPt 用一幅与设备无关的位图创建一个刷子,以便指定刷子样式(图案)
CreateHatchBrush 创建带有阴影图案的一个刷子(阴影图案见注解)
CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子
GetObjectType 判断由指定句柄引用的GDI对象的类型
SelectObject 每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。一次选入设备场景的只能有一个对象。选定的对象会在设备场景的绘图操作中使用。例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式
ExtCreatePen 创建一个扩展画笔(装饰或几何)
GetStockObject 取得一个固有对象(Stock)。这是可由任何应用程序使用的windows标准对象之一
例1∶创建一个红色实线画笔,画笔宽度为3个像素点
背景模式∶阴影刷子、虚线画笔和文本都有一个背景。对于阴影刷,它是指阴影线之间的区域,对于虚线画笔,则指点和虚线之间的区域。而对于文本,它是指每个字符单元的背景。背景模式决定了WINDOWS如何处理这些背景区。它可以是不透明的,也可以是透明的。若是不透明的,则背景区设置为背景色;否则如果是透明的,则背景区域保持原状。
如果是的话,随便整好了。
OK,以下展示了使用GDI对象的API函数。
函 数 说 明
DeleteObject 用这个函数删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放
GetBkMode 针对指定的设备场景,取得当前的背景填充模式
GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置

CDC类的主要绘图成员函数

CDC类的主要绘图成员函数

CDC类的主要绘图成员函数CDC类中常用绘图函数1)绘制像素函数原型:COLORREF SetPixel(int x,int y,COLORREF crColor );设置某像素点的RGB值2)获取像素颜色函数原型:COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。

参数说明:得到指定像素的RGB颜色值一、画笔函数画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一画笔通常具有线型、宽度和颜色三种属性画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预定义标识符默认的画笔是一个像素单位的黑色实线要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。

1)创建画笔函数原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);返回值:非零。

参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crColor是画笔的颜色。

PS_SOLID;实线;宽度任意指定PS_DASH;虚线;宽度1(不可任意指定)PS_DOT;点线;宽度1(不可任意指定)PS_DASHDOT;点划线;宽度1(不可任意指定)PS_DASHDOTDOT;双点画线;宽度1(不可任意指定)PS_NULL;不可见线;宽度1(不可任意指定)PS_INSIDEFRAME;内框架线;宽度任意指定2)选择画笔函数原型:Cpen *SelectObject(Cpen *pPen);返回值:被替代画笔的指针。

参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。

本函数把原画笔换成新画笔,同时返回指向原画笔的指针。

3)删除画笔函数原型:BOOL DeleteObject( );返回值:非零。

参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。

wps中deleteobject函数

wps中deleteobject函数

wps中deleteobject函数在WPS中,DeleteObject函数用于删除工作簿中的对象,包括图表、图片、自选图形和OLE对象等。

使用DeleteObject函数可以方便地删除不需要的对象,从而精简工作簿、提高工作效率。

下面是关于WPS中DeleteObject函数的详解,共计1200字以上。

一、DeleteObject函数的语法和参数解释:DeleteObject(对象名称)其中,对象名称是要删除的对象的名称。

对象名称可以是一个字符串,也可以是一个对象变量。

二、DeleteObject函数的使用方法:1.删除图表:在WPS的工作表中,我们可以创建各种不同类型的图表,如折线图、柱状图、饼图等。

如果要删除一些图表,可以使用DeleteObject函数。

例如,要删除图表1,可以使用以下代码:DeleteObject("图表 1")2.删除图片:在WPS的工作簿中,我们可以插入图片来进行展示和说明。

如果要删除一些图片,可以使用DeleteObject函数。

例如,要删除名为图片1的图片,可以使用以下代码:DeleteObject("图片 1")3.删除自选图形:在WPS的工作簿中,我们可以插入各种自选图形来进行装饰和标识。

如果要删除一些自选图形,可以使用DeleteObject函数。

例如,要删除名为自选图形1的自选图形,可以使用以下代码:DeleteObject("自选图形 1")4.删除OLE对象:DeleteObject("OLE对象 1")三、DeleteObject函数的使用示例:以删除图表为例,假设我们在WPS的工作表中有一个名为“图表1”的图表,并且我们想删除这个图表。

可以使用以下代码:Sub DeleteChartDeleteObject("图表 1")End Sub在上述示例中,首先定义了一个名为DeleteChart的子过程,然后在子过程中调用DeleteObject函数,将要删除的对象名称设置为"图表 1"。

getobject deleteobject -回复

getobject deleteobject -回复

getobject deleteobject -回复“getobject deleteobject" 是一个非常基础的程序命令,它在许多编程语言中都有使用到。

本文将深入探讨这些命令的含义、用法和实际应用场景,帮助读者更好地理解并学会如何运用它们。

首先,我们来分别解释一下"getobject" 和"deleteobject" 这两个命令。

1. "getobject" 命令"getobject" 是一个用于获取(或提取)对象的命令。

在编程中,对象是指一种数据类型,它可以包含多个属性和方法。

通过使用"getobject" 命令,程序可以从内存中检索出特定的对象,并将其保存到一个变量中以供后续操作使用。

"getobject" 命令的一般语法如下:getobject <object_name> [from <source>]其中,"<object_name>" 表示要获取的对象的名称,而"[from<source>]" 可选部分表示对象所在的来源(如数据库、文件等)。

下面是一个具体的例子,来演示"getobject" 命令的应用:pythoncustomer = getobject "John Smith" from database# 获取名为"John Smith" 的顾客对象,并保存到名为"customer" 的变量中在这个例子中,程序通过"getobject" 命令从数据库中获取了一个名为"John Smith" 的顾客对象,并将其保存到了"customer" 变量中。

显示程序实验_实验报告

显示程序实验_实验报告

一、实验目的1. 了解显示程序的基本原理和实现方法。

2. 掌握使用C语言编写显示程序的基本步骤。

3. 熟悉计算机显示系统的组成和功能。

4. 培养实际编程能力,提高动手操作能力。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 显示器:普通显示器三、实验原理显示程序是指将计算机中的数据以图形或文字形式展示在显示器上的程序。

在计算机系统中,显示程序主要涉及以下原理:1. 图形显示原理:通过将图像数据转换成显示器可以识别的信号,驱动显示器显示图像。

2. 文字显示原理:通过字符编码将文字信息转换成显示器可以识别的信号,驱动显示器显示文字。

四、实验步骤1. 创建一个新的C语言项目,命名为“显示程序实验”。

2. 在项目文件夹中创建一个名为“display.c”的源文件。

3. 在“display.c”文件中编写以下代码:```c#include <stdio.h>#include <windows.h>int main() {// 创建一个窗口HWND hwnd = CreateWindow("static", "显示程序实验",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, NULL, NULL);ShowWindow(hwnd, SW_SHOW);// 创建一个设备上下文HDC hdc = GetDC(hwnd);// 创建一个画笔HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));// 选择画笔SelectObject(hdc, hPen);// 绘制矩形Rectangle(hdc, 100, 100, 300, 300);// 绘制文字TextOut(hdc, 50, 50, "Hello, World!", strlen("Hello, World!")); // 释放画笔DeleteObject(hPen);// 释放设备上下文ReleaseDC(hwnd, hdc);// 等待用户关闭窗口MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}```4. 编译并运行程序,观察显示效果。

【Windows编程】系列第五篇:GDI图形绘制

【Windows编程】系列第五篇:GDI图形绘制上两篇我们学习了以及,知道如何⽤常见Win32输出⽂本字符串,这⼀篇我们来学习Windows编程中另⼀个⾮常重要的部分GDI图形绘图。

Windows的GDI函数包含数百个API可供我们使⽤,本篇把最常⽤的GDI绘图做⼀个讲解。

GDI可以绘制点、直线曲线、填充封闭区域、位图以及⽂本,其中⽂本部分已经在上⼀篇中将了,请参考。

跟前⾯的GDI对象⼀样,本篇的这些绘图函数也必须要设备上下⽂句柄(HDC)作为函数参数,从前⽂我们知道,HDC可以在处理WM_PAINT的时候⽤BeginPaint函数获取,也可以从GetDC、GetWindowDC拿到。

既然是画图,就少不了颜⾊的描述,Windows中的颜⾊有⼏种表⽰,其中COLORREF在GDI绘制中⽤的最多,它实际上是⼀个⽆符号32为整型。

其中红、绿、蓝各占⼀个字节,最⾼字节不使⽤,如下图所⽰:该值可以⽤Windows提供的RGB宏来⽣成,Windows中RGB的定义为:#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))除此之外,Windows还有结构体RGBQUAD也表⽰颜⾊,这种⼀般⽤于位图结构信息中。

画像素点Windows提供了SetPixel和GetPixel函数来设定和获取像素点的颜⾊。

函数原型为:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);该函数并不常使⽤。

画笔画刷在图形绘制之前,可以创建画笔给后续的画图使⽤,创建画笔的API函数为:HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);HBRUSH CreateSolidBrush(COLORREF crColor);HBRUSH CreatePatternBrush(HBITMAP hbmp);HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);它可以指定画笔风格,宽度和颜⾊。

delete函数用法

delete函数详解1. 定义delete函数是一种用于删除指定位置或范围的元素的方法。

它可以用于删除数组、字符串和对象中的元素。

delete函数返回一个布尔值,表示删除成功与否。

2. 用途delete函数主要用于以下几个方面:•删除数组中的元素•删除字符串中的字符•删除对象中的属性3. 工作方式3.1 删除数组中的元素在删除数组元素时,delete函数会将指定位置的元素设置为undefined,并不会改变数组的长度。

例如:let arr = [1, 2, 3, 4, 5];delete arr[2];console.log(arr); // [1, 2, undefined, 4, 5]可以看到,第3个位置上的元素被设置为了undefined。

3.2 删除字符串中的字符在删除字符串中的字符时,delete函数同样会将指定位置上的字符设置为undefined,并不会改变字符串的长度。

例如:let str = "Hello World";delete str[6];console.log(str); // "Hello W rld"可以看到,第7个位置上的字符被设置为了undefined。

需要注意的是,使用delete删除字符串中某个字符后,并不能改变字符串本身,只能改变指定位置上的字符。

3.3 删除对象中的属性在删除对象属性时,delete函数会完全删除该属性。

例如:let obj = { name: "Alice", age: 20 };delete obj.age;console.log(obj); // { name: "Alice" }可以看到,对象中的age属性被成功删除。

需要注意的是,delete函数只能删除对象自身的属性,不能删除继承来的属性。

并且,delete函数无法删除那些被定义为不可配置(non-configurable)的属性。

VBA调用API实现屏幕截图和图像处理的实例

VBA调用API实现屏幕截图和图像处理的实例在Excel中使用Visual Basic for Applications(VBA)编程语言,可以实现许多功能,包括屏幕截图和图像处理。

通过调用应用程序编程接口(API),我们可以实现更高级的图像处理任务,以及捕捉屏幕上的特定区域。

本文将介绍如何使用VBA调用API实现屏幕截图和图像处理的实例。

第一部分:调用API实现屏幕截图在VBA中,我们可以使用API函数来捕捉屏幕上的特定区域,并保存为图像文件。

以下是实现这一功能的步骤:1. 在VBA编辑器中,在代码窗口中插入一个新的模块,以便编写我们的代码。

2. 在模块中添加以下代码,以声明我们将要使用的API函数:```vbaDeclare PtrSafe Function BitBlt Lib "gdi32" _(ByVal hDestDC As LongPtr, ByVal x As Long, ByVal y As Long, ByValnWidth As Long, ByVal nHeight As Long, _ByVal hSrcDC As LongPtr, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongDeclare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtrDeclare PtrSafe Function ReleaseDC Lib "user32" (ByVal hwnd As LongPtr, ByVal hDC As LongPtr) As LongDeclare PtrSafe Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As LongPtr) As LongPtrDeclare PtrSafe Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As LongPtr, ByVal nWidth As Long, ByVal nHeight As Long) As LongPtrDeclare PtrSafe Function SelectObject Lib "gdi32" (ByVal hDC As LongPtr, ByVal hObject As LongPtr) As LongPtrDeclare PtrSafe Function DeleteDC Lib "gdi32" (ByVal hDC As LongPtr) As LongPtrDeclare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As LongPtr) As LongPtrDeclare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long```3. 添加以下代码,在一个按钮的点击事件中触发屏幕截图:```vbaSub CaptureScreen()Dim hWnd As LongPtrDim hDC As LongPtrDim hWinDC As LongPtrDim hBitmap As LongPtrDim lWidth As LongDim lHeight As LonghWnd = GetDesktopWindow()hDC = GetDC(hWnd)lWidth = GetSystemMetrics(0)lHeight = GetSystemMetrics(1)hWinDC = CreateCompatibleDC(0)hBitmap = CreateCompatibleBitmap(hDC, lWidth, lHeight)SelectObject hWinDC, hBitmapBitBlt hWinDC, 0, 0, lWidth, lHeight, hDC, 0, 0, SRCCOPYDeleteDC hWinDCReleaseDC hWnd, hDCSavePicture hBitmap, "C:\Screenshot.jpg"DeleteObject hBitmapMsgBox "截图已保存在C盘根目录下的Screenshot.jpg文件中。

在C#中使用GDI的简单总结

在C#中使⽤GDI的简单总结在C#中使⽤GDI的简单总结在C#默认⽀持的是GDI+库,使⽤GDI+库,有很丰富的函数和排版⼿段,可以满⾜⼤部分的要求.除⾮,你需要使⽤bitmap字体,GDI+对于字体的⽀持有很⼤限制,⽀持truetype字体,⽽对于点阵字体(栅格字体)则不再⽀持,但是很多字体都是这种点阵字体,这样就带来⼀个问题,使⽤不了了.⽽很多公司则会⾃⼰制作某些⽤途的字体,⽐如说在LED显⽰屏上使⽤,这个时候使⽤GDI+则不再是⼀个明智的选择了.此外GDI+虽然强⼤,但是经过测试发现效率却是低下,速度⽐GDI慢了不少.但是CS的界⾯开发环境和编码习惯⼜很适合,所以⽐较折衷的解决⽅法是使⽤C#调⽤系统的gdi api函数实现编程.⾸先C#环境中的color结构是AARRGGBB,⽽在win32的颜⾊结构却是AABBGGRR,所以如果不注意则会使到颜⾊出现偏差或者逆转.在.net环境的类库当中,在system.drawing的命名空间中有ColorTranslator.ToWin32()这个函数,来对color结构转换成win32的api使⽤的颜⾊结构.GDI中⽐较重要的函数,gdi函数基本都是来之⼀个dll. Gdi32.dll[DllImport("gdi32.dll")]public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);[DllImport("GDI32.dll")]public static extern bool DeleteObject(IntPtr objectHandle);[DllImport("gdi32.dll")]public static extern bool FillRgn(IntPtr hdc, IntPtr hrgn, IntPtr hbr);[DllImport("gdi32.dll")]public static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect,int nBottomRect);[DllImport("gdi32.dll")]public static extern IntPtr CreateSolidBrush(Int32 crColor);[DllImport("gdi32.dll")]public static extern int SetBkMode(IntPtr hdc, int iBkMode);public const int TRANSPARENT = 1;public const int OPAQUE = 2;[DllImport("gdi32.dll")]static extern uint SetBkColor(IntPtr hdc, int crColor);[DllImport("gdi32.dll")]static extern uint SetTextColor(IntPtr hdc, int crColor);[DllImport("gdi32", EntryPoint = "CreateFontW", CharSet = CharSet.Auto)]static extern IntPtr CreateFontW([In] Int32 nHeight,[In] Int32 nWidth,[In] Int32 nEscapement,[In] Int32 nOrientation,[In] FontWeight fnWeight,[In] Boolean fdwItalic,[In] Boolean fdwUnderline,[In] Boolean fdwStrikeOut,[In] FontCharSet fdwCharSet,[In] FontPrecision fdwOutputPrecision,[In] FontClipPrecision fdwClipPrecision,[In] FontQuality fdwQuality,[In] FontPitchAndFamily fdwPitchAndFamily,[In] String lpszFace);[DllImport("gdi32.dll")]public static extern int GetTextFace(IntPtr hdc, int nCount,[Out] StringBuilder lpFaceName);public const Int32 LF_FACESIZE = 32;[DllImport("gdi32.dll", ExactSpelling = true)]public static extern bool BitBlt(IntPtr hdcDest, // ⽬标设备的句柄int nXDest, // ⽬标对象的左上⾓的X坐标int nYDest, // ⽬标对象的左上⾓的Y坐标int nWidth, // ⽬标对象的矩形的宽度int nHeight, // ⽬标对象的矩形的长度IntPtr hdcSrc, // 源设备的句柄int nXSrc, // 源对象的左上⾓的X坐标int nYSrc, // 源对象的左上⾓的X坐标TernaryRasterOperations dwRop // 光栅的操作值);[DllImport("gdi32.dll")]public static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,int nWidthDest, int nHeightDest,IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,TernaryRasterOperations dwRop);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextExtentPoint(IntPtr hdc, string lpString,int cbString, ref Size lpSize);[DllImport("Gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);[DllImport("gdi32.dll")]public static extern bool GetCharABCWidthsFloatW(IntPtr hdc, uint iFirstChar, uint iLastChar, [Out] ABCFloat[] lpABCF);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool TextOutW(IntPtr hdc, int nXStart, int nYStart,string lpString, int cbString);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetCharWidth32(IntPtr hdc, uint iFirstChar, uint iLastChar,[Out] int[] lpBuffer);[DllImport("user32.dll", CharSet = CharSet.Unicode)]public static extern int DrawText(IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, dwDTFormat wFormat);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern IntPtr CreateCompatibleDC(IntPtr hdc);[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]static extern bool DeleteDC(IntPtr hdc);这些都是在GDI中⽐较常⽤的函数,其中SelectObject,和DeleteObject更是关键,在GDI的使⽤中最容易出现的问题就是内存泄漏,很多时候是因为没有正确释放资源引起的.所以需要特别⼩⼼,在GDI中释放资源使⽤DeleteObject这个函数来释放.下⾯来实现⼀些具体的函数////// 填充特定DC的⼀个区域的特定颜⾊////// 给定DC/// 给定区域/// 给定颜⾊public static void FillRect(IntPtr hdc, Rectangle Rect, Color FillColor){IntPtr fillBrush = CreateSolidBrush(ColorTranslator.ToWin32(FillColor));IntPtr rectR = CreateRectRgn(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);FillRgn(hdc, rectR, fillBrush);DeleteObject(rectR);DeleteObject(fillBrush);}这个函数实现对⼀个区域填充⼀个颜⾊, 当中创建了画笔,创建了区域,然后最后,当然还要记得释放两者占⽤的资源.创建字体函数public static IntPtr CreatFont(String FontName, Int32 Height, FontStyle Style){IntPtr Result;// = IntPtr.Zero;FontWeight boldWeight = FontWeight.FW_NORMAL;Boolean Italic = false;Boolean Underline = false;Boolean Bold = false;if ((Style & FontStyle.Bold) != 0){Bold = true;}if ((Style & FontStyle.Italic) != 0){Italic = true;}if ((Style & FontStyle.Underline) != 0){Underline = true;}if (Bold){boldWeight = FontWeight.FW_BOLD;}Result = CreateFontW(Height, 0, 0, 0, boldWeight, Italic, Underline, false,FontCharSet.DEFAULT_CHARSET, FontPrecision.OUT_DEFAULT_PRECIS,FontClipPrecision.CLIP_DEFAULT_PRECIS, FontQuality.DRAFT_QUALITY,FontPitchAndFamily.DEFAULT_PITCH, FontName);return Result;}在.net中,默认的字体类,不⽀持点阵字体,所以要使⽤CreateFontW这个函数来创建⾃⼰的字体资源,其中⼤部分的选项都试⽤默认值即可.然后就是设置画板字体,在GDI环境中,DC是带着字体的,⽽不像GDI+那样⼦是分离的,所以经常需要设置不同的字体public static IntPtr SetCanvasFont(IntPtr hdc, ApiFont NewFont){IntPtr FontPtr = CreatFont(, NewFont.Size, NewFont.Style);IntPtr OldPtr = SelectObject(hdc, FontPtr);DeleteObject(OldPtr);return OldPtr;}这个函数,将DC原来的字体资源释放掉,这样的实现会带来⼀个新的问题,因为⼀般来说都需要将DC原来的字体资源再通过selectobject函数放回去,然后将新的字体资源释放掉.所以这个函数是要⼩⼼使⽤的.所以就有了第⼆个版本public static IntPtr SetCanvasFontNotDelete( IntPtr hdc, ApiFont NewFont ){IntPtr FontPtr = CreatFont(, NewFont.Size, NewFont.Style);IntPtr OldPtr = SelectObject(hdc, FontPtr);return OldPtr;}这样⼦就可以⼿动的释放资源,但是需要特别注意,的是⼀定要记得释放掉字体资源.⼀般的使⽤画图的步骤IntPtr pTarget = e.Graphics.GetHdc();IntPtr pSource = CreateCompatibleDC(pTarget);IntPtr pOrig = SelectObject(pSource, drawBmp.GetHbitmap());GDIApi.StretchBlt(pTarget, 0, 0, this.Width, this.Height, pSource, 0, 0, drawWidth, drawHeight, TernaryRasterOperations.SRCCOPY);IntPtr pNew = SelectObject(pSource, pOrig);DeleteObject(pNew);DeleteDC(pSource);e.Graphics.ReleaseHdc(pTarget);这样⼦就可以将drawBmp画到e.graphics上⾯了.最重要的是后⾯释放掉资源,否则内存的泄漏速度是很厉害的.我的软件每次重画就有7M左右的泄漏.⼀下⼦从⼗⼏M的内存上升到⼏百M的内存占⽤[DllImport("gdi32.dll")]public static extern int SetBkMode( IntPtr hdc, int iBkMode );public const int TRANSPARENT = 1;public const int OPAQUE = 2;这个函数是设置透明度的,参数2如果为1则是透明,2则是不透明.不透明的话,将字符串画上去的时候,会有⽩⾊的背景.⼀般来说设为透明.获取字符或者字体的信息函数[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextExtentPoint( IntPtr hdc, string lpString,int cbString, ref Size lpSize );[DllImport("Gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetTextMetrics( IntPtr hdc, out TEXTMETRIC lptm );[DllImport("gdi32.dll")]public static extern bool GetCharABCWidthsFloatW( IntPtr hdc, uint iFirstChar, uint iLastChar, [Out] ABCFloat[] lpABCF );[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool GetCharWidth32( IntPtr hdc, uint iFirstChar, uint iLastChar,[Out] int[] lpBuffer );这⼏个函数都可以获取字体或者字符串占⽤的空间⼤⼩,⽽⼜各有区别.GetTextExtentPoint可以⽅便的获取⼀个字符串,或者字符串的部分的长度,因为可以通过cbString这个长度来控制获取的范围. GetTextMetrics则是获取⼀个字体的各种⾼度信息,包括height,ascent,descent,还包括字体能够表现的字符范围等等信息. GetCharABCWidthsFloatW则是获取某段连续字符串的abcwidth信息,abcwidth信息在某些情况下,需要特别注意,否则斜体会排版得很难看. GetCharWidth32获取⼀个连续的字符段的宽度信息, 但是根据实践,居然和GetTextExtentPoint获取的信息不⼤⼀致,暂时是少于实际占⽤的空间.使到计算出来的占⽤宽度实际上不⾜以容纳字符串的排版.字符串的描绘这是在gdi操作中⾮常重要的⼀部分,使⽤Gdi是因为需要使⽤特殊字体,⽽字体当然是针对字符串来使⽤的的.所以,这根本就是使⽤gdi的⽬的.常⽤的字符串输出有来个函数[DllImport("gdi32.dll", CharSet = CharSet.Auto)]public static extern bool TextOutW( IntPtr hdc, int nXStart, int nYStart,string lpString, int cbString );[DllImport("user32.dll", CharSet = CharSet.Unicode)]public static extern int DrawText( IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, dwDTFormat wFormat );TextOutW是⼀个⽐较简单的函数,适合⼀般的场合,只需要设置X和Y的坐标即可DrawText,则会控制输出的空间⼤⼩,排版规则.⽐较适合需要精确控制的场所,⼜或者⽐如说输出阿拉伯⽂字的时候,要设置为右对齐.获取系统所有的字体由于C#不⽀持点阵字体,所以⾃然地,使⽤.net提供的函数,获取的安装字体列表⾃然是不包含点阵字体的.所以并不符合我的要求.所以还得使⽤系统的api函数,来获取安装字体列表.private Int32 EnumFontCallBack(ref ENUMLOGFONTEX lpelfe, IntPtr lpntme, int FontType, int lParam){//Debug.WriteLine(lpelfe.elfFullName);if (lpelfe.elfFullName.Substring(0, 1) != "@"){if (!sysFontList.Contains(lpelfe.elfFullName)){sysFontList.Add(lpelfe.elfFullName);}}return 1;}LOGFONT logfont = new LOGFONT();logfont.lfCharSet = FontCharSet.DEFAULT_CHARSET;Bitmap bmp = new Bitmap(10, 10);Graphics g = Graphics.FromImage(bmp);IntPtr hDC = g.GetHdc();EnumFontFamilies.EnumFontFamiliesEx(hDC, logfont, EnumFontCallBack, IntPtr.Zero, 0);g.ReleaseHdc(hDC);g.Dispose();bmp.Dispose();public class EnumFontFamilies{public const int LF_FACESIZE = 32;public delegate int EnumFontExDelegate( ref ENUMLOGFONTEX lpelfe, IntPtr lpntme, int FontType, int lParam );[DllImport("gdi32.dll", EntryPoint = "EnumFontFamiliesEx", CharSet = CharSet.Unicode)]public static extern int EnumFontFamiliesEx( IntPtr hDC, [In] LOGFONT logFont, EnumFontExDelegate enumFontExCallback, IntPtr lParam, uint dwFlags );}其中EnumFontCallBack为回调函数,通过这个回调函数,可以获取到系统所有的字体,包括点阵的字体.附录A:GDI使⽤的结构和常量[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public struct ENUMLOGFONTEX{public LOGFONT elfLogFont;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfFullName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfStyle;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string elfScript;}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class LOGFONT{public int lfHeight;public int lfWidth;public int lfEscapement;public int lfOrientation;public FontWeight lfWeight;[MarshalAs(UnmanagedType.U1)]public bool lfItalic;[MarshalAs(UnmanagedType.U1)]public bool lfUnderline;[MarshalAs(UnmanagedType.U1)]public bool lfStrikeOut;public FontCharSet lfCharSet;public FontPrecision lfOutPrecision;public FontClipPrecision lfClipPrecision;public FontQuality lfQuality;public FontPitchAndFamily lfPitchAndFamily;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string lfFaceName;public override string ToString(){StringBuilder sb = new StringBuilder();sb.Append("LOGFONT\n");sb.AppendFormat(" lfHeight: {0}\n", lfHeight);sb.AppendFormat(" lfWidth: {0}\n", lfWidth);sb.AppendFormat(" lfEscapement: {0}\n", lfEscapement);sb.AppendFormat(" lfOrientation: {0}\n", lfOrientation);sb.AppendFormat(" lfWeight: {0}\n", lfWeight);sb.AppendFormat(" lfItalic: {0}\n", lfItalic);sb.AppendFormat(" lfUnderline: {0}\n", lfUnderline);sb.AppendFormat(" lfStrikeOut: {0}\n", lfStrikeOut);sb.AppendFormat(" lfCharSet: {0}\n", lfCharSet);sb.AppendFormat(" lfOutPrecision: {0}\n", lfOutPrecision);sb.AppendFormat(" lfClipPrecision: {0}\n", lfClipPrecision);sb.AppendFormat(" lfQuality: {0}\n", lfQuality);sb.AppendFormat(" lfPitchAndFamily: {0}\n", lfPitchAndFamily);sb.AppendFormat(" lfFaceName: {0}\n", lfFaceName);return sb.ToString();}}public enum FontWeight : int{FW_DONTCARE = 0,FW_THIN = 100,FW_EXTRALIGHT = 200,FW_LIGHT = 300,FW_NORMAL = 400,FW_MEDIUM = 500,FW_SEMIBOLD = 600,FW_BOLD = 700,FW_EXTRABOLD = 800,FW_HEAVY = 900,}public enum FontCharSet : byte{ANSI_CHARSET = 0,DEFAULT_CHARSET = 1,SYMBOL_CHARSET = 2,SHIFTJIS_CHARSET = 128,HANGEUL_CHARSET = 129,HANGUL_CHARSET = 129,GB2312_CHARSET = 134,CHINESEBIG5_CHARSET = 136,OEM_CHARSET = 255,JOHAB_CHARSET = 130,HEBREW_CHARSET = 177,ARABIC_CHARSET = 178,GREEK_CHARSET = 161,TURKISH_CHARSET = 162,VIETNAMESE_CHARSET = 163,THAI_CHARSET = 222,EASTEUROPE_CHARSET = 238, RUSSIAN_CHARSET = 204,MAC_CHARSET = 77,BALTIC_CHARSET = 186,}public enum FontPrecision : byte{OUT_DEFAULT_PRECIS = 0,OUT_STRING_PRECIS = 1,OUT_CHARACTER_PRECIS = 2, OUT_STROKE_PRECIS = 3,OUT_TT_PRECIS = 4,OUT_DEVICE_PRECIS = 5,OUT_RASTER_PRECIS = 6,OUT_TT_ONLY_PRECIS = 7,OUT_OUTLINE_PRECIS = 8,OUT_SCREEN_OUTLINE_PRECIS = 9, OUT_PS_ONLY_PRECIS = 10,}public enum FontClipPrecision : byte{CLIP_DEFAULT_PRECIS = 0,CLIP_CHARACTER_PRECIS = 1, CLIP_STROKE_PRECIS = 2,CLIP_MASK = 0xf,CLIP_LH_ANGLES = (1 << 4),CLIP_TT_ALWAYS = (2 << 4),CLIP_DFA_DISABLE = (4 << 4),CLIP_EMBEDDED = (8 << 4),}public enum FontQuality : byte{DEFAULT_QUALITY = 0,DRAFT_QUALITY = 1,PROOF_QUALITY = 2, NONANTIALIASED_QUALITY = 3, ANTIALIASED_QUALITY = 4,CLEARTYPE_QUALITY = 5,CLEARTYPE_NATURAL_QUALITY = 6,}[Flags]public enum FontPitchAndFamily : byte{DEFAULT_PITCH = 0,FIXED_PITCH = 1,VARIABLE_PITCH = 2,FF_DONTCARE = (0 << 4),FF_ROMAN = (1 << 4),FF_SWISS = (2 << 4),FF_MODERN = (3 << 4),FF_SCRIPT = (4 << 4),FF_DECORATIVE = (5 << 4),}/// <summary>/// Enumeration for the raster operations used in BitBlt./// In C++ these are actually #define. But to use these/// constants with C#, a new enumeration type is defined./// </summary>public enum TernaryRasterOperations{SRCCOPY = 0x00CC0020, /* dest = source */SRCPAINT = 0x00EE0086, /* dest = source OR dest */SRCAND = 0x008800C6, /* dest = source AND dest */ SRCINVERT = 0x00660046, /* dest = source XOR dest */ SRCERASE = 0x00440328, /* dest = source AND (NOT dest ) */ NOTSRCCOPY = 0x00330008, /* dest = (NOT source) */ NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */ MERGECOPY = 0x00C000CA, /* dest = (source AND pattern) */ MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest */ PATCOPY = 0x00F00021, /* dest = pattern */PATPAINT = 0x00FB0A09, /* dest = DPSnoo */PATINVERT = 0x005A0049, /* dest = pattern XOR dest */ DSTINVERT = 0x00550009, /* dest = (NOT dest) */BLACKNESS = 0x00000042, /* dest = BLACK */WHITENESS = 0x00FF0062, /* dest = WHITE */};[Flags]public enum dwDTFormat : int{DT_TOP = 0, DT_LEFT = 0x00000000, DT_CENTER = 0x00000001, DT_RIGHT = 0x00000002,DT_VCENTER = 0x00000004, DT_BOTTOM = 0x00000008, DT_WORDBREAK = 0x00000010, DT_SINGLELINE = 0x00000020,DT_EXPANDTABS = 0x00000040, DT_TABSTOP = 0x00000080, DT_NOCLIP = 0x00000100, DT_EXTERNALLEADING = 0x00000200, DT_CALCRECT = 0x00000400, DT_NOPREFIX = 0x00000800, DT_INTERNAL = 0x00001000};public struct Rect{public int Left, Top, Right, Bottom;public Rect( Rectangle r ){this.Left = r.Left;this.Top = r.Top;this.Bottom = r.Bottom;this.Right = r.Right;}}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public struct TEXTMETRIC{public Int32 tmHeight;public Int32 tmAscent;public Int32 tmDescent;public Int32 tmInternalLeading;public Int32 tmExternalLeading;public Int32 tmAveCharWidth;public Int32 tmMaxCharWidth;public Int32 tmWeight;public Int32 tmOverhang;public Int32 tmDigitizedAspectX;public Int32 tmDigitizedAspectY;public char tmFirstChar;public char tmLastChar;public char tmDefaultChar; public char tmBreakChar; public byte tmItalic;public byte tmUnderlined; public byte tmStruckOut; public byte tmPitchAndFamily; public byte tmCharSet;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#031 rcText.top = 10;
#032 rcText.right = 300;
#033 rcText.bottom = 40;
#034
#035 //显示字符串在四边形的中间位置.
#036 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
WINGDIAPI HGDIOBJ WINAPI SelectObject(__in HDC hdc, __in HGDIOBJ h); WINGDIAPI BOOL WINAPI DeleteObject( __in HGDIOBJ ho); hDC 是当前设备的句柄。 h,ho 是设备对象,其实它就是内存的地址。
另一列: //////////////////////////////////////////////////
CRect rect; CDC* pDC=GetDC(); GetWindowRect(&rect); CPen spen;
//被选中,显示红色,否则显示灰色 if(bIsSelect)spen.CreatePen(PS_SOLID,3,RGB(0,255,0)); else spen.CreatePen(PS_SOLID,3,RGB(192,192,192)); pDC->SelectObject(&spen); pDC->SelectObject(GetStockObject(NULL_BRUSH));//选择透明填充 pDC->Rectangle(0,0,rect.Width()-3,rect.Height()-3); ReleaseDC(pDC);
////////////////////////////////////////////////// BoundsChecker 发 现有 错误 发 生: Argument 1 in DeleteObject(字 体对 象句 柄 值) is still
selected in to hDC 0x01010058
修改 : //////////////////////////////////////////////////
//字体大小 CFont font; font.CreatePointFont(g_myFont,_T("宋体")); CFont *pOldFont=pDC->SelectObject(&font); GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);//为控件附上字号 pDC->SelectObject(pOldFont); DeleteObject(font);//释放资源 //////////////////////////////////////////////////
#037
DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
#038
#039
#040 rcText.left = 10;
#041 rcText.top = 40;
#042 rcText.right = 300;
#043 rcText.bottom = 80;
#044 //设置透明背景
#045 int nOldMode = SetBkMode(hDC,TRANSPARENT);
#046
#047 //设置新字体.
#048 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
#049
#050 //显示字符串在四边形的中间位置.
调用这个函数的例子如下:
#001 // #002 //界面显示输出.
#003 // #004 //蔡军生 2007/09/01 QQ:9073204 深圳
#005 //
#006 void CCaiWinMsg::OnDraw(HDC hDC)
#007 {
#008 //
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04")); #010 #011 //设置输出字符串的颜色. #012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0)); #013 #014 RECT rcText; #015 rcText.left = 10; #016 rcText.top = 10; #017 rcText.right = 300; #018 rcText.bottom = 80; #019 #020 //创建黑色的画刷, #021 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0)); #022 #023 //用黑色的画刷填充四边形的颜色. #024 FillRect(hDC,&rcText,hbrush); #025 #026 //删除画刷. #027 DeleteObject(hbrush); #028 #029 #030 r1 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
#052
DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
#053 #054 //恢复原来的字体. #055 HGDIOBJ hFont = SelectObject(hDC,hOldFont); #056 DeleteObject(hFont); #057 #058 //恢复原来的模式. #059 SetBkMode(hDC,nOldMode); #060 #061 //恢复原来的颜色. #062 SetTextColor(hDC,crOld); #063 }
//////////////////////////////////////////////// CFont font; font.CreatePointFont(g_myFont,_T("宋体")); GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font); CFont *pOldFont=pDC->SelectObject(&font); DeleteObject(pOldFont);
SelectObject 和 DeleteObject 函数 用法第一个站进入, 快速成为做挂达人。
Windows 显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要 设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用 到这个函数。当你创建一个位图时,这时 Windows 就会在内存里分配一块内存空间,用来 保存位图的数据。
pDC->SelectObject(pSpen); DeleteObject(spen);//释放资源 ReleaseDC(pDC); //////////////////////////////////////////////////
//被选中,显示红色,否则显示灰色 if(bIsSelect)spen.CreatePen(PS_SOLID,3,RGB(0,255,0)); else spen.CreatePen(PS_SOLID,3,RGB(192,192,192)); CPen *pSpen = pDC->SelectObject(&spen); pDC->SelectObject(GetStockObject(NULL_BRUSH));//选择透明填充 pDC->Rectangle(0,0,rect.Width()-3,rect.Height()-3);
当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除, 就会造成内存使用越来越多,最后导到 Windows 这幢大楼倒下来。如果你忘记删除它,就 造成了内存泄漏。因此,当你创建显示设备资源时,一定要记得删除它们啊,否则运行你的 程序越长,就导致系统不稳定。记得使用 DeleteObject 函数去删除它们,把占用的内存释放 回去给系统。 函数 SelectObject 和 DeleteObject 声明如下:
//////////////////////////////////////////////////
修改: ////////////////////////////////////////////////// CRect rect; CDC* pDC=GetDC(); GetWindowRect(&rect); CPen spen;
相关文档
最新文档