返回首页

{A}{S0}简介
我一直在很长一段时间用户关于"旗帜图片上显示的防水效果印象深刻。感觉就像把图片上的一杯水,当您移动鼠标在图片的,水是不安和旋风左右,同时,水滴随机落入水中,产量小圆圈在这里和那里。
是开源的,我围绕这些天发生的无聊,我决定寻找到实现算法,并让自己的一些工作要做。我它移植到WTL的,因此本文。背景
,用于该算法是基于互动图像文件。在我的版本,它是一个较新的ATL / MFC共享类{A9}取代。这种变化带来了一些眼前的优势:更多的图像格式支持
{A6}虽然提供了增强的位图支持,包括加载JPEG,BMP,GIF图像的能力,和可移植网络图形(PNG)格式。 PNG和JPG文件,可以直接加载,无需额外的解码。更灵活的图像加载
在{A7}提供了一个接口来加载图像从一个文件路径。更有效的内存使用率
,因为{A9}支持直接访问像素,这样可以节省需要创建一个临时兼容的设备上下文(DC)和相关联的内存兼容位图,这是在的MFC版本通过检索像素在现场,如果图像太大和CImage的GetPixel()成为性能瓶颈(是的,它发生,如果你的形象是比较大的的)。更多图片渲染选项
{A9}支持PlgBlt(),MaskBlt(),AlphaBlend(),TransparentBlt(),这意味着你有可供选择渲染时加载的图像。
进取重构已应用于重命名,接口的变化,如原代码,使除了为核心的像素处理代码,代码大部分是新的。然而,重构重构,属性仍然原作者,其牌照仍然在哪里。只有过时的代码中的注释将被删除。使用代码
要使用的代码,添加到您的项目的下列文件:WaterEffectImplBase.h
包含WaterEffectImplBaselt类; Derivedgt; WaterEffectCtl随时可以直接使用客户端代码。Render.h / CPP
包含类CRenderer的载入一个图像文件,为它创建一个内存缓冲区,并使其操纵水的效果后的目标窗口面积,使用类WaterEffectImplBaselt; Derivedgt;实施细则。WaterEffect.h / CPP
包含类CWaterEffect应用二维水类CRenderer类WaterEffectImplBaselt,外露; Derivedgt到内存缓冲区的转变;实施细则。auto_buffer.h
包含类auto_bufferlt; TGT;,有点类缓冲区的创建和销毁。cimage_pixel_access_opt.h
包含类CImage像素访问优化CImagePixelAccessOptimizer。
和#quot; WaterEffectImplBase.hquot;,实现两班WaterEffectImplBaselt; Derivedgt; WaterEffectCtl,这意味着你havenbsp;两种方式你的对话框中添加水的效果。方法1
熟悉的WTL开发的{A10}的方式,从WaterEffectImplBase派生你的窗口类。
,然后在以链中的Windows消息,你需要加入这一行的消息映射:{C}
最后的OnInitDialog()方法中,添加一行的init():

LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, 

LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

	// ...



	//draw on the dialog directly starting from the topleft

	init(IDB_LOGOFLIPPED, CPoint(0, 0)); 





	// ...



	return TRUE;

}

这样,图片是直接绘制在指定的位置"对话框上。方法2
另外,你可以使用作为控制WaterEffectCtl WaterEffectCtl对象声明一个类成员。
#include "WaterEffectImplBase.h"



class CDemoDlg : public CDialogImpl<CDemoDlg>

{

public:

	WaterEffectCtl we;

...};

然后,在的OnInitDialog()方法,添加此下面一行的init():
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, 

LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

	// ...



	// draw on the member static control

	we.init(GetDlgItem(IDC_WATER2), IDB_LOGOFLIPPED, CPoint(0, 0));



	// ...



	return TRUE;

}

在这种情况下,一个窗口句柄是必需的WaterEffectCtl对象附加到。简介类templatelt;类Derivedgt;类WaterEffectImplBase
void init(_U_STRINGorID nIDResource, const CPoint& topleft = CPoint(0,0))

void init(const CImage& image, const CPoint& topleft = CPoint(0,0))
参数rc文件_U_STRINGorID nIDResource,加载图像资源ID。常量CImageamp;图像,图像可以被预先装入一个CImage对象,并通过在CPointamp;左上,左上的位置要放置图像,图像将呈现没有大小的变化类类WaterEffectCtl
void init(HWND hWnd, _U_STRINGorID nIDResource, const CPoint& topleft = CPoint(0,0))

void init(HWND hWnd, const CImage& image, const CPoint& topleft = CPoint(0,0))
参数HWND HWND,使图像可以呈现子控制rc文件_U_STRINGorID nIDResource,加载图像资源ID。常量CImageamp;图像,图像可以被预先加载到CImage对象,并通过在CPointamp;左上,左上的位置要放置图像,图像将呈现没有大小的变化历史首先发布,2011年4月27日|汤姆啧啧

回答

评论会员:游客 时间:2012/01/27
亲爱的作者,能否请您导出C#版本?感谢
always_online
评论会员:游客 时间:2012/01/27
。对不起,还有的没有这样的一个计划在不久的将来
cillen1
评论会员:{S2} 时间:2012/01/27
汤姆啧啧
评论会员:游客 时间:2012/01/27
支持一下,有没有MFC的版本的的呀,或者Win32的版本BR/
?汤姆啧啧
评论会员:游客 时间:2012/01/27
此代码是基于MFC版本,这是{A11}的一部分
汤姆啧啧
评论会员:游客 时间:2012/01/27
你的标题sayts,你要解释如何在图像上的水滴效果,但是这不是你解释什么。你告诉读者如何转换别人从MFC,WTL的代码。重命名的文章,或改写的文章来解释水效果更好,比你所引用的文章。{A12}戴夫Kreskowiak