[VC6] 在对话框上实现LOGO图片的渐变性切换效果

    一个比较简单的效果。在对话框上放几个单项选择,当用户改变选择时,在对话框上有一个LOGO性质的图片进行渐变性的切换,已反应当前的选择。实现的代码量很小。我从网络上下载了三个足球俱乐部LOGO的壁纸图片,首先把它们缩放到同样的尺寸,然后添加为图片资源。在程序运行时,随着选择的改变,从当前图片逐渐过渡到另一张图片。

    开发工具:VC6.0;

    相关API: GetDIBs, SetDIBitsToDevice;

    运行效果如下:

    

 

    主题代码量很小,所以可以完整列出如下:

 

 

CODE_ImgSwitch

#include "stdafx.h"
#include <stdlib.h>
#include "resource.h"

#define ID_TIMER    1 

HINSTANCE hInst;

//global variables
BYTE* lpCurBits; //当前显示用的
BYTE* lpCacheBits; //DIB临时存储区
//三幅图片
BYTE* lpBits[3];

//信息头
BITMAPINFO bminfo;

//图片所在矩形~
RECT rcImg;

//functions;
//准备工作
void DoPrepare(HWND hDlg);
LRESULT CALLBACK MyDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void GetNextDIB(int percent, int iSel);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.
    hInst = hInstance;
    DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL,
        (DLGPROC)MyDlgProc, 0);
    return 0;
}

//准备工作
void DoPrepare(HWND hDlg)
{
    HBITMAP hBitmap;
    BITMAP bm;
    int i, stride;    
    HDC hdc = GetDC(hDlg);
    //HDC hMemDC = CreateCompatibleDC(hdc);
    //ReleaseDC(hDlg, hdc);
    
    for(i=0; i<3; i++)
    {
        hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1 + i));
        if(i == 0)
        {
            GetObject(hBitmap, sizeof(BITMAP), &bm);
            //图片所在客户区矩形
            rcImg.left = 0;
            rcImg.top = 0;
            rcImg.right = bm.bmWidth;
            rcImg.bottom = bm.bmHeight;
            //bminfo
            //扫描行宽度(实际上图片大小一致)
            stride = (bm.bmWidth * 24 + 31) / 32 * 4;
            bminfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
            bminfo.bmiHeader.biPlanes = 1;
            bminfo.bmiHeader.biBitCount = 24;
            bminfo.bmiHeader.biWidth = bm.bmWidth;
            bminfo.bmiHeader.biHeight = bm.bmHeight;
            bminfo.bmiHeader.biSizeImage = bm.bmHeight * stride;                
        }
        //lpBits[i] = (BYTE*)bm.bmBits;
        lpBits[i] = (BYTE*)malloc(bminfo.bmiHeader.biSizeImage);
        GetDIBits(hdc, hBitmap, 0, bminfo.bmiHeader.biHeight, lpBits[i], &bminfo, DIB_RGB_COLORS);

        DeleteObject(hBitmap);
    }
    ReleaseDC(hDlg, hdc);
    //DeleteDC(hMemDC);
    //创建当前显示的DIB
    lpCurBits = (BYTE*)malloc(bminfo.bmiHeader.biSizeImage);
    memcpy(lpCurBits, lpBits[0], bminfo.bmiHeader.biSizeImage);
    lpCacheBits = (BYTE*)malloc(bminfo.bmiHeader.biSizeImage);
}

//the dlg's window procedure
LRESULT CALLBACK MyDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int iSel;
    //当前百分比(当为100时,停止计时器)
    static int percent;
    switch (message)
    {
        case WM_INITDIALOG:
            {
                DoPrepare(hDlg);
                //默认选中第一个选项
                CheckDlgButton(hDlg, IDC_RADIO1, BST_CHECKED);
                iSel = 0;
                percent = 0;
                return TRUE;
            }
            break;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
            case IDOK:
            case IDCANCEL:
                EndDialog(hDlg, LOWORD(wParam));                
                break;

            case IDC_RADIO1:
            case IDC_RADIO2:
            case IDC_RADIO3:
                iSel = LOWORD(wParam) - IDC_RADIO1;
                percent = 100;
                //把当前位图拷贝到缓冲区
                memcpy(lpCacheBits, lpCurBits, bminfo.bmiHeader.biSizeImage);
                SetTimer(hDlg, ID_TIMER, 20, NULL);
                break;
            }
            break;

        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hDlg, &ps);
                SetDIBitsToDevice(hdc, 
                    0, 0, rcImg.right, rcImg.bottom,
                    0, 0, 
                    0, bminfo.bmiHeader.biHeight,
                    lpCurBits,
                    &bminfo,
                    DIB_RGB_COLORS);

                EndPaint(hDlg, &ps);
            }
            break;

        case WM_TIMER:
            {
                if(percent <= 0)
                {
                    KillTimer(hDlg, ID_TIMER);
                    return TRUE;
                }
                percent -= 5;
                GetNextDIB(percent, iSel);
                InvalidateRect(hDlg, &rcImg, FALSE);
                return TRUE;
            }
            break;

        case WM_DESTROY:
            {
                int i;
                for(i=0; i<3; i++)
                {
                    free(lpBits[i]);
                }
                free(lpCurBits);
                free(lpCacheBits);
            }
            return TRUE;
    }
    return FALSE;
}

//已当前百分比进行混合图像
//                            100                  0
//percent: 混合百分比  当前图片|------------------>|目标图片
//                             |---percent-->| 
//destDIB: 目标DIB
void GetNextDIB(int percent, int iSel)
{
    unsigned int i;
    int x1, x2;
    for(i=0; i<bminfo.bmiHeader.biSizeImage; i++)
    {
        x1 = lpCacheBits[i];
        x2 = lpBits[iSel][i];
        lpCurBits[i] = (BYTE)((x1*percent + x2*(100-percent) )/100);
    }
}

  

    源代码下载链接:

    http://files.cnblogs.com/hoodlum1980/ImgSwitch.rar    

时间: 2024-09-17 11:08:02

[VC6] 在对话框上实现LOGO图片的渐变性切换效果的相关文章

html5-如何做到微信公共号上那种“一句话+图片”在一行显示的效果?

问题描述 如何做到微信公共号上那种"一句话+图片"在一行显示的效果? 不知道怎么做到那种效果?我现在的做法是 在一行放 两个标签(input和img),然后在两个标签里都加入onclick. 但是这么做排版难度太大了,无法做到微信公共号的那种显示效果. 求助一下如何那样做? 解决方案 一个input标签只能有一个value,你自己可以测试一下.如果你需要实现你所说的效果,为什么非要用2个value?(df8888.com)你可以给这个input自定义一个属性,然后你这个值放这个属性里面

js图片轮播手动切换效果_javascript技巧

利用ScrollPicLeft.js这个库实现图片的前后切换,适用于网页中的证书展示.推荐商品之类的栏目.它不像传统的marquee滚动那样,而是可以手动的去点击前后切换箭头按钮,进行图片的翻页,从而达到浏览上一张,下一张的效果. 不需要调用jquery,初始化简单,使用非常的简单,便利. 实例效果: js代码: <script type="text/javascript"> var scrollPhoto = new ScrollPicleft(); scrollPhot

jq实现左侧显示图片右侧文字滑动切换效果_jquery

分享一款jQuery左侧图片右侧文字滑动切换代码.这是一款基于jQuery实现的列表图片控制图片滑动切换代码.效果图如下: 下面给大家分享下基于jq实现左侧显示图片右侧文字滑动切换效果,用div+css布置表单借用jq实现特效,具体不多说了,请看下面代码. html代码: <div class="index-new w1200 mt30"> <div class="indexadd mt50 mb60"> <div id="b

原生js实现图片层叠轮播切换效果_javascript技巧

本文实例介绍了js焦点图片层叠轮播切换滚动效果,分享给大家供大家参考,具体内容如下 效果图:   功能描述: 自定义图片尺寸: 每隔一段时间自动滚动图片: 每次动画执行的时候改变图片的位置,宽高以及其它属性也要跟随着变化: 鼠标移上图片,显示当前图片的详细信息: 点击按钮向前向后滚动: 详细代码: html代码: <!DOCTYPE html> <!-- saved from url=(0062)http://x1.xiuimg.com/style/xiu/woxiu/v1/tpl/to

iOS图片界面翻页切换效果_IOS

先看效果: 下面贴代码: #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *backgroundView; @property (strong,nonatomic) NSArray *array; @end @implementation ViewController -(NSArray *)array { if (_arra

WPS文字中怎么使用用公司LOGO图片作页眉

  WPS文字中怎么使用用公司LOGO图片作页眉 1.打开WPS文字,切换到"插入"选项卡,单击"页眉和页脚"按钮,如下图. 2.在"页眉和页脚"选项卡中单击"图片-来自文件",如下图所示. 3.弹出"插入图片"对话框,找到LOGO图片点击,然后"打开",如下图. 4.插入LOGO后,把鼠标放在LOGO边上,当鼠标变成如下图所示的样子后,可以更改LOGO大小. 5.大小更改好以后,插入L

PS合成草原上奇幻场景图片(图文)

ps教程  PS合成草原上奇幻场景图片(图文) 最终效果 1. 创建一个新文件,大小为900px*1200px,填充背景图层为白色,然后创建一个新图层,使用渐变工具在图中由上至下拖到鼠标,填充一个颜色#00eaf7到透明的线性渐变效果,如图所示. 2.再创建一个新图层,使用较暗的蓝色,再填充一个线性渐变效果,如图所示. 3.之所以使用两个图层来填充渐变效果,主要是为了更方便地对每种渐变效果进行调整. 4.创建一个新图层命名为云,并使用云笔刷在图片中画上云朵,如图所示. 5.创建一个新图层命名为杂

图片组的连续滚动效果

现在的网页上常常见到图片组的连续滚动效果,如果你掌握了AS的基础知识,也能做出这样的效果,如果你想学,那么跟我来吧! 由于源码中只有一帧,所以就不贴图示了.主要的东东是一个图片MC,实例名是"m".制作步骤是这样的.先把一组图连起来,组合,相对舞台选择水平和垂直居中,再复制两个图片组合,分别放在两侧衔接好.新建一个MC,把图片MC(实例名为"m")放进去,相对舞台选择水平和垂直居中,不做别的处理.给这个MC起实例名为"mc".接下来该写代码了,在

给图片添加水印效果图的函数(可以在图片上添加自己的版权和LOGO图片的水印)

Code 1 protected void Button1_ServerClick(object sender, System.EventArgs e) 2         { 3             if(File1.PostedFile!=null) 4             {     5                 string fileName = File1.PostedFile.FileName ; 6                 //取得上传文件的扩展名 7