WEB开发网
开发学院软件开发VC 利用VC++开发ASP图像处理组件 阅读

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

 2006-07-23 11:33:38 来源:WEB开发网   
核心提示: (二)、DC环境下输出文本在MFC里有一个设备环境类CDC封装了有关对物理设备的输出,CDC是设备环境类的基类直接由CObject派生,利用VC++开发ASP图像处理组件(3),是图形设备接口的关键元素,它代表了物理设备,如果忘记了删除设备环境对象则会造成内存丢失,下面程序段实现在DC环境

(二)、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|DT_LEFT|DT_CALCRECT
6. ); //计算输出距形
xxii. int nRealHeight = rectClient.bottom + lTop;
xxiii. if(m_nHeight < nRealHeight)
1. m_nHeight = nRealHeight;
xxiv. else
1. rectClient.bottom = m_nHeight - lTop;
xxv. HBITMAP hBitmap;
xxvi. hBitmap = CreateDiscardableBitmap(hDC, m_nWidth, m_nHeight);
xxvii. SelectObject(hDC, hBitmap);
xxviii. //---------------------------------
xxix. HBRUSH hBBg = CreateSolidBrush(RGB(255,255,255));
xxx. RECT rectFull = {0, 0, m_nWidth, m_nHeight};
xxxi. FillRect(hDC, &rectFull, hBBg);
xxxii. if(l3D > 0)
xxxiii. {
1. //SetBkColor(hDC, RGB(200,193,193));
2. SetTextColor(hDC, ::GetSysColor(COLOR_3DDKSHADOW));
3. SetBkMode(hDC, OPAQUE);
xxxiv. }
xxxv. else
xxxvi. {
1. SetBkColor(hDC, RGB(255,255,255));
2. SetTextColor(hDC, RGB(0,0,0));
3. SetBkMode(hDC, TRANSPARENT);
xxxvii. }
xxxviii. ::DrawText(
1. hDC,
2. bstrText.m_str,
3. bstrText.Length(),
4. &rectClient,
5. DT_WORDBREAK
6. ); //输出
xxxix. if(l3D > 0)
xl. {
1. SetTextColor(hDC, ::GetSysColor(COLOR_3DHILIGHT));
2. SetBkMode(hDC, TRANSPARENT);
3. rectClient.left = rectClient.left + l3D;
4. rectClient.top = rectClient.top - 1;
5. rectClient.right = rectClient.right + l3D;
6. rectClient.bottom = rectClient.bottom - 1;
7. ::DrawText(
a) hDC,
b) lpText,
c) wcslen(lpText),
d) &rectClient,
e) DT_WORDBREAK);
xli. }
xlii. SelectObject(hDC, hOldFont);
xliii. DeleteObject(hFont);
xliv. DeleteObject(hBBg);
xlv. SaveDCBmp(hDC, hBitmap, vFileName);
xlvi. //SaveDCJPG(hDC, hBitmap, vFileName);
xlvii. DeleteObject(hBitmap);
xlviii. ::ReleaseDC(NULL, hDC);
xlix. return 0;
}    

此函数功能:通过输入特定长度的文本,输出图像到指定文件

上一页  1 2 3 4 5 6 7  下一页

Tags:利用 VC 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接