Chinaunix首页 | 论坛 | 博客
  • 博客访问: 743392
  • 博文数量: 769
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:37
文章分类

全部博文(769)

文章存档

2011年(1)

2008年(768)

我的朋友

分类:

2008-10-15 16:40:56

    随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼,更能吸引用户,也为更好地发挥软件的功能奠定了基础。本文就Visual 6.0中实现图形的各种显示技巧的原理及具体方法做些探讨。


    基本原理


    在Visual 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,


    //类型为位图


    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]   

【责编:Ken】

--------------------next---------------------

阅读(300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~