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语言文件出错?

Microsoft Visual C++ 6.0中的绘图库文件是啥

电脑问题 Microsoft visual c++ Runtime Library