VC水纹特效

51 篇文章 3 订阅
12 篇文章 0 订阅

我的环境:WIN7 X64 + VS2010

------------------------------------------------------------------------------------------------------------------------------------------------------------

最近在看易语言的官方教程时(即:《十天学会易语言图解教程》),在:第10章-API应用 中有个水纹特效的例子,

看后觉得很是不错,于是想将其搬到VC中来,无奈教程里面只要一个dll文件:WaterDll.dll

在VC中使用dll时,一般都要有相应的xxx.h头文件和xxx.lib库文件,既然没有头文件和库文件,我只能动态调用了。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

效果截图:


-----------------------------------------------------------------------------------------------------------------------------------------------------------

为了方便动态调用WaterDll.dll,我封装了一个类CWaterWave:

WaterWave.h内容如下:

#pragma once
/************************************************************************/
/* http://blog.csdn.net/friendan                                   */
/************************************************************************/


class CWaterWave
{
public:
    CWaterWave(void);
    ~CWaterWave(void);
public:

    // 各个参数是什么,没找到官方解释,自己多试几个参数看看效果吧
    int WaterInit(int bitmap);
    int WaterMouseAction(int hdc, int sx, int sy, int mx, int my, int half, int deep);
    int WaterTimer(int hdc, int sx, int sy);

private:

    // 函数原型定义 
    typedef int  (_stdcall *PFN_WaterInit)(int bitmap);
    typedef int  (_stdcall *PFN_WaterMouseAction)(int hdc, int sx, int sy, int mx, int my, int half, int deep);
    typedef int  (_stdcall *PFN_WaterTimer)(int hdc, int sx, int sy);

    // 函数指针 
    PFN_WaterInit m_pfnWaterInit;
    PFN_WaterMouseAction m_pfnWaterMouseAction;
    PFN_WaterTimer m_pfnWaterTimer;

    HMODULE m_hWaterDll;
};

----------------------------------------------------------------------

WaterWave.cpp文件内容如下:

#include "StdAfx.h"
#include "WaterWave.h"


CWaterWave::CWaterWave(void)
{
    m_pfnWaterInit = NULL;
    m_pfnWaterMouseAction = NULL;
    m_pfnWaterTimer = NULL;

    m_hWaterDll = LoadLibrary("WaterDll.dll");
    m_pfnWaterInit = (PFN_WaterInit)GetProcAddress(m_hWaterDll, "WaterInit");
    m_pfnWaterMouseAction = (PFN_WaterMouseAction)GetProcAddress(m_hWaterDll, "WaterMouseAction");;
    m_pfnWaterTimer = (PFN_WaterTimer)GetProcAddress(m_hWaterDll, "WaterTimer");;
}


CWaterWave::~CWaterWave(void)
{
    if (m_hWaterDll != NULL)
    {
        FreeLibrary(m_hWaterDll);
        m_hWaterDll = NULL;
    }
}

int CWaterWave::WaterInit( int bitmap )
{
    if (m_pfnWaterInit ==  NULL)
    {
        return -1;
    }
    return m_pfnWaterInit(bitmap);
}

int CWaterWave::WaterMouseAction( int hdc, int sx, int sy, int mx, int my, int half, int deep )
{
    if (m_pfnWaterMouseAction == NULL)
    {
        return -1;
    }
    return m_pfnWaterMouseAction(hdc, sx, sy, mx, my, half, deep);
}

int CWaterWave::WaterTimer( int hdc, int sx, int sy )
{
    if (m_pfnWaterTimer == NULL)
    {
        return -1;
    }
    return m_pfnWaterTimer(hdc, sx, sy);
}

-----------------------------------------------------------------------------------------------------

封装好了类CWaterWave,在MFC中调用就方便多了,其实WaterDll.dll里面的接口不多,我们只要调用以下3个接口,就可以实现水纹特效了:

WaterInit

WaterMouseAction

WaterTimer

-----------------------------------------------------------------------------------

1. 在我们的对话框头文件WaterWindowDlg.h声明一个对象:

 CWaterWave m_waterWave;

------------------------------------------------------------

2. 在 工程的资源中插入一副位图,ID设置为:IDB_BMP_SEA


------------------------------------------------------------------------------------------------

3. 在对话框的OnInitDialog函数里面增加以下代码:

// 水纹特效初始化
    int iBitmap = (int)::LoadImage(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BMP_SEA), IMAGE_BITMAP, 0, 0, LR_VGACOLOR);
    if (iBitmap != NULL)
    {
        m_waterWave.WaterInit(iBitmap);
    }

    // 开个定时器来处理水纹
    SetTimer(2015, 10, NULL);

-----------------------------------------------------------------

4. 定时器处理过程代码如下:

// 定时器
void CWaterWindowDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    HDC hDCWnd = ::GetDC(this->GetSafeHwnd());
    m_waterWave.WaterTimer((INT)hDCWnd, 0, 0);
    ::ReleaseDC(this->GetSafeHwnd(), hDCWnd);

    CDialogEx::OnTimer(nIDEvent);
}

------------------------------------------------------------------------

5. 处理鼠标在窗体的移动事件,在该事件中显示水纹:

// 鼠标移动事件
void CWaterWindowDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    HDC hDCWnd = ::GetDC(this->GetSafeHwnd());
    m_waterWave.WaterMouseAction ((INT)hDCWnd, 0, 0, point.x, point.y, 5, 100);
    ::ReleaseDC(this->GetSafeHwnd(), hDCWnd);

    CDialogEx::OnMouseMove(nFlags, point);
}

----------------------------------------------------------------

以上例子下载:

http://download.csdn.net/detail/friendan/8891081








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实用与原理性的东西,对于想打好VC基础的朋友应该有帮助.示例目录:实例1 mfc框架. 文档和视 实例2 创建多文档窗口 实例3 创建对话框窗口 实例4 创建启动窗口 第2章 多窗口界面 实例5 多窗口的单文档界面 实例6 通过菜单改变视图 实例7 通过工具栏改变视图 实例8 多视图窗口数据显示 第3章 实现microsoft风格 实例9 visual studio风格的窗口 实例10 internetexplorer4. 0风格的窗口 实例11 outlook风格的窗口 实例12 状态栏中的任务栏 第4章 超文本界面 实例13 创建超级链接界面 实例14 显示模式html对话框窗口 实例15 超文本浏览器 实例16 数字化时钟 第5章 各种特效窗口 实例17 创建不规则窗口 实例18 操作dib位图窗口 实例19 位图转换窗口 实例20 渐变的窗口 第6章 对话框界面 实例21 可扩展对话柜 实例22 位图预览对话框 实例23 显示目录树对话框 实例24 透明对话框 第7章 菜单状态操作 实例25 漂亮的图文菜单 实例26 随文档动态改变菜单 实例27 启用和禁止菜单命令 实例28 复选菜单命令 第8章 自绘制菜单 实例29 自绘制图标菜单 实例30 visualstudio外观的工具栏 实例31 对话框窗口中的菜单 实例32 弹出位图菜单 第9章 动画按钮 实例33 avi动画按钮 实例34 实现图标按钮 实例35 实现一组图标按钮 实例36 绘制dib动画按钮 第10章 多彩按钮 实例37 位图按钮 实例38 带颜色的按钮 实例39 对鼠标敏感的按钮 实例40 可弹出菜单的按钮 第11章 图文按钮风格大全 实例41 各种图文按钮风格 实例42 图标浮动按钮 实例43 图钉按钮 实例44 计数器按钮 第12章 不规则按钮大全 实例45 各种不规则按钮 实例46 环形按钮 实例47 三角形按钮 实例48 椭圆形按钮 第13章 掩膜编辑框 实例49 ip地址输入编辑框 实例50 下拉列表控件中的编辑柜 实例51 掩膜

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值