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

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

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

    开发工具:VC6.0;

    相关API: GetDIBs, SetDIBitsToDevice;

    运行效果如下:

    

 

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

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 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    

目录
相关文章
|
存储 Java 关系型数据库
JPA 注解及主键生成策略使用指南
JPA 注解及主键生成策略使用指南
1115 0
|
12月前
|
人工智能 搜索推荐 算法
用AI提示词搞定基金定投:技术人的理财工具实践
本文将AI提示词工程应用于基金定投,为技术人打造一套系统化、可执行的理财方案。通过结构化指令,AI可生成个性化定投策略,覆盖目标设定、资产配置、风险控制与动态调整,帮助用户降低决策门槛,规避情绪干扰,实现科学理财。
3522 13
|
人工智能 开发者
Kimi Chat:国内AI新星,20万字超长文本处理的突破者
【2月更文挑战第12天】Kimi Chat:国内AI新星,20万字超长文本处理的突破者
3694 2
Kimi Chat:国内AI新星,20万字超长文本处理的突破者
|
安全 Java Maven
Spring Boot项目的模块化设计与架构
Spring Boot项目的模块化设计与架构
|
Java 编译器 数据库连接
cglib动态代理 | 如何生成代理类、代理类内容解析
cglib动态代理 | 如何生成代理类、代理类内容解析
|
图形学
【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR
【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR
1081 0
|
存储 缓存 Java
Nginx之Openresty缓存解读
Nginx之Openresty缓存解读
|
9天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
7684 13
|
7天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1642 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
4天前
|
人工智能 JavaScript 芯片
DeepSeek 官方偷偷上传 Harness 桌面端安装包,我已经用上了。。附最新下载地址
DeepSeek Harness 官方的桌面端安装包被网友扒出来了,2 分钟讲明白如何使用,体验如何,适合作为 AI 编程工具么?附最新 Windows 和 Mac 双端的下载地址
1407 1

热门文章

最新文章