在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口

合集下载

VC6.0下的GDI 配置

VC6.0下的GDI 配置

VC6.0下的GDI+配置GDI Plus 描述:GDIPlus是微软出的一个C++面向对象库,它为windows 的图形设备接口提供了更好的访问。

与标准的windows GDI 相比,二维绘图和图片使用得到很大改进。

使用GDIPlus你可以绘制定制的对象,打开各种图片并以各种格式存储它们,使用多种字体和文本绘制轨迹和各种调色板功能。

GDI Plus兼容性:GDIPlus最初是为MS Visual Studio 7开发的,但是因为这个产品的发布推迟了,所以微软就为Visual Studio 6发行了这个库的版本。

如果你使用Visual Studio 6,可以从这里下载MFC GDI Plus库文件。

/samples/mfcgdiplus.zipa)Visual Studio 7或者更新版本使用这个类库,只需要在你的工程里面包含<gdiplus.h>b)早期版本的MSVS要使用这个类库,需要将下载的zip 文件解压到一个文件夹,设其路径为your_path,然后将目录your_path\ gdiplus\includes加入到开发环境的包含路径中(Tools->Options->Directories-> Include files),然后在你的工程中你必须包含文件<gdiplus>,但是在那之前你必须定义define ULONG_PTR(这是GDIPlus中的一个定义,在老版本的VS中没有定义过)。

也就是说,在StdAfx.h 中你需要添加如下代码:#define ULONG_PTR ULONG#include <gdiplus.h>然后将目录your_path\gdiplus\lib包含到你的工程(Tools->Options->Directories->Library files),以使它们可以链接到你的程序。

创建分层窗口,实现图像渐变

创建分层窗口,实现图像渐变

创建分层窗口,实现图像渐变有没有方法创建一个半透明的窗口,并将该窗口上发生的所有鼠标事件都传递到桌面或另一个应用窗口处理?Scott Stringham 当然可以,并且相当容易。

你只要创建一个“分层窗口”即可。

我写了一个小程序叫lwtest 来示范如何做。

你可以下载源代码。

为了创建分层窗口,你需要扩展式样WS_EX_LAYERED,此外,为了能在透明窗口上进行鼠标点击,你还需要WS_EX_TRANSPARENT 扩展式样。

在窗口创建之后,你可以同时设置两个式样,MFC 代码如下:int CMainFrame::OnCreate(...){...ModifyStyleEx(0, WS_EX_LAYERED|WS_EX_TRANSPARENT);}ModifyStyle 和ModifyStyleEx 是专用的MFC CWnd 方法,其作用顾名思义。

如果你用C 语言编写,那么得调用GetWindowLong(GWL_EXSTYLE) 来获取扩展式样,然后必须调用SetWindowLong(GWL_EXSTYLE)来设置式样。

其效果与ModifyStyle(Ex)一样。

当然,你也可以在创建窗口的时候使用此式样。

一旦创建了分层窗0口,你便可以调用SetLayeredWindowAttributes 来设置透明度。

可用的分层窗口属性之一是LWA_ALPHA,它就是用来调整透明度的,取值范围从0(完全透明)到255(不透明)。

要得到半透明的效果,可以这样调用SetLayeredWindowAttributes:// in CMainFrame::OnCreateSetLayeredWindowAttributes(0, 255 * 0.50, LWA_ALPHA);这里我用乘法来表示一般公式;你可以仅用128,因为那是255 的一半(四舍五入)。

你还可以用专门的颜色作为透明色。

此时,你得用LWA_COLORKEY 作为属性,在第一个参数中指定COLORREF。

渐变透明图形的设计

渐变透明图形的设计

渐变透明图形的设计翼狐网:.yiihuu./ 摘要:今天跟大家分享一个简单的小教程,如何使用Adobe Illustrator CS6制作渐变透明图形,主要用到“矩形工具”、“混合工具”和“路径查找器”,希望能帮助到正在学习的你。

最终效果:1.绘制等边三角形选择“多边形工具”,在画布上鼠标左键点击一下,弹出“多边形”选项框,设置“边数”为3,半径为120px点击“确认”可得到1个等边三角形,如下图:选中该三角形,选择工具栏中的“比例缩放工具”,“等比”数值为50%,然后选择“复制”得到一个一半大小的等边三角形,选择中间的小三角形,旋转180°,并和大三角形顶部对齐,如下图:2.绘制圆形以小等边三角形的3个顶点作为圆心,边长的一半为半径,使用“椭圆工具”绘制一个圆形AI有智能参考线,画到三角顶点处下,圆形半径就是三角形边长的一半,所以可以不用刻意去量半径(为了方便查看图形效果,这里可以把圆形的透明度设置为50%,填充黄色)按住ALT键移动复制的方法,复制多个圆形,圆心移至等边三角形的各个点上,得到下图:3.使用路径查找器制作特殊图形在图形中间空白处,用“矩形工具”画一个方形,选择以下3个红色圆形和中间黄色的方形。

调出“路径查找器”面板(shift+ctrl+F9),使用“路径查找器”中的“联集”进行合并,得到右边的图形:再用“矩形工具”画一个大方形,超出原有图形大小,并将画好的方形置于底层(shift+ctrl+[)选择所有图形,使用“路径查找器”中的“分割”操作分割后图形如下(这里把图形拆出来看,具体操作的时候不用拆)用“直接选择工具”把多余的图形活着锚点删掉,得到以下左图;使用“路径查找器”的“联集进行”合并后填充颜色4.变换渐变选中合并后的图形,在菜单栏选择“效果—扭曲和变换—变换”,参数如下(可按需求自行调整):选中变换后的图形,在菜单栏选择“对象—扩展”,得到以下图形:先给图形取消编组(shift+ctrl+G),再统一设置透明度为3%,得到最终图形如下:零散的选择一些路径图形进行删除,得到下图(也可以选择不删除直接使用图形):简单排版后的效果:结语:希望大家喜欢本篇教程,非常感谢大家的阅读,祝大家学习愉快!。

PNG透明窗体全攻略(控件不透明)

PNG透明窗体全攻略(控件不透明)

PNG透明窗体全攻略(控件不透明)收藏源代码下载地址:/source/1604248编译环境:vc6+winxp sp3测试通过这两天在研究透明窗体,总算略有小成。

网上大部分文章都是介绍到把窗体弄透明就没有下文。

其实窗体透明并不难,难就难在透明的窗体上还要放控件。

今天我就把窗体透明一直到控件不透明怎么制作一块给写了吧。

先截张图诱惑下你们,如果你没兴趣就没必要再看下文了,有兴趣的话就继续往下看吧^_^!看好了,这是XP系统,未装.net。

我的Photoshop学的不太好,把玻璃片弄的太透了些,如果你们有好的美术,再加上这种技术,肯定会如鱼得水。

下面就来详细说说它的制作过程吧:第一步:在VC6中使用GDI+:你得从网上弄个GDI+ for XP的库,大约500K。

如果找不到的话,找我QQ要吧,我会把这个窗口的源程序一起发给你的。

把它解压后,将所有文件还包括子目录中的文件复制到你的项目目录。

在stdafx.h中加入以下代码:#include "gdiplus.h" ////请修改为你的头文件路径using namespace Gdiplus;#pragma comment(lib, "gdiplus.lib") ////请修改为你的.lib文件路径我的项目名为Test,所以在TestApp中加入全局变量ULONG_PTR gdiplusToken;在BOOL CTestApp::InitInstance()中加入这两行:GdiplusStartupInput gdiplusStartupInput;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);记住在线程退出后要御掉GDI+,它很占资源的,在int CTestApp::ExitInstance() 中加入这行:GdiplusShutdown(gdiplusToken);一切准备工作就绪,开始制作窗口了。

AE技巧 利用渐变透明度产生渐变效果

AE技巧 利用渐变透明度产生渐变效果

AE技巧:利用渐变透明度产生渐变效果Adobe After Effects(简称AE)是一款广泛应用于视频后期制作的软件,它提供了丰富的特效和工具,可以帮助我们创造出令人惊叹的视频效果。

在AE中,利用渐变透明度可以为图层添加渐变效果,使得图像在透明度上呈现平滑的变化,从而实现动画过程中的渐变过渡。

首先,在AE中导入你想要添加渐变效果的素材。

可以通过拖动素材文件到项目面板中完成导入,或者使用菜单中的“文件”>“导入”功能。

接下来,在“项目”面板中选择你导入的素材,并将其拖动到“合成”面板中创建一个新的合成。

在合成面板中,可以调整合成的属性,如宽度、高度、帧速率等。

然后,将素材拖动到时间轴中的图层面板上,对需要应用渐变效果的图层进行选中。

在图层面板中,选择需要应用渐变效果的属性,如透明度。

可以通过点击图层面板中的小三角形展开属性列表,并找到透明度属性进行调整。

在透明度属性上按右键,在弹出的菜单中选择“表达式助手”>“渐变”>“渐变填充”。

这将在透明度属性上应用一个渐变表达式,并打开渐变编辑器窗口。

在渐变编辑器窗口中,你可以调整渐变的样式和参数。

首先,选择渐变类型,有线性渐变、径向渐变和角度渐变三种。

根据需要选择其中一种。

然后,可以在渐变编辑器窗口中点击渐变条的两端,添加或删除渐变颜色节点。

通过调整节点的位置,可以控制颜色的变化。

另外,还可以调整节点的颜色,可以选择已有的颜色样式,也可以自定义颜色。

点击节点旁边的颜色框,选择你想要的颜色。

除了调整颜色,还可以调整节点的透明度。

通过拖动渐变条上的透明度节点,可以实现透明度的渐变效果。

渐变编辑器窗口中,还可以调整渐变的渐变点数量、渐变的角度或半径等参数,以及渐变的分布方式。

通过调整这些参数,可以实现更加复杂的渐变效果。

调整完渐变效果后,点击渐变编辑器窗口的确定按钮,即可应用渐变效果到选中的属性上。

最后,点击时间轴上的播放按钮,即可预览渐变效果。

GDI GDI+在绘图时使指定颜色透明的方法

GDI GDI+在绘图时使指定颜色透明的方法

Skystalker 2011-04-30 01:53今天学习GDI的BITMAP贴图,用三种办法实现了指定颜色透明,总结如下一、GDI下的方法,使用TransparentBlt,这是最麻烦的:CRect rc;GetDlgItem(IDC_STATIC_1)->GetWindowRect(&rc);ScreenToClient(&rc);CDC *pDC;pDC=GetDC();CBitmap FootballBMP;FootballBMP.LoadBitmap(IDB_BITMAP1);CDC ImageDC;ImageDC.CreateCompatibleDC(pDC);CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);TransparentBlt(pDC->m_hDC, rc.left, rc.top, 300, 300, ImageDC.m_hDC, 0, 0, 300, 300, RGB(0xff,0xff,0));二、把图片需要透明的地方直接做成透明的,这样用draw出来就是透明的。

二、利用CImage类,但这样做其他操作比如旋转就比较困难:CDC *pDC;pDC=GetDC();CImage myimage;myimage.Load(TEXT("Background.bmp"));myimage.TransparentBlt(pDC->m_hDC, rc.left, rc.top, 300, 300, RGB(0xff,0xff,0));三、利用ImageAttributes::SetColorKey 方法,但据说速度比较慢:MSDN的例子有说明:MSDN Library : Graphics and Multimedia / GDI+ / GDI+ Reference / Classed / Image Attributes / ImageAttributes Methods / SetColorKeyVOID Example_SetColorKey(HDC hdc){Graphics graphics(hdc);// Create an Image object based on a BMP file.// The image has three horizontal stripes.// The color of the top stripe has RGB components (90, 90, 20).// The color of the middle stripe has RGB components (150, 150, 150).// The color of the bottom stripe has RGB components (130, 130, 40).Image image(L "ColorKeyTest.bmp ");// Create an ImageAttributes object, and set its color key.ImageAttributes imAtt;imAtt.SetColorKey(Color(100, 95, 30), // 要透明的颜色范围高位如果把高位和低位颜色设成一样比如都是255 255 0,那就把黄色透明Color(250, 245, 60),// 要透明的颜色范围低位ColorAdjustTypeBitmap);// Draw the image. Apply the color key.// The bottom stripe of the image will be transparent because// 100 <= 130 <= 250 and// 95 <= 130 <= 245 and// 30 <= 40 <= 60.graphics.DrawImage(&image,Rect(20, 20, image.GetWidth(), image.GetHeight()), // dest rect0, 0, image.GetWidth(), image.GetHeight(), // source rectUnitPixel,&imAtt);}。

透明效果 掌握制作透明效果的技巧

透明效果 掌握制作透明效果的技巧

透明效果:掌握制作透明效果的技巧透明效果在设计和编辑中经常被使用,能够为图像增添层次感和艺术感。

在PhotoShop软件中,制作透明效果的技巧简单易学,下面将为你介绍几种实用的方法。

一、图层蒙版法图层蒙版法是常见的制作透明效果的方法之一。

首先,打开需要制作透明效果的图像,在图层面板上复制一份原始图层。

接着,在复制的图层上添加一个蒙版。

选中蒙版图层,使用画笔工具选择黑色,通过在图像上绘制黑色的笔刷,可以隐藏或部分隐藏图层的透明区域。

如果想要调整透明度的强度,可以通过控制黑色笔刷的大小和透明度来实现。

较大的笔刷和较高的透明度会使图层更加透明。

二、透明度调节器法透明度调节器法是另一种制作透明效果的常用方法。

选中需要调整透明度的图层,在图层面板上找到透明度选项。

通过滑动透明度滑块,可以调整图层的整体透明度。

滑动到左侧会增加透明度,滑动到右侧会降低透明度。

除了整体调整透明度,透明度调节器法还可以针对图层的特定区域进行透明度调整。

在图层面板上,选中图层,并选择透明度调节器工具。

通过在图像上绘制的笔刷,可以增加或减少图像特定区域的透明度。

三、渐变透明法渐变透明法可以为图层添加渐变的透明效果。

首先,在图层面板上选择需要添加渐变透明的图层。

然后,选择渐变工具,并在工具选项栏上选择渐变的类型和属性。

接下来,在图像上拖动渐变工具,使渐变效果覆盖到需要透明的区域上。

渐变的开始点是不透明的,结束点是完全透明的,中间的过渡会产生渐变的透明效果。

四、通道法通道法可以根据图像的颜色信息制作透明效果。

首先,在图层面板上选择需要制作透明效果的图层。

接着,打开通道面板,选择一个与图像颜色分布相关的通道,如红色通道。

在通道面板上复制所选通道,并将其重命名为“透明通道”。

然后,使用图像调整选项,如曲线调整或灰度调整,来调整图像颜色的分布。

更暗或者更亮的像素会变得更加透明。

以上是关于制作透明效果的几种常见技巧,你可以根据具体的设计需求选择适合的方法。

C#实现图像的透明处理

C#实现图像的透明处理

C#下实现图像透明处理以前编程实现图像的透明处理是比较困难的,代码量多,工作又复杂。

不过,现在随着微软开发工具的逐渐普及,伴随而来的新兴开发语言C#以及GDI+等新的编程机制正为广大开发人员所接受。

本文就向大家介绍在Visual C#中,如何运用GDI+中Alpha Blending技术实现图像的透明处理。

在各类有关.Net的技术论坛上常有人问如何实现透明的图像或图形效果,答案很简单,就是Alpha Blending技术。

Alpha Blending技术是一个混合各种颜色值并产生透明效果的过程。

具体的实现原理也很简单:在GDI+中,任何一种颜色由四种成分组成――Alpha,Red,Green和Blue。

其中的Alpha成分则代表了一种颜色的透明程度,它的值在0到255之间变化。

不言而喻,0代表完全透明而255则表示完全不透明。

因此,你只要用透明效果创建一种颜色并用该颜色来画图像就可以完成图像的透明处理了。

原理虽然比较简单,但是要初学者实际操作起来可能也并不是那么容易。

所以下面我就向大家展示一个很好的实例。

在该实例中,我先在窗体上画了一些图形,这些图形包括直线、曲线、椭圆等,同时这些图形有的是不透明的、有的是半透明的、有的是强透明的(注:其中的"强透明"意思为非常透明,几乎为全透明,但是又隐约可见)。

如果你有GDI+编程的一些基本知识,完成这些应该并不困难。

然后,我在这些图形上覆盖了一幅图像,在正常情况(也就是不透明的情况)下,窗体上的图形为图像所遮盖,所以应该是看不见的。

接着,我通过一个按钮的消息响应函数使得图像具有透明效果,这样一来的话,窗体上原来的那些图形就会浮现出来。

实现方法首先,打开,新建一个Visual C#的项目,选择模板为"Windows应用程序",同时不妨命名为"TransparentImage",图示如下:图1接着,进行窗体布局。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、概述GDI+的应用使得平面图形图象编程变的更加容易,本文以一个基于对话框的时钟程序为例,在VC6.0中调用*.png图片实现半透明渐变窗口,该程序实现了指针式和数字式两种时钟显示方式。

窗口实现了半透明渐变窗口、窗口拖动无移动矩形框、隐藏了任务栏窗体按钮等。

效果图如下:图一程序执行后与W indowXP桌面背景效果图二、准备工作1、图片资源准备工作。

首先在Photoshop中编辑好时钟的背景、时针、分针以及数字时钟显示方式的所有图片,如下图:将这些图片保存成为带透明通道的.png格式(GDI+调用显示时能够透明调背景)。

这样程序中图片资源就准备好了。

2、下面开始做好在VC6.0下展开此项工作的基本准备工作。

(1)、下载gdip lus forVC6.0的SDK,(总共两兆多)(2)、在C盘建立文件夹“GDI+”将开发包拷贝在里面,亦即建立如下路径,以便例子代码顺利编译(当然你可以放到任意你喜欢的地方,只要在你的Project中正确包含路径即可!)。

C:\GDI+\IncludesC:\GDI+\LibC:\GDI+\gdiplus.dll(3)在stdAfx.h中添加对GDI+环境的设置#define UNICODE#ifndef ULONG_PTR#define ULONG_PTR unsigned long*#endif#include "c:\gdi+\includes\gdiplus.h" ////请修改为你的头文件路径using namespace Gdiplus;#pragma comment(lib, "c:\\gdi+\\lib\\gdiplus.lib") ////请修改为你的.lib文件路径(4)在GDIPC lock.cpp中编辑app的Init Instance()中添加如下代码进行GD I+的初始化工作GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ......//在对话框程序结束后//关闭gdiplus的环境GdiplusShutdown(gdiplusToken);三、程序的实现全过程1、建立一个基于对话框的Project,这里的名称为GDIPClock2、在GDIPClockDlg.h中定义所有类成员变量,包括所有图片的指针和图片的长宽尺寸信息。

Image *m_pImageClock;Image *m_pImageClock1;Image *m_pImageHHour;Image *m_pImageHMinu;Image *m_pImageHSec;Image *m_pImageNum;int m_BakWidth , m_BakHeight ;int m_HourWidth, m_HourHeight;int m_MinuWidth , m_MinuHeight;int m_SecWidth , m_SecHeight ;HINSTANCE hFuncInst ;Typedef BOOL(WINAPI*MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*, COLORREF,BLENDFUNCTION*,DWORD);MYFUNC UpdateLayeredWindow;在这一步中需要特别说明的是,在创建透明窗口式需要调用一个W indows API函数UpdateLay eredW indow(),该函数在.net以上的版本的SDK中有申明,但是在VC6.0下要调用要么下载200多兆的高版本SDK,要么从动态链接库“User32.dll”中调用,这里选择从“User32.d ll”中调用。

以上定义中后三项就是为此作准备的。

3、在对话框的OnCreate()中添加如下代码:对2的函数和成员变量进行初始化!(其中ImageFromIDResource()函数为从资源中载入Png图像的一个方法!)int CGDIPClockDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CDialog::OnCreate(lpCreateStruct) == -1)return -1;hFuncInst = LoadLibrary("User32.DLL");BOOL bRet=FALSE;if(hFuncInst)UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");else{AfxMessageBox("User32.dll ERROR!");exit(0);}//初始化gdiplus的环境// Initialize GDI+.m_Blend.BlendOp=0;//theonlyBlendOpdefinedinWindows2000m_Blend.BlendFlags=0; //nothingelseisspecial...m_Blend.AlphaFormat=1; //...m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA// png图片添加到资源中了在"PNG"下:所以这里可以从资源中调用,// 这里Image没有提供字节调用资源中图像的函数,// ImageFromIDResource()是通过资源名称"PNG"和资源ID号将图像// 的Image指针传递给指针应用。

来完成的。

ImageFromIDResource(IDR_PNGBAK1,"PNG",m_pImageClock1);ImageFromIDResource(IDR_PNGNUM,"PNG",m_pImageNum);ImageFromIDResource(IDR_PNGBAK,"PNG",m_pImageClock);ImageFromIDResource(IDR_PNGHOUR,"PNG",m_pImageHHour);ImageFromIDResource(IDR_PNGMIN,"PNG",m_pImageHMinu);ImageFromIDResource(IDR_PNGSEC,"PNG",m_pImageHSec);m_BakWidth =m_pImageClock->GetWidth();m_BakHeight =m_pImageClock->GetHeight();m_HourWidth =m_pImageHHour->GetWidth();m_HourHeight=m_pImageHHour->GetHeight();m_MinuWidth =m_pImageHMinu->GetWidth();m_MinuHeight=m_pImageHMinu->GetHeight();m_SecWidth =m_pImageHSec->GetWidth();m_SecHeight =m_pImageHSec->GetHeight();::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,m_BakWidth,m_BakHeight,SWP_NOSIZE|SWP_NOMOVE );return 0;}4.在OnIn itDialog()种添加如下代码对调用透明窗体初始化和设置时钟进行刷新,代码意义有注解://启动后立刻更新窗口样式为透明窗体UpdateClockDisplay();SetTimer(1,500,NULL);//去除任务栏窗口对应按钮ModifyStyleEx (WS_EX_APPWINDOW,WS_EX_TOOLWINDOW ); void CGDIPClockDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultUpdateClockDisplay();CDialog::OnTimer(nIDEvent);}5、透明窗体创建于刷新,均调用以下函数完成,函数的参数表示整个窗体的透明度在该函数中包括了GDI+中对Im age.DrawIm age()函数的集中重载方式的使用,还有在GDI+中图像变换矩阵的使用初步研究。

BOOL CGDIPClockDlg::UpdateClockDisplay(int Transparent){HDC hdcTemp=GetDC()->m_hDC;m_hdcMemory=CreateCompatibleDC(hdcTemp);HBITMAPhBitMap=CreateCompatibleBitmap(hdcTemp,m_BakWidth,m_BakHeight );SelectObject(m_hdcMemory,hBitMap);if(Transparent<0||Transparent>100)Transparent=100;m_Blend.SourceConstantAlpha=int(Transparent*2.55);HDC hdcScreen=::GetDC (m_hWnd);RECT rct;GetWindowRect(&rct);POINT ptWinPos={rct.left,rct.top};Graphics graph(m_hdcMemory);Point points[] = { Point(0, 0),Point(m_BakWidth, 0),Point(0,m_BakHeight)};static bool bFly=false;bFly?graph.DrawImage(m_pImageClock, points, 3): graph.DrawImage(m_pImageClock1, points, 3);bFly=!bFly;int OxyX=140;//m_BakWidth/2+8;int OxyY=90;//m_BakHeight/2+10;SYSTEMTIME SystemTime; // address of system time structureGetLocalTime(&SystemTime);// 定义一个单位矩阵,坐标原点在表盘中央Matrix matrixH(1,0,0,1,OxyX,OxyY);// 时针旋转的角度度matrixH.Rotate(SystemTime.wHour*30+SystemTime.wMinute/2.0-180 );Point pointsH[] = { Point(0, 0),Point(m_HourWidth, 0),Point(0, m_HourHeight)};matrixH.Translate(-m_HourWidth/2,-m_HourHeight/6);// 用该矩阵转换pointsmatrixH.TransformPoints( pointsH, 3);graph.DrawImage (m_pImageHHour,pointsH, 3);// 定义一个单位矩阵,坐标原点在表盘中央Matrix matrixM(1,0,0,1,OxyX,OxyY);// 分针旋转的角度度matrixM.Rotate(SystemTime.wMinute*6-180);Point pointsM[] = { Point(0, 0),Point(m_MinuWidth, 0),Point(0, m_MinuHeight)};matrixM.Translate(-m_MinuWidth/2,-m_MinuHeight/6);// 用该矩阵转换pointsMmatrixM.TransformPoints( pointsM, 3);graph.DrawImage (m_pImageHMinu,pointsM, 3);// 定义一个单位矩阵,坐标原点在表盘中央Matrix matrix(1,0,0,1,OxyX,OxyY);// 秒针旋转的角度度matrix.Rotate(SystemTime.wSecond*6-180);Point pointsS[] = { Point(0,0),Point( m_SecWidth,0),Point(0,m_SecHeight )};matrix.Translate(-m_SecWidth/2,-m_SecHeight/7);// 用该矩阵转换pointsSmatrix.TransformPoints( pointsS, 3);graph.DrawImage (m_pImageHSec,pointsS, 3);//HH:MM:SS//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,0, 0,14*(SystemTime.wHour/10), 0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20,0,14*(SystemTime.wHour%10), 0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*2,0, 140,0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*3, 0,14*(SystemTime.wMinute/10), 0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*4,0,14*(SystemTime.wMinute%10), 0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*5,0, 140,0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*6, 0,14*(SystemTime.wSecond/10), 0,14,23,UnitPixel);//该函数从m_pImageClock中剪切指定rect中的像素draw到指定位置graph.DrawImage(m_pImageNum,20*7,0,14*(SystemTime.wSecond%10), 0,14,23,UnitPixel);SIZE sizeWindow={m_BakWidth,m_BakHeight};POINT ptSrc={0,0};DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&0x80000)!=0x80000)SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);BOOL bRet=FALSE;bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);graph.ReleaseHDC(m_hdcMemory);::ReleaseDC(m_hWnd,hdcScreen);hdcScreen=NULL;::ReleaseDC(m_hWnd,hdcTemp);hdcTemp=NULL;DeleteObject(hBitMap);DeleteDC(m_hdcMemory);m_hdcMemory=NULL;return bRet;}BOOL CGDIPClockDlg::ImageFromIDResource(UINT nID, LPCTSTR sTR,Image * &pImg){HINSTANCE hInst = AfxGetResourceHandle();HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(nID),sTR); // typeif (!hRsrc)return FALSE;// load resource into memoryDWORD len = SizeofResource(hInst, hRsrc);BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);if (!lpRsrc)return FALSE;// Allocate global memory on which to create streamHGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);BYTE* pmem = (BYTE*)GlobalLock(m_hMem);memcpy(pmem,lpRsrc,len);IStream* pstm;CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);// load from streampImg=Gdiplus::Image::FromStream(pstm);// free/release stuffGlobalUnlock(m_hMem);pstm->Release();FreeResource(lpRsrc);}void CGDIPClockDlg::OnLButtonDown(UINT nFlags, CPoint point) {//禁止显示移动矩形窗体框::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NUL L,0);//非标题栏移动整个窗口SendMessage(WM_SYSCOMMAND,0xF012,0);//PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,poi nt.y));CDialog::OnLButtonDown(nFlags, point);。

相关文档
最新文档