盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

使用VC++开发ASP图像处理组件

时间:2025/3/10作者:未知来源:盾怪网教程人气:

[摘要]作者:符文科 (龙飞) 发布时间: 2004-04 作者:符文科 西北师范大学2001级计算机成人专升本E-Mail vc@hahame.net 联系方式: 13359319378 0931-855...
作者:符文科 (龙飞)

发布时间: 2004-04 作者:符文科 西北师范大学2001级计算机成人专升本
E-Mail vc@hahame.net 联系方式: 13359319378 0931-8553848
网站 http://www.ourcode.net


代码下载:http://www.nwnu.net/src/XTAspImage_to_vckbase.rar

一 VC++中的DC环境及GUI有关的各种对象
在Windows中有各种图形用户界面GUI(Graphics User Interface)对象,当我们在进行绘图时就需要利用这些对象。而各种对象都拥有各种属性,下面首先介绍几种GUI对象和拥有的属性。
(一) GUI有关的各种对象
在Windows中有各种图形用户界面GUI(Graphics User Interface)对象,当我们在进行绘图时就需要利用这些对象。而各种对象都拥有各种属性,下面首先介绍几种GUI对象和拥有的属性。

字体对象CFont
字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。
刷子CBrush对象
刷子CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。也可以利用8*8的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。
画笔CPen
画笔CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。
位图CBitmap对象
位图CBitmap对象可以包含一幅图像,可以保存在资源中。
CPalette调色板
CPalette调色板是一种颜色映射接口,它允许应用程序在不影响其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。

此外系统中还拥有一些库存GUI对象,你可以利用CDC::SelectStockObject(SelectStockObject( int nIndex )选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。 如:
BLACK_BRUSH 黑色刷子
NULL_BRUSH 空刷子
WHITE_PEN 白色画笔
DEVICE_DEFAULT_FONT 默认字体

在Windows中使用GUI对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:

OnDraw(CDC* pDC)
{
a) CPen pen1,pen2;
b) pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建画笔对象一
c) pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建画笔对象二
d) CPen* pOldPen=(CPen*)pDC->SelectObject(&pen1);//选择对象进DC
e) drawWithPen1...
f) (CPen*)pDC->SelectObject(&pen2);//选择对象进DC
g) drawWithPen2...
h) pen1.DeleteObject();//再次创建前先销毁
i) pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象
j) (CPen*)pDC->SelectObject(&pen1);//选择对象进DC
k) drawWithPen1...
l) pDC->SelectObject(pOldPen);//恢复
}

OnDraw(CDC* pDC) 函数是VC中最常见的图形输出刷新函数,参数pDC 为CDC类的一个指针,我们通过它进行画图操作。

代码a行定义CPen 类的两个画笔对象pen1,pen2, 分别在行b,c 调用CPen 类成员函数CreatePen 创建两个实心画笔, 其颜色RGB值分别为RGB(128,128,128), RGB(128,128,0)。行d 将新创建的画笔pen1选入当前设备上下文DC环境并将旧画笔保存在pOldPen里,这样在e行输出的图形或文本线条将以pen1的属性填充。f, g 行选入画笔二并输出。i , j 行销毁画笔一并且创建RGB(0,0,0)色的画笔,k行输出。最后一行l行将旧画笔选入当前DC环境,输出完毕。

字体对象,刷子对象及位图对象的使用方法同上,具体使用将在下面的实例中描述。

在绘图时都需要一个DC对象,DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。

(二)DC环境下输出文本
在MFC里有一个设备环境类CDC封装了有关对物理设备的输出。
CDC是设备环境类的基类直接由CObject派生。是图形设备接口的关键元素,它代表了物理设备。每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。例如OnDraw函数的pDC->TextOut(0,0,"Hello");既可以适用于显示器、还可以适用于打印预览和打印,只需要在CView::OnDraw函数的pDC参数指向不同的对象类。
CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。CWindowDC一般应用在框架窗口,而不是视图窗口。
CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。下面程序段实现在DC环境下输出文本。

long CImg::OutImgFromText(LPCTSTR vFileName,
LPCTSTR lpText,
LPCTSTR lpBgImg,
long lCSet,
LPCTSTR lpFont,
long lWidth,
long lHeight,
long lLeft,
long lTop,
long llfHeight,
long lWeight,
long l3D)
{
i. m_nWidth = lWidth;
ii. m_nHeight = lHeight;

iii. if((m_nWidth % 8) != 0)
1. m_nWidth = ((int)(m_nWidth/8) + 1) * 8;

iv. if(m_nWidth < 3 * lLeft)
1. m_nWidth = 3 * lLeft;

v. if(m_nHeight < 3 * lTop)
1. m_nHeight = 3 * lTop;

vi. int nFHeight = llfHeight;
vii. if(0 == nFHeight)
1. nFHeight = 1;

viii. int nRealClientWidth = (m_nWidth - 2 * lLeft);

ix. HDC hDC;
x. hDC = CreateCompatibleDC(NULL);

xi. LOGFONT lf;
xii. memset(&lf,0,sizeof(lf));
xiii. lf.lfCharSet = GB2312_CHARSET;
xiv. lf.lfHeight = nFHeight;
xv. lstrcpy(lf.lfFaceName, lpFont);
xvi. lf.lfPitchAndFamily = 8;
xvii. lf.lfWeight = lWeight;

xviii. HFONT hFont = CreateFontIndirect(&lf);
1. HFONT hOldFont = (HFONT)SelectObject(hDC, hFont); //选入字体


xix. CComBSTR bstrText(lpText);

xx. RECT rectClient = {lLeft, lTop, m_nWidth - lLeft, m_nHeight - lTop};

xxi. ::DrawText(
1. hDC,
2. bstrText.m_str,
3. bstrText.Length(),
4. &rectClient,
5. DT_WORDBREAK

关键词:运用VC++开发ASP图像处理组件




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版