Microsoft Visual C++ 6.0中的绘图库文件是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Microsoft Visual C++ 6.0中的绘图库文件是啥相关的知识,希望对你有一定的参考价值。
Microsoft Visual C++ 6.0中的绘图库文件是什么?
里面有什么函数?
每个函数的用法,格式是什么?
最好加上例子。
比如:
line x1,y1,x2,y2(x1、y1是起点坐标,x2、y2是终点坐标)
例子:line 1,1,5,5
这是BASIC里的画线语句,我只是拿出来做个示范。
希望你的回答按这样的方式写,因为我比较笨,只看的懂这样的东东。
最后希望你给出个很简单的可以运行的绘图程序,不要求很好看的图形,但是要让人看就就可以直接仿写绘图程序。
35分已经是我全部的积分了,我是新人,体谅体谅哈。
再加20分,也是最后一次加分。
其实屏幕上显示的在图形在内存中都是一幅像素阵列.
windows中定义了图形设备上下文HDC, 你可以自己定义一个像素阵列(其实上是一幅BMP位图),调用SetDIBitToDevice等API就可以送往HDC(即显示在窗口或屏幕上,根据你所选的HDC). 当然windows GDI也提供了一些简单的绘制基本图形的函数.
HRESULT moveTo( LONG x,LONG y); //起点
LineTo(
HDC hdc,
int nXEnd,
int nYEnd
); //终点
更多查看MSDN
调和这两个就可以画线. 还有好多.
如果你想撒底了解,你可以看<windows图形编程>.
<计算机图形学>
下面是我自己写的一个图形类, 还没写完,画线还没实线, 主要实现了读取bmp位图,图像的拷贝,和图像alpha混合运算,当然也包括屏幕显示.
//CDisplay.h 头文件
#define WIN
#ifdef WIN
#define GETWINDOWSIZE(hwnd,rect) GetWindowRect(hwnd,&rect)
#define GETCLIENTSIZE(hwnd,rect) GetClientRect(hwnd,&rect)
#endif
#pragma pack(4)
/*定义颜色位数*/
enum COLORBPP
BIT16 = 16,
BIT24 = 24,
BIT32 = 32
;
/* 定义混合方式 */
enum MIXMETHOD
ALPHA = 0,
;
/* 定义位图描述结构 */
typedef struct tagBMPDISCRIPT
DWORD bdWidth;
DWORD bdHeight;
LPBYTE bdPixel;
BYTE bdBpp;
BMPDISCRIPT, FAR *LPBMPDISCRIPT, *PBMPDISCRIPT;
/* 定义显示下下文 */
typedef struct tagDISPLAYCONTEXT
BITMAPINFO biDisHeaderInfo;
long biLineGap;
LPBYTE biPixel;
DISPLAYCONTEXT, FAR *LPDISPLAYCONTEXT, *PDISPLAYCONTEXT;
/* 定义如果使用BI_BITFIELDS 的位图头*/
typedef struct tagBITMAPINFOEXTEND
BITMAPINFOHEADER BitMapHeader;
DWORD dwRColor;
DWORD dwGColor;
DWORD dwBColor;
BITMAPINFOEXTEND, FAR *LPBITMAPINFOEXTEND, *PBITMAPINFOEXTEND;
/*定义颜色*/
typedef DWORD COLORERF;
#pragma pack()
/*定义BMP头结构中需设置的成员*/
#define DISCONTEXTHEADERSIZE(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biSize)
#define DISCONTEXTHEADERWIDTH(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biWidth)
#define DISCONTEXTHEADERHEIGHT(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biHeight)
#define DISCONTEXTHEADERPLANES(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biPlanes)
#define DISCONTEXTHEADERBITCOUNT(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biBitCount)
#define DISCONTEXTHEADERCOMPRESSION(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biCompression)
#define DISCONTEXTHEADERSIZEIMAGE(pThis) (((DISPLAYCONTEXT*)pThis)->biDisHeaderInfo.bmiHeader.biSizeImage)
#define DISCONTEXTBUFFER(pThis) (((DISPLAYCONTEXT*)pThis)->biPixel)
#define DISCONTEXTLINEGAP(pThis) (((DISPLAYCONTEXT*)pThis)->biLineGap)
/*定义取色方案*/
#define COLORREF16(r, g, b) (WORD)((b&0x1f)|((g<<5) & 0x3e0)|((r << 11) & 0x7c00))
#define COLORREF24(r, g, b) (DWORD)((b&0xff)|((g<<8) & 0xff00 )|((r << 16 ) & 0xff0000))
#define COLORREF32(r, g, b, a) (DWORD)((b&0xff)|((g<<8) & 0xff00 )|((r << 16 ) & 0xff0000)|((a << 24)&0xff000000))
#define COLORERFTORGB16(color, colorbpp)
#define COLORERFTORGB24(color, colorbpp)
#define COLORERFTORGB32(color, colorbpp)
class CCDisPlay
public:
CCDisPlay()
m_hWnd = NULL;
m_bDisplayContextReady = false;
CCDisPlay(HWND hWnd)
m_hWnd = hWnd;
m_hDC = ::GetDC(m_hWnd);
m_bDisplayContextReady = false;
~CCDisPlay() ::ReleaseDC(m_hWnd, m_hDC);
/*物理文件操作*/
static bool LoadBitMap( char *lpszFileName, LPDISPLAYCONTEXT pDisplayContext );
/*屏幕相关操做*/
void OnDraw( HDC hdc = NULL );
void ClearScreen( COLORERF color );
bool CreateScreenBuffer( COLORBPP bpp );
bool CreateSpecifiedBuffer( int iWidth, int iHeight, COLORBPP bpp, LPDISPLAYCONTEXT pDisContext);
bool Resize();
bool ScreenCopy( int iStartX, int iStartY, int iSourceX, int iSourceY, LPDISPLAYCONTEXT pDisplayContext );
bool ScreenCopy( int iStartX, int iStartY, int iSourceX, int iSourceY, LPDISPLAYCONTEXT pDisplayContext, int iAlpha );
void DestroyScreenBuffer();
/*基本图元操作*/
bool SetPixel( int x, int y, COLORERF color );
bool Line(int x0, int y0, int x1, int y1, COLORERF color);
/*位图混合*/
bool BitmapSrcCopy(LPBMPDISCRIPT pDestDisContext, int iDestX, int iDextY,
int iDestWidth, int iDestHeight,
LPBMPDISCRIPT pSourceContext, int iSourceX, int iSourceY,
int iSourceWidth, int iSourceHeight, MIXMETHOD Method);
protected:
private:
HDC m_hDC;
HWND m_hWnd;
DISPLAYCONTEXT m_DefaultDisContext;
BITMAPINFOEXTEND m_ExtendDisContext; //扩展显示上下文,用于未压缩的16bit,32bit图像
bool m_bDisplayContextReady; //指定显示上下文是否初始化
;
//CDisplay.cpp 文件
#include "stdafx.h"
#include "CDisplay.h"
#pragma warning(disable: 4244)
#pragma warning(disable: 4996)
//true点在矩形内|false点在矩形外
inline bool PointInRetangle(int iPointX, int iPointY, int iRectLeft, int iRectTop, int iRectRight, int iRectBottom)
return (((iPointX >= iRectLeft)&&(iPointX <= iRectRight))
&&((iPointY >= iRectTop)&&(iPointY <= iRectBottom)));
//true相离|false相交
inline bool RetangleInterSection(int x1, int y1, int width1, int height1,
int x2, int y2, int width2, int height2 )
return ( ((x1 + width1 < x2) || (x2 + width2 < x1))
||((y1 + height1 < y2) || ( y2 + height2 < y1)));
/*
读取位图文件
*/
bool CCDisPlay::LoadBitMap( char *lpszFileName, LPDISPLAYCONTEXT pDisplayContext )
FILE *hFile;
BITMAPFILEHEADER bfBitmapFileHeader;
size_t iRetLength = 0;
assert(lpszFileName != NULL);
assert(pDisplayContext != NULL);
if (!lpszFileName||!pDisplayContext)
return false;
hFile = fopen( lpszFileName, "rb");
if(!hFile)
return false;
fseek(hFile, 0L, SEEK_SET);
//读位图文件头
iRetLength = fread( &bfBitmapFileHeader, 1,sizeof(BITMAPFILEHEADER), hFile);
if( iRetLength != sizeof(BITMAPFILEHEADER))
fclose(hFile);
return false;
//读位图描述信息
iRetLength = fread( &(pDisplayContext->biDisHeaderInfo.bmiHeader), 1, sizeof(BITMAPINFOHEADER), hFile);
if( iRetLength != sizeof(BITMAPINFOHEADER))
fclose(hFile);
return false;
//得到扫描线间距
DISCONTEXTLINEGAP(pDisplayContext) = (DISCONTEXTHEADERWIDTH(pDisplayContext) * DISCONTEXTHEADERBITCOUNT(pDisplayContext) + 31)/32 * 4;
//审请位图数据buffer
DISCONTEXTBUFFER(pDisplayContext) = new BYTE[DISCONTEXTLINEGAP(pDisplayContext) * DISCONTEXTHEADERHEIGHT(pDisplayContext)];
if( !DISCONTEXTBUFFER(pDisplayContext))
return false;
fseek(hFile, bfBitmapFileHeader.bfOffBits, SEEK_SET );
//读取像素阵列
iRetLength = fread( DISCONTEXTBUFFER(pDisplayContext), 1, DISCONTEXTLINEGAP(pDisplayContext)
* DISCONTEXTHEADERHEIGHT(pDisplayContext), hFile);
if( iRetLength != DISCONTEXTLINEGAP(pDisplayContext)
* DISCONTEXTHEADERHEIGHT(pDisplayContext))
fclose(hFile);
return false;
return true;
/*
清除屏幕级冲区
*/
void CCDisPlay::ClearScreen( COLORERF color )
int iPixelSize = DISCONTEXTHEADERBITCOUNT( &m_DefaultDisContext) / 8;
BYTE* pColor = 0;
int iOffsetOfLineStart;
BYTE rColor = ((BYTE*)(&color))[0], gColor = ((BYTE*)(&color))[1], bColor = ((BYTE*)(&color))[2];
switch( DISCONTEXTHEADERBITCOUNT( &m_DefaultDisContext))
case BIT16:
for( int i = 0; i < DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext); ++i )
iOffsetOfLineStart = i * DISCONTEXTLINEGAP(&m_DefaultDisContext );
for ( int j = 0; j < DISCONTEXTHEADERWIDTH( &m_DefaultDisContext); ++j)
*(WORD*)(DISCONTEXTBUFFER( &m_DefaultDisContext ) + iOffsetOfLineStart + iPixelSize * j) = color;
break;
case BIT24:
for( int i = 0; i < DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext); ++i )
pColor = (BYTE*)DISCONTEXTBUFFER( &m_DefaultDisContext ) + i * DISCONTEXTLINEGAP(&m_DefaultDisContext );
for ( int j = 0; j < DISCONTEXTHEADERWIDTH( &m_DefaultDisContext); ++j)
*pColor++ = rColor;//, iPixelSize;
*pColor++ = gColor;
*pColor++ = bColor;
break;
case BIT32:
for( int i = 0; i < DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext); ++i )
iOffsetOfLineStart = i * DISCONTEXTLINEGAP(&m_DefaultDisContext );
for ( int j = 0; j < DISCONTEXTHEADERWIDTH( &m_DefaultDisContext); ++j)
*(DWORD*)(DISCONTEXTBUFFER( &m_DefaultDisContext ) + iOffsetOfLineStart + iPixelSize * j) = color;
break;
//default:
// break;
/*
显示到屏幕HDC
*/
void CCDisPlay::OnDraw( HDC hdc )
if( hdc == NULL)
hdc = m_hDC;
//检测绘图上下文是否就绪
if( !m_bDisplayContextReady )
return;
//hdc = GetWindowDC(m_hWnd);
int ret = 0;
switch( DISCONTEXTHEADERBITCOUNT( &m_DefaultDisContext) )
case BIT16:
//16bit带位屏蔽的头
ret = SetDIBitsToDevice( hdc, 0, 0, DISCONTEXTHEADERWIDTH( &m_DefaultDisContext),
DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext), 0, 0,
0, DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext),
(const void*)DISCONTEXTBUFFER( &m_DefaultDisContext ),
(const BITMAPINFO*)&m_ExtendDisContext, DIB_RGB_COLORS );
break;
case BIT24:
//24bit不带位屏蔽的头
ret = SetDIBitsToDevice( hdc, 0, 0, DISCONTEXTHEADERWIDTH( &m_DefaultDisContext),
DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext), 0, 0,
0, DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext),
(const void*)DISCONTEXTBUFFER( &m_DefaultDisContext ),
(const BITMAPINFO*)&m_DefaultDisContext.biDisHeaderInfo, DIB_RGB_COLORS );
break;
case BIT32:
//32bit带位屏蔽的头
ret = SetDIBitsToDevice( hdc, 0, 0, DISCONTEXTHEADERWIDTH( &m_DefaultDisContext),
DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext), 0, 0,
0, DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext),
(const void*)DISCONTEXTBUFFER( &m_DefaultDisContext ),
(const BITMAPINFO*)&m_ExtendDisContext, DIB_RGB_COLORS );
break;
default:
break;
return;
/*===========================================================
@Description 创建屏幕帧缓冲区
@param COLORBPP bpp: 指定位图颜色位数
@return bool: true 成功/false 失败
*///=========================================================
bool CCDisPlay::CreateScreenBuffer( COLORBPP bpp )
RECT rect;
ZeroMemory( &rect, sizeof(rect) );
//得到客户区大小
GETCLIENTSIZE( m_hWnd, rect );
//初始化普通文件头,用于24bit
ZeroMemory( &m_DefaultDisContext, sizeof(m_DefaultDisContext) );
//初始化扩展文件头,用于描述16bit,32bit图像
ZeroMemory(&m_ExtendDisContext, sizeof(BITMAPINFOEXTEND));
//判断创建位图颜色位数
switch( bpp )
//16位分565,和555
case BIT16:
DISCONTEXTHEADERCOMPRESSION( &m_DefaultDisContext ) = BI_BITFIELDS;
//此文件头需批定位屏蔽值
m_ExtendDisContext.dwRColor = 0x7C00;
m_ExtendDisContext.dwGColor = 0x3e0;
m_ExtendDisContext.dwBColor = 0x1f;
break;
case BIT24:
DISCONTEXTHEADERCOMPRESSION( &m_DefaultDisContext ) = BI_RGB;
break;
case BIT32:
DISCONTEXTHEADERCOMPRESSION( &m_DefaultDisContext ) = BI_BITFIELDS;
//此文件头需批定位屏蔽值
m_ExtendDisContext.dwRColor = 255 << 16;
m_ExtendDisContext.dwGColor = 255 << 8;
m_ExtendDisContext.dwBColor = 255;
break;
default:
//位图不在支持这列
assert( bpp == BIT32 );
return false;
break;
//填写位图基本描述信息
DISCONTEXTHEADERSIZE( &m_DefaultDisContext) = sizeof( m_DefaultDisContext.biDisHeaderInfo.bmiHeader );
DISCONTEXTHEADERWIDTH( &m_DefaultDisContext) = abs( rect.right - rect.left );
DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext) = abs( rect.top - rect .bottom );
DISCONTEXTHEADERPLANES( &m_DefaultDisContext) = 1; //位平面数,必须为1
DISCONTEXTHEADERBITCOUNT( &m_DefaultDisContext) = bpp;
//每行扫描线需32位对齐,
DISCONTEXTLINEGAP( &m_DefaultDisContext) = ( DISCONTEXTHEADERWIDTH( &m_DefaultDisContext ) * bpp + 31 ) / 32 * 4;
DISCONTEXTHEADERSIZEIMAGE( &m_DefaultDisContext ) = DISCONTEXTLINEGAP( &m_DefaultDisContext) * DISCONTEXTHEADERHEIGHT( &m_DefaultDisContext );
//分配绘图区空间
DISCONTEXTBUFFER( &m_DefaultDisContext ) = new BYTE[DISCONTEXTHEADERSIZEIMAGE( &m_DefaultDisContext )];
if( DISCONTEXTBUFFER( &m_DefaultDisContext ) == NULL )
assert( DISCONTEXTBUFFER( &m_DefaultDisContext ));
return false;
ZeroMemory( DISCONTEXTBUFFER( &m_DefaultDisContext), DISCONTEXTHEADERSIZEIMAGE( &m_DefaultDisContext));
m_bDisplayContextReady = true;
memcpy(&m_ExtendDisContext.BitMapHeader,
&m_DefaultDisContext.biDisHeaderInfo.bmiHeader,
sizeof(BITMAPINFOHEADER) );
return true;
/*===========================================================
@Description 将指定位图贴到屏幕绘图区
图片内指定的坐标必需在图片矩形内部
但屏幕指定坐标可以在屏幕外面
@param int iStartX, int iStartY: 指定位屏幕绘图区坐标
@param int iDestX, int iDestY 指定要贴的图片坐标
@param int iWitdh, int iHeight 指定要贴图片的长和宽
@param LPDISPLAYCONTEXT pDisplayContext: 指定要贴图片的上下文
@return bool: true 成功/false 失败
*///=========================================================
bool CCDisPlay::ScreenCopy( int iStartX, int iStartY, int iSourceX, int iSourceY, LPDISPLAYCONTEXT pDisplayContext )
assert( pDisplayContext != NULL );
if( !pDisplayContext)
return false;
if ( !m_bDisplayContextReady)
return false;
LPDISPLAYCONTEXT pDestDisContext = &m_DefaultDisContext;
LPDISPLAYCONTEXT pSourceDisContext = pDisplayContext;
//确定要拷贝的部分
//如果目标图片坐标不再目标矩形内
if( !PointInRetangle(iSourceX, iSourceY, 0, 0,
DISCONTEXTHEADERWIDTH(pDisplayContext) - 1,
DISCONTEXTHEADERHEIGHT(pDisplayContext) - 1))
return false;
//得到要拷贝区的长和宽
int iCopyWidth = DISCONTEXTHEADERWIDTH(pDisplayContext) - iSourceX;
int iCopyHeight = DISCONTEXTHEADERHEIGHT(pDisplayContext) - iSourceY;
//如果两个矩形不相交(即屏幕矩形框和以屏幕iStartX,iStartY为起点iCopyWidth,iCopyHeight为长宽的矩形框
if( RetangleInterSection(iStartX, iStartY,iCopyWidth - 1,iCopyHeight - 1,
0, 0, DISCONTEXTHEADERWIDTH(pDestDisContext) - 1,DISCONTEXTHEADERWIDTH(pDestDisContext) - 1))
return false;
//确定屏幕绘制起点
int iPaintStartX = iStartX < 0 ? 0 : iStartX;
int iPaintStartY = iStartY < 0 ? 0 : iStartY;
//如果贴图起点在屏幕左上角左边或上边
if( iStartX < 0)
iCopyWidth += iStartX;
iSourceX -= iStartX;
if( iStartY < 0)
iCopyHeight += iStartY;
iSourceY -= iStartY;
//如果图片长宽超过屏幕长宽
if ( iPaintStartX + iCopyWidth > DISCONTEXTHEADERWIDTH(pDestDisContext))
iCopyWidth -= iPaintStartX + iCopyWidth - DISCONTEXTHEADERWIDTH(pDestDisContext);
if ( iPaintStartY + iCopyHeight > DISCONTEXTHEADERHEIGHT(pDestDisContext))
iCopyHeight -= iPaintStartY + iCopyHeight - DISCONTEXTHEADERHEIGHT(pDestDisContext);
//先算出每行目标偏移和原图片每行偏移
int iStartHorizontal = DISCONTEXTHEADERBITCOUNT(pDestDisContext) / 8 * iPaintStartX;
int iSourceStartHorizontal = DISCONTEXTHEADERBITCOUNT(pSourceDisContext) / 8 * iSourceX;
//每行大小
int iLengthSize = DISCONTEXTHEADERBITCOUNT(pDestDisContext) / 8 * iCopyWidth;
//现在开始像素拷贝,按行来
for ( int h = 0; h < iCopyHeight; ++h)
memcpy((void*)(DISCONTEXTBUFFER(pDestDisContext) + (iPaintStartY + h) * DISCONTEXTLINEGAP(pDestDisContext) + iStartHorizontal),
(void*)(DISCONTEXTBUFFER(pSourceDisContext) + (iSourceY + h) * DISCONTEXTLINEGAP(pSourceDisContext) + iSourceStartHorizontal),
iLengthSize);
return true;
/*===========================================================
@Description 将指定位图贴到屏幕绘图区
图片内指定的坐标必需在图片矩形内部
但屏幕指定坐标可以在屏幕外面
@param int iStartX, int iStartY: 指定位屏幕绘图区坐标
@param int iDestX, int iDestY 指定要贴的图片坐标
@param int iWitdh, int iHeight 指定要贴图片的长和宽
@param LPDISPLAYCONTEXT pDisplayContext: 指定要贴图片的上下文
@return bool: true 成功/false 失败
*///=========================================================
bool CCDisPlay::ScreenCopy( int iStartX, int iStartY, int iSourceX, int iSourceY, LPDISPLAYCONTEXT pDisplayContext, int iAlpha )
assert( pDisplayContext != NULL );
if( !pDisplayContext)
return false;
if ( !m_bDisplayContextReady)
return false;
if( !(iAlpha >= 0 && iAlpha <= 255))
return false;
LPDISPLAYCONTEXT pDestDisContext = &m_DefaultDisContext;
LPDISPLAYCONTEXT pSourceDisContext = pDisplayContext;
//确定要拷贝的部分
//如果目标图片坐标不再目标矩形内
if( !PointInRetangle(iSourceX, iSourceY, 0, 0,
DISCONTEXTHEADERWIDTH(pDisplayContext) - 1,
DISCONTEXTHEADERHEIGHT(pDisplayContext) - 1))
return false;
//得到要拷贝区的长和宽
int iCopyWidth = DISCONTEXTHEADERWIDTH(pDisplayContext) - iSourceX;
int iCopyHeight = DISCONTEXTHEADERHEIGHT(pDisplayContext) - iSourceY;
//如果两个矩形不相交(即屏幕矩形框和以屏幕iStartX,iStartY为起点iCopyWidth,iCopyHeight为长宽的矩形框
if( RetangleInterSection(iStartX, iStartY,iCopyWidth - 1,iCopyHeight - 1,
0, 0, DISCONTEXTHEADERWIDTH(pDestDisContext) - 1,DISCONTEXTHEADERWIDTH(pDestDisContext) - 1))
return false;
//确定屏幕绘制起点
int iPaintStartX = iStartX < 0 ? 0 : iStartX;
int iPaintStartY = iStartY < 0 ? 0 : iStartY;
//如果贴图起点在屏幕左上角左边或上边
if( iStartX < 0)
iCopyWidth += iStartX;
iSourceX -= iStartX;
if( iStartY < 0)
iCopyHeight += iStartY;
iSourceY -= iStartY;
//如果图片长宽超过屏幕长宽
if ( iPaintStartX + iCopyWidth > DISCONTEXTHEADERWIDTH(pDestDisContext))
iCopyWidth -= iPaintStartX + iCopyWidth - DISCONTEXTHEADERWIDTH(pDestDisContext);
if ( iPaintStartY + iCopyHeight > DISCONTEXTHEADERHEIGHT(pDestDisContext))
iCopyHeight -= iPaintStartY + iCopyHeight - DISCONTEXTHEADERHEIGHT(pDestDisContext);
//先算出每行目标偏移和原图片每行偏移
int iStartHorizontal = DISCONTEXTHEADERBITCOUNT(pDestDisContext) / 8 * iPaintStartX;
int iSourceStartHorizontal = DISCONTEXTHEADERBITCOUNT(pSourceDisContext) / 8 * iSourceX;
//每行大小
int iPixelSize = DISCONTEXTHEADERBITCOUNT(pDestDisContext) / 8;
BYTE *pDestColor;
BYTE *pSourceColor;
//现在开始像素拷贝,按行来
for ( int h = 0; h < iCopyHeight; ++h)
pDestColor = DISCONTEXTBUFFER(pDestDisContext) + (iPaintStartY + h) * DISCONTEXTLINEGAP(pDestDisContext) + iPaintStartY * iPixelSize;
pSourceColor = DISCONTEXTBUFFER(pSourceDisContext) + (iSourceY + h) * DISCONTEXTLINEGAP(pSourceDisContext) + iSourceX * iPixelSize;
for ( int w = 0; w < iCopyWidth; ++w)
*pDestColor++ = *pDestColor * (255 - iAlpha)/255 + *pSourceColor++ *iAlpha / 255;
*pDestColor++ = *pDestColor * (255 - iAlpha)/255 + *pSourceColor++ *iAlpha / 255;
*pDestColor++ = *pDestColor * (255 - iAlpha)/255 + *pSourceColor++ *iAlpha / 255;
//求出相交部分
return true;
参考技术A 你可以使用Microsoft Visual C++ 6.0中的GDI函数进行绘图处理,他可以调用CDC类,这是一个专门的绘图函数类的,可以进行非常多的图形的绘制,楼主可以自行查书学习使用,比如像刘静华和王永生等编写的《计算机绘图》教程就是不错的选择的。
比如想要画一个宽为400,高为300,圆角宽高都为30,左上角位于(100,100)的圆角矩形,边框使用红色实线绘制,内部使用蓝色画刷填充的源程序如下(注意首先使用MFC建立应用程序框架后在添加这些代码即可):
void CGraphiczView::OnDraw(CDC *pDc)
CGraphicDoc *pDc=GetDocument();
ASSERT_VALID(pDc);
CBrush blueBr(RGB(0,0,255));
CBrush *pOldBr=pDc->SelectObject(&blueBr);
CPen redPen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=pDc->SelectObject(&redPen);
pDc->RoundRect(100,100,500,400,30,30);
pDc->SelectObject(pOldBr);
pDc->SelectObject(pOldPen);
楼主可以慢慢学习!!! 参考技术B CDC类,csdn里讲的很详细。
有例子,和中文版的mfc类库,要的话可以给你。
百度hi一下就行。本回答被提问者采纳
Microsoft Visual C++ Runtime Libuary
Microsoft Visual C++ Runtime Libuary
Runtime error
progran:C:\WINDOWS\explorer.exe
this application has requested the runtime to terinate it in an unusual way.please contact the application s support team for more information
(右击D盘的一个文件就出现这情况,怎么解决呢?烦啊。右击后什么操作不了,就强制注销了。。。。请高手求救!)
1.开始菜单-运行-输入regedit-点确定-进入注册表, 在:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下,应该只有一个正常的键值", 将其他的删除。
2.开始菜单-运行-输入cmd 回车在命令提示符下输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
最后重启电脑
1,是删除注册表里的异常值
2.是注册你的DLL文件.
这是杀毒网站推荐的方法.
这问题我只记得微软有两个漏洞补丁.从名称来看,应该是注册表启动项目异常,应该是病毒或未知程序影响.
来源网络的消息不一定可信,但不尝试就不知道解决问题的方式.
希望对你有帮助 参考技术A 楼主你是不是删除了一个叫做Microsoft Visual C++的东西。。。这个是一些程序的运行库,是不能删除的。。。。楼主得去网上重新下载一个Microsoft Visual C++ Runtime Libuary安装上,重启就OK了。 参考技术B 相信我吧,重装系统或一键恢复就可以了。其他都不靠谱。本回答被提问者采纳
以上是关于Microsoft Visual C++ 6.0中的绘图库文件是啥的主要内容,如果未能解决你的问题,请参考以下文章
串口通信IN C++(适用于Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )
使用 Microsoft Visual C++ 6.0 解决 __imp__open 和其他类似名称的函数的链接错误
在win7系统下,如何安装 Microsoft Visual C++ 6.0呢?谢谢····
为啥我用Microsoft Visual C++ 6.0运行c语言文件出错?