Visual C++中的图形特技

旋转的阴阳鱼太极图源程序 本资源是孔令德开发的阴阳鱼太极图的旋转程序。使用MFC编写。阴阳鱼使用定时器驱动,开机后可以一直顺时针旋转。程序的解释见孔令德《计算机图形学基础教程(Visual C++版)》(第2版),清华大学出版社 立即下载
随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼,更能吸引用户,也为更好地发挥软件的功能奠定了基础。本文就Visual C++ 6.0中实现图形的各种显示技巧的原理及具体方法做些探讨。

基本原理

在Visual C++6.0中,显示位图的方法及过程如下:

1. 显示程序资源中的位图(位图的所有数据均存在于可执行文件中)

(1)从资源中装入位图

● 定义位图对象数据成员CBitmap m_Bitmap;

● 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);

● 传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。

(2)生成与位图相联系的内存设备情境对象

CDC MemDC;

MemDC.CreateCompatibleDC(NULL);

MemDC.SelectObject(&m_Bitmap);

(3)显示位图

CClientDC ClientDC(this);

BITMAP BM;

m_Bitmap.GetObject(sizeof(BM),&BM);

ClientDC.BitBlt

( X,Y, //目标设备逻辑横、纵坐标

BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度

&MemDC,

//待显示位图数据的设备情境对象

0,0, //源数据中的横、纵坐标

SRCCOPY); //位操作方式

这种方法显示位图速度快,但不是很灵活,而且会使可执行文件增大。

2. 显示独立文件方式的位图(位图的所有数据独立于可执行文件)

HBITMAP *hBitmap; //定义位图对象句柄

BITMAP BM;

CDC MemDC;

CClientDC ClientDC(this);

MemDC.CreateCompatibleDC(&ClientDC);

hBitmap=(HBITMAP*):: LoadImage

( AfxGetInstanceHandle(),

//取得应用程序句柄

“demo1.bmp”,

//位图文件名

IMAGE_BITMAP,

//类型为Windows位图

0,0,

LR_LOADFROMFILE);

//从文件中取位图数据

MemDC.SelectObject(hBitmap);

:: GetObject(hBitmap,sizeof(BM),&BM);

ClientDC.BitBlt(……)

//使用格式与方法一同

这种方法显示位图速度较之前一种慢了一点,但其灵活性较大,可以任意变换位图文件,而无需重新编译源程序, 也减小了可执行文件的大小。

实现方法

下面介绍各种图形显示技巧的具体实现原理及方法。以下所有程序算法的实现均可放在视类(CView,也可视自己的需要放在其他类)中处理,且有必要进行如下的相关操作:

增加如下类成员变量:

BITMAP m_Bm;

//保存位图的宽、高度等数据

HBITMAP *m_hBitmap;

//保存位图数据句柄

CDC m_MemDC; //内存设备情境对象

在类构造函数中加入如下代码:

m_MemDC.CreateCompatibleDC(NULL); //产生内存设备情境对象

m_hBitmap=(HBITMAP *)::LoadImage(

//从文件中装入位图数据

AfxGetInstanceHandle(),

“demo1.bmp”,

IMAGE_BITMAP,

0,0,

LR_LOADFROMFILE );

m_MemDC.SelectObject(m_hBitmap); //将位图选入内存设备情境对象

::GetObject(m_hBitmap,sizeof(m_Bm),&m_Bm);

1. 水平交错效果

原理:将内存设备情境对象(如MemDC)中的位图数据拆分成奇、偶扫描线两部分,其中奇数条扫描线由上往下移动,偶数条扫描线则由下往上移动,且两者同时进行。屏幕上的效果为分别由上下两端出现的较淡栅栏图形,逐渐相互靠近,直至整个位图完全清楚。垂直交错效果的实现原理与之类似。

程序算法:

int i,j;

for ( i=0; i<=m_Bm.bmHeight; i+=2 )

{j = i;

while ( j>0 )

{ClientDC.StretchBlt(

//奇数,由上至下

0,j-1,

//目标设备逻辑横、纵坐标

m_Bm.bmWidth,1,

//显示位图的像素宽、高度

&m_MemDC,

//源位图设备情境对象

0,m_Bm.bmHeight-(i-j-1),

//源位图的起始横、纵坐标

m_Bm.bmWidth,1,

//源位图的像素宽、高度

SRCCOPY);

ClientDC.StretchBlt(

//偶数,由下至上

0,m_Bm.bmHeight-j,

//目标设备逻辑横、纵坐标

m_Bm.bmWidth,1,

//显示位图的像素宽、高度

&m_MemDC,

//源位图设备情境对象

0,i-j,

//源位图的起始横、纵坐标

m_Bm.bmWidth,1,

//源位图的像素宽、高度

SRCCOPY);

j-=2; }

// while ( j>0 )

Sleep(10);

}

//for ( i=0; i<=m_Bm.bmHeight; i+ =2 )

2. 雨滴效果

原理:将内存设备情境对象(如MemDC)中位图数据的最后一条扫描线,顺序地从目标设备(如ClientDC)中待显示位图的第一条扫描线所在位置移动至最后一条处,并保留此条扫描线在屏幕上移动时留下的轨迹。接着再把MemDC中位图数据的倒数第二条扫描线,顺序地从目标设备(如ClientDC)中待显示位图的第一条扫描线所在位置移动至倒数第二条处。其余的扫描线依此类推。

程序算法:

int i,j;

for ( i=0; i<=m_Bm.bmHeight; i++ )

{for ( j=0; j<=m_Bm.bmHeight-i; j++ )

ClientDC.StretchBlt(

0,j,

//目标设备逻辑横、纵坐标

m_Bm.bmWidth,1,

//显示位图的像素宽、高度

&m_MemDC,

//源位图设备情境对象

0,m_Bm.bmHeight-i,

//源位图的起始横、纵坐标

m_Bm.bmWidth,1,

//源位图的像素宽、高度

SRCCOPY);

Sleep(20);

}

//for ( i=0; i<=m_Bm.bmHeight; i++ )

3. 百叶窗效果

原理:将内存设备情境对象(如MemDC)中的位图数据分成若干组,然后分别从第一组到最后一组进行搬移,第一次搬移每组中第一条扫描线到目标设备(如ClientDC)中待显示位图的相应位置,第二次搬移每组中第二条扫描线,接着第三条、第四条扫描线。

程序算法:

int i,stepi,j;

stepi=m_Bm.bmHeight/10;

for ( i=0; i<=stepi; i++ )

{for ( j=0; j<10; j++ )

ClientDC.StretchBlt(

0,j*stepi+i,

//目标设备逻辑横、纵坐标

m_Bm.bmWidth,1,

//显示位图的像素宽、高度

&m_MemDC,

//源位图设备情境对象

0,j*stepi+i,

//源位图的起始横、纵坐标

m_Bm.bmWidth,1,

//源位图的像素宽、高度

SRCCOPY);

Sleep(20);

} //for ( i=0; i<=stepi; i++ )

4. 随机积木效果

原理:将内存设备情境对象(如MemDC)中的位图数据分成纵横十等份共一百组数据,然后随机地取出这一百组数据中的某一组显示到目标设备(如ClientDC)中待显示位图的相应位置,如此反复直到所有一百组数据均显示完毕为止。

程序算法:

int i,j,stepx,stepy,dispnum,x,y;

int pxy[10][10];

//使用本数组记录已显示过的数据组

for ( i=0; i<10; i++ )

for ( j=0; j<10; j++ )

pxy[i][j]=0;

stepx=m_Bm.bmWidth/10;

stepy=m_Bm.bmHeight/10;

srand( (unsigned)time( NULL ) );

dispnum=0;

//记录已显示过的数据组的个数

while(1)

{ x=rand() % 10;

y=rand() % 10;

if ( pxy[x][y] )

//本组x,y所代表的数据组是否已显示过?

continue;

pxy[x][y]=1;

//表明本组x,y所代表的数据组已显示过

ClientDC.StretchBlt(

x*stepx, y*stepy,

//目标设备逻辑横、纵坐标

stepx,stepy,

//显示位图的像素宽、高度

&m_MemDC,

//源位图设备情境对象

x*stepx, y*stepy,

//源位图的起始横、纵坐标

stepx,stepy,

//源位图的像素宽、高度

SRCCOPY);

dispnum++;

if ( dispnum >=100 )

break;

Sleep(30);

} // while(1)

结 语

以上程序代码均在Visual C++ 6.0中调试通过,所有片断均可编写成独立的函数,灵活使用。如果对以上几种显示效果进行变换,我们还可以实现多种其他特技效果。 

图形学C++图形的移动,转换 点功能区,选择图形(三角形 矩形 直线) 然后再次点击功能区 选择变换的类型! 互相学习 互相借鉴!!!!!!!!!!!!!! 立即下载

相关推荐

计算机图形学 visual c++ 6.0 三维变换(有注释) .zip

计算机图形学 visual c++ 6.0 三维变换(有注释)

windows位图绘制(显示位图资源)LoadBitmap、CreateCompatibleDC、BitBlt、StretchBlt

windows位图绘制(显示位图资源)LoadBitmap、CreateCompatibleDC内存虚拟DC、BitBlt(原尺寸呈现)、StretchBlt(缩放呈现)

单于的学习历程 1526

画太极图的C++代码实现

绘制太极图的原理简单来说就是画两个半圆一黑一白 拼成一个正圆 再在大圆的左侧和右侧画两个恰好相切的黑圆和白圆作为突出端 最后分别在这两个突出端里面画两个一黑一白的小洞 MFC里利用void CDrawView::OnDraw CDC pDC 这个函数进行绘图 和课堂上绘制正弦曲线相比 如果用一笔一笔循环的方式画圆将会很复杂 因此我就参考网上的 用Pie函数和Ellipse函数画弧和圆 画图用了CBrush画刷和CPen画笔 ">绘制太极图的原理简单来说就是画两个半圆一黑一白 拼成一个正圆 再在大圆的左侧和右侧画两个恰好相切的黑圆和白圆作为突出端 最后分别在这两个突出端里面画两个一黑一白的小洞 MFC里利用void CDrawView::OnDraw CDC pDC 这 [更多]

【C++入门到精通】位图 | 位图的实现[ C++入门 ]

位图是一种用于表示和操作大量二进制位的数据结构,它通过使用一个固定长度的数组来存储位的状态,每个位可以表示某种信息的存在与否。位图常用于解决需要高效存储和操作大量布尔类型数据的问题,例如集合操作、去重、排序等。在C++中,可以使用类似上述的位图类来模拟实现位图功能,实现插入、删除和查找等操作。位图的优点是占用空间小、操作高效,但受限于位数范围。

Yawesh的博客 1634

三维立方体、锥形、球体编程实现(vc++ 和 openGL)

这是一个使用vc++6.0和openGL实现的关于三维立方体、锥形、球体的程序,这三种形状可以缩放、旋转、平移,并且还利用openGL加上了背景和光照,程序附有源代码,希望对大家有帮助!

ABAP - Function ALV 11 - 单元格下拉框

【代码】ABAP - Function ALV 11 - 单元格下拉框。

HeathlX的博客 1814

为按钮控件添加图片的方法

第一种:Button属性页里Style的Bitmap点上CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);pButton->SetBitmap(hBitmap);感觉效果不是很好。

lvlv526的专栏 1808

Synopsys SpyGlass 进行 RTL 功耗估计

通过上述脚本,您可以使用 Synopsys SpyGlass 对纯 RTL 代码和带有 FSDB 波形的 RTL 代码进行功耗估计,并支持将 SDC 文件转换为 SGDC 文件。

yumingqinglong的博客 2186

CreateCompatibleDC与BitBlt 学习

CreateCompatibleDC与BitBlt CreateCompatibleDC 创建一个与指定设备一致的内存设备描述表。 HDCCreateCompatibleDC(HDC hdc //设备描述表句柄); 参数hdc 现有的设备描述表的一个句柄,如果这个句柄为NULL,则函数创建一个和应用程序当前屏幕一致的内存设备描述表。 返回值如果函数调用成功,则返回一个内存...

weixin_30662109的博客 399

硬件电路(22)-TTL和232切换电路

工作中会遇到TTL和232电平的通信的状态,为了实现一种便捷的切换方式,参考了一些文章,提供一种电路方便大家使用。

剑藏锋的博客 1862

信号编辑软件ZX/SignalEditing

信号编辑软件ZX/SignalEditing

weixin_45661395的博客 955

用VC 实现图象渐显和渐隐

作者: 周长发摘 要 图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于Windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其Visual C++程序编码。关键词 渐显、渐隐、调色板、调色板动画、时间码图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普

silver的专栏 1126

ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

1、符号化显示: CAD数据加载进来有很多列表,包含了点【point】、线【polyline】、面【polygon】、标注数据【Annotation】等数据,本次实验我们需要用到的是面数据,也就是.dwgPolygong格式的数据。如下图所示: 把数据加载进来,然后在2处打开属性表,查看CAD数据的属性表,打开后可以发现【layer】图层表示就是地块的用地性质,它就是符号化显示的依据。 我们在数据上右键【属性】,打开图层属性,找到【符号系统】,选择类别中的【唯一值】,然后在【值字段】下拉选择【layer】,

yuanYW7556的博客 2万+

长按开关机芯片选型指南:五大关键参数决定硬件可靠性

在便携式电子产品的硬件设计中,电源管理是决定整机可靠性与续航的核心环节。作为电源路径的关键器件,长按开关机芯片承担着按键检测、延时判断与负载通断的控制逻辑,其参数选型直接影响设备从样品到量产的稳定性。输入电压范围需覆盖电池全生命周期,静态功耗则关乎关机待机时长;导通电阻与持续输出能力决定带载压降,而长按延时精度和防误触抗干扰性能更是用户体验与口碑的分水岭。针对手持仪器、蓝牙穿戴、智能锁、小家电等典型场景,从芯片内部设计逻辑出发,系统梳理五大关键参数,为工程师提供一套可落地的选型筛查方法,助力产品在复杂环境下

cuiji1279的博客 129

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4481

基于聚类特征工程的水果销量预测:聚类算法对比与多模型评估

水果销量预测研究:聚类分群与多模型对比 摘要 本研究提出了一种融合聚类分析与机器学习的水果销量预测方法。基于包含12个维度的销售数据集,首先采用K-Means、BIRCH和DBSCAN三种聚类算法对水果品类进行分群,通过轮廓系数等指标评估显示BIRCH算法表现最优(0.387)。随后针对不同群组构建差异化特征工程,并比较XGBoost、LightGBM和LSTM三种预测模型性能。实验结果表明:基于聚类特征工程的LightGBM模型预测效果最佳(RMSE=2.34,R²=0.87).

huanghm88的专栏 137

Visual C++中的图形特技 (转)

Visual C++中的图形特技 (转)[@more@]随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式...

ciya3282的博客 73

硬件工程师入门基础知识(一)基础元器件认识(二)

我们的电路输入一般是只有两种状态,0V 或者是其它的高电平(1.8V,3.3V,5V 等),截止状态一般不用怎么考虑,因为如果让三极管的 Vbe=0,自然就截止了,重要的是饱和状态如何保证。也就是说只要 Rb

小幽余生不加糖 1万+
上一篇: delphi函数参考手册
下一篇: c++学习要点
icemanpro
博客等级 码龄25年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值