Windows Mobile 使用GDI实现BUTTON效果
如何在MFC中使用GDI技术
如何在MFC中使⽤GDI技术如何在MFC中使⽤GDI+技术1在stdafx.h⽂件中引⼊GDI+头⽂件#include <gdiplus.h>using namespace Gdiplus;2 初始化GDI+资源和销毁GDI+资源在项⽬APP⽂件中//声明GDI+全局变量ULONG_PTR gdiplusToken;BOOL CMFCAndGDIApp::InitInstance(){// 如果⼀个运⾏在Windows XP 上的应⽤程序清单指定要// 使⽤ComCtl32.dll 版本6 或更⾼版本来启⽤可视化⽅式,//则需要InitCommonControls()。
否则,将⽆法创建窗⼝。
InitCommonControls();//GDI+资源初始化GdiplusStartupInput gdiplusStartupInput;GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);CWinApp::InitInstance();// 初始化OLE 库if (!AfxOleInit()){AfxMessageBox(IDP_OLE_INIT_FAILED);return FALSE;}//其他系统⾃动⽣成的代码}//添加⼀个析构函数⽤来释放GDI+资源CMFCAndGDIApp::~CMFCAndGDIApp(){GdiplusShutdown(gdiplusToken);}3编译时加⼊GDIplus.lib⽂件在IDE中选择“项⽬|添加现有项⽬”,把GDIplus.lib⽂件添加进来,该⽂件⼀般在C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/PlatformSDK/Lib⽬录下4好了,现在可以在MFC中使⽤GDI+了void CMFCAndGDIView::OnDraw(CDC* /*pDC*/) { CMFCAndGDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc)return;//using GDI+Graphics myg(this->GetDC()->m_hDC); Pen pen(Color(255,0,255)); SolidBrush brush(Color(255,0,255));CRect rect;this->GetClientRect(&rect);myg.DrawEllipse(&pen,30,30,100,100);// TODO: 在此处为本机数据添加绘制代码}。
gdi控制方法
gdi控制方法
Gdi(图形用户界面)是一种用于创建和操纵计算机图形的工具,
通常用于Windows操作系统和Mac OS X等苹果操作系统。
以下是几种Gdi控制方法:
1. 绘制图形:Gdi可以绘制各种图形,如按钮、文本框、窗口、图形等。
使用Gdi绘制图形的方法包括:使用GdiCanvas创建图形对象、使用GdiBrush绘制轮廓、使用GdiFont绘制字体、使用GdiPath 创建路径、使用GdiColor设置颜色等。
2. 事件处理:Gdi可以监听各种事件,如鼠标点击、键盘按键等。
通过处理事件,可以响应用户的操作,如打开应用程序、保存文件等。
使用Gdi的事件处理方法包括:使用GdiWindows API处理鼠标点击事件、使用GdiMac API处理键盘按键事件等。
3. 对象管理:Gdi提供了多种对象管理方法,如创建、销毁、修改、移动、旋转等。
使用Gdi对象管理方法可以管理各种图形对象。
4. 3D图形:Gdi还可以创建3D图形,如三维按钮、窗口等。
使用Gdi的3D图形方法包括:使用Gdi边形创建3D表面、使用Gdi纹理创建3D效果、使用Gdi材质设置材质属性等。
Gdi是一种强大的图形界面工具,具有丰富的控制方法和多种图形绘制方法。
掌握Gdi的使用方法,可以为应用程序创建更加精美的界面。
一个GDI+发光文字特效(制作漂亮的图形按钮)
一个GDI+发光文字特效(制作漂亮的图形按钮)一个GDI+发光文字特效(制作漂亮的图形按钮)2010-06-28 20:43为了美化界面,有时候需要使用到图形按钮来使你的代码增色,这里提供一个用GDI+在程序运行期间自动生成发光文字图形的VFP代码,希望大家用的到。
效果:VFP CODE:*!* API声明DECLARE LONG GdipCreateBitmapFromScan0 IN GdiPlus.dll LONG,LONG,LONG,LONG,LONG,LONG @DECLARE LONG GdipSaveImageToFile IN Gdiplus.dll LONG,STRING,STRING,STRINGDECLARE LONG GdipDrawImageRect IN gdiplus.DLL LONG,LONG,SINGLE,SINGLE,SINGLE,SINGLEDECLARE LONG GdipCreateStringFormat IN GdiPlus.dll LONG,LONG,LONG @DECLARE LONG GdipCreateSolidFill IN GdiPlus.dll LONG,LONG @DECLARE LONG GdipCreateFontFamilyFromName IN GdiPlus.dll STRING,LONG,LONG @DECLARE LONG GdipGetImageGraphicsContext IN gdiplus.DLL LONG,LONG @DECLARE LONG GdipCreatePath INGDIPLUS.DLL LONG,LONG @DECLARE LONG GdipAddPathString IN GDIPLUS.DLL LONG,STRING,LONG,LONG,LONG,Single,STRING @,LONG DECLARE LONG GdipSetSmoothingMode IN GDIPLUS.DLL LONG,LONGDECLARE LONG GdipCreateMatrix2 IN GDIPLUS.DLL Single,Single,Single,Single,Single,Single,LONG @ DECLARE LONG GdipDrawPath IN GDIPLUS.DLL LONG,LONG,LONGDECLARE LONG GdipSetWorldTransform IN GDIPLUS.DLL LONG,LONGDECLARE LONG GdipCreatePen1 IN GDIPLUS.DLL LONG,Single,LONG,LONG @DECLARE LONG GdipCreateSolidFill IN GDIPLUS.DLL LONG Argb, LONG @SolibrushDECLARE LONG GdipFillPath IN GDIPLUS.DLL LONG graphics, LONG brush, LONG lpathDECLARE LONG GdipSetInterpolationMode IN GDIPLUS.DLL LONG,LONGDECLARE LONG GdipDeleteFontFamily IN GdiPlus.dll LONG DECLARE LONG GdipDisposeImage IN Gdiplus.dll LONGDECLARE LONG GdipDeleteGraphics IN gdiplus LONGDECLARE LONG GdipDeleteBrush IN GDIPLUS.DLL LONG**VFP应用程式算法群(12787940)行者孙:QQ310727570 *lparameterslcText,uFont,tnSize,AColor,FColor,tnWidth,tnHeight,uName lcText='Visual FoxPro Is Coll!'&&要绘制的文字uFont='Comic Sans MS'&&绘制文件的字体,必须是已注册的字体tnSize=26&&文字大小AColor=RGB(0,255,0)&&光圈颜色FColor=0&&字体颜色tnWidth=300&&图形宽度tnHeight=40&&图形高度uName='cool.png'&&图形保存后的文件名,这段代码中我把图形设置为了PNG格式w=tnWidthh=tnHeightaphpi=255&&透明度ApertureColor=CTOBIN(CHR(255)+LEFT(BINTOC(AColor,'4rs '),3),'4s')&&光圈颜色转为EAGB格式FontColor=CTOBIN(CHR(aphpi)+LEFT(BINTOC(FColor,'4rs'),3 ),'4s')&&字体颜色****创建graphics对象STORE 0 TO tnX,tnY,hBrush,loBmp,loGfx,Fillmode,lpath,lnFont,lnFontFamily,ln FormatHandle,x,ySTORE 0 TO matrix,lpen1,UnitWorld,lhBrush,loBmp1,oGfx,lhBrush2 lnFormat = 0x0026200A&&32位PNG格式stats=GdipCreateBitmapFromScan0(INT(tnWidth/5),INT(tnH eight/5),0,lnFormat,0,@loBmp)&&创建一个是原来1/5比例的位图GdipGetImageGraphicsContext(loBmp,@loGfx)GdipCreatePath(Fillmode,@lpath)&&创建一个路径****创建字体对象lcFontName=STRCONV(uFont+CHR(0),5)GdipCreateFontFamilyFromName(lcFontName,0,@lnFontFa mily)lnFontStyle=1&&字体类型,0默认,1加粗,2倾斜3=1+2加粗倾斜 4U 8 SthAlignment=3&&对其格式居左GdipCreateStringFormat(0,0,@lnFormatHandle )nAlign = lnFormatHandlelcRectangleF=BINTOC(x,'F')+BINTOC(y,'F')+BINTOC(INT(tnW idth),'F')+BINTOC(INT(tnHeight),'F')&&创建区域GdipAddPathString(lpath,STRCONV(lcText+0h00,5),LENC(lcT ext),lnFontFamily,lnFontStyle,tnSize,@lcRectangleF,lnFormatHan dle)&&填充路径GdipCreateMatrix2(1/5, 0, 0, 1/5, -1/5, -1/5,@matrix)&&建立一个矩阵SmoothingModeAntiAlias=4&&消除锯齿SmoothingModeNone= 3GdipSetSmoothingMode(loGfx,SmoothingModeAntiAlias)& &设置图形平滑度GdipSetWorldTransform(loGfx,matrix)tnWidth=3&&画笔宽度GdipCreatePen1(ApertureColor,tnWidth,UnitWorld,@lPen1) &&按光圈颜色建立画笔GdipDrawPath(loGfx,lPen1,lpath)&&绘制路径GdipCreateSolidFill(ApertureColor, @lhBrush)GdipFillPath(loGfx,lhBrush,lpath)GdipCreateBitmapFromScan0(w,h,0,lnFormat,0,@loBmp1)& &创建一个 zhengchang比例的位图GdipGetImageGraphicsContext(loBmp1,@oGfx)GdipSetSmoothingMode(oGfx,SmoothingModeAntiAlias)& &HighQualityBicubic =7GdipSetInterpolationMode(oGfx,HighQualityBicubic)&&GdipDrawImageRect(oGfx,loBmp,0,0,w,h)GdipCreateSolidFill(FontColor, @lhBrush2)GdipFillPath(oGfx,lhBrush2,lpath)******————保存图形文件到本地——————******lqEncoderClsID_PNG=0h06F47C55041AD3119A730000F81E F32E &&PNGGdipSaveImageToFile(lobmp1,STRCONV(uName+CHR(0),5), lqEncoderClsID_PNG,0)&&保存到本地******————销毁对象——————******GdipDeleteBrush(lhBrush)GdipDisposeImage(lobmp)GdipDeleteGraphics(loGfx)GdipDeleteBrush(lhBrush2)GdipDisposeImage(lobmp1)GdipDeleteGraphics(oGfx)。
c#GDI+之Button重绘(转)
c#GDI+之Button重绘(转)在.NET平台混总是⼊门容易进阶难。
最近在看GDI+,重写了⼀个⾃⼰的按钮,感觉还不错,值得推⼴,(*^__^*) 嘻嘻……写了⼀个绘制圆⾓Button的⼯具类:using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Drawing2D;namespace WinformLx.Class{enum buttonStyle{/// <summary>/// 正常为选中按钮/// </summary>ButtonNormal,/// <summary>/// 获得焦点的按钮/// </summary>ButtonFocuse,/// <summary>/// ⿏标经过样式/// </summary>ButtonMouseOver,/// <summary>/// 获得焦点并⿏标经过/// </summary>ButtonFocuseAndMouseOver}/// <summary>/// ⾃定义GDI⼯具,绘制按钮/// </summary>class Util_GDI{/// <summary>/// 绘制圆形按钮(⽤法同矩形按钮)/// </summary>/// <param name="text"></param>/// <param name="g"></param>/// <param name="Location"></param>/// <param name="r"></param>/// <param name="btnStyle"></param>public static void DrawCircleButton(string text, Graphics g, Point Location, int r, buttonStyle btnStyle){Graphics Gcircle = g;Rectangle rect = new Rectangle(Location.X, Location.Y, r, r);Pen p = new Pen(new SolidBrush(Color.Black));Gcircle.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;Gcircle.DrawEllipse(p, rect);if (btnStyle == buttonStyle.ButtonFocuse){Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#338FCC")), rect);}else if (btnStyle == buttonStyle.ButtonMouseOver){Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect);}else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver){Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect);}p.DashStyle = DashStyle.Dash;if (btnStyle != buttonStyle.ButtonNormal){Gcircle.DrawEllipse(p, new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4));//虚线框}Gcircle.FillEllipse(new SolidBrush(Color.WhiteSmoke), new Rectangle(rect.X + 3, rect.Y + 3, rect.Width - 6, rect.Height - 6)); StringFormat sf = new StringFormat();sf.Alignment = StringAlignment.Center;sf.LineAlignment = StringAlignment.Center;Gcircle.DrawString(text, new Font(new FontFamily("宋体"), 10), new SolidBrush(Color.Black), rect, sf);p.Dispose();}/// <summary>/// 绘制圆⾓按钮/// </summary>/// <param name="Text">要绘制的⽂字</param>/// <param name="g">Graphics 对象</param>/// <param name="rect">要填充的矩形</param>/// <param name="btnStyle"></param>public static void DrawRoundButton(string Text, Graphics g, Rectangle rect,buttonStyle btnStyle){//g.Clear(Color.White);g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿Rectangle rectangle = rect;Brush b = b = new SolidBrush(Color.Black);if (btnStyle == buttonStyle.ButtonFocuse){b = new SolidBrush(ColorTranslator.FromHtml("#338FCC"));}else if (btnStyle == buttonStyle.ButtonMouseOver){b = new SolidBrush(ColorTranslator.FromHtml("#C6A300"));}else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver){b = new SolidBrush(ColorTranslator.FromHtml("#C6A300"));}g.DrawPath(new Pen(b),GetRoundRectangle(rectangle, 2));rectangle = new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4);Pen p=new Pen(Color.Black,0.5f);p.DashStyle = DashStyle.Dash;if (btnStyle == buttonStyle.ButtonFocuse || btnStyle == buttonStyle.ButtonFocuseAndMouseOver){g.DrawRectangle(p,rectangle);//虚线框}g.FillRectangle(new SolidBrush(Color.WhiteSmoke),rectangle);//⽩⾊背景StringFormat sf = new StringFormat();sf.Alignment = StringAlignment.Center;sf.LineAlignment = StringAlignment.Center;g.DrawString(Text, new Font("宋体", 10), new SolidBrush(Color.Black), rectangle, sf);p.Dispose();b.Dispose();g.SmoothingMode = SmoothingMode.Default;}/// <summary>/// 根据普通矩形得到圆⾓矩形的路径/// </summary>/// <param name="rectangle">原始矩形</param>/// <param name="r">半径</param>/// <returns>图形路径</returns>private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r){int l = 2 * r;// 把圆⾓矩形分成⼋段直线、弧的组合,依次加到路径中GraphicsPath gp = new GraphicsPath();gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y));gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F);gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r)); gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F);gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom)); gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F);gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r));gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F);return gp;}}}新建⼀个cs命名为MyButton,继承Button类,重写Button类的Paint⽅法:using System;using System.Windows;using System.Drawing;using System.Drawing.Drawing2D;using System.Windows.Forms;using WinformLx.Class; //引⽤之前⼯具类的命名空间namespace erControls{public class MyButton : System.Windows.Forms.Button{private bool mouseover = false;//⿏标经过public MyButton(){this.Cursor = System.Windows.Forms.Cursors.Hand;}protected override void OnPaint(PaintEventArgs e){//在这⾥⽤⾃⼰的⽅法来绘制Button的外观(其实也就是⼏个框框)Graphics g = e.Graphics;g.Clear(this.BackColor);Rectangle rect = e.ClipRectangle;rect = new Rectangle(rect.X,rect.Y,rect.Width-1,rect.Height-2);//g.ReleaseHdc();if (mouseover){if (Focused){Util_GDI.DrawRoundButton(this.Text, g, rect, buttonStyle.ButtonFocuseAndMouseOver);return;}Util_GDI.DrawRoundButton(this.Text, g, rect, buttonStyle.ButtonMouseOver);return;}if (Focused){Util_GDI.DrawRoundButton(this.Text, g, rect, buttonStyle.ButtonFocuse);return;}Util_GDI.DrawRoundButton(this.Text, g, rect, buttonStyle.ButtonNormal);}protected override void OnMouseEnter(EventArgs e){mouseover = true;base.OnMouseEnter(e);}protected override void OnMouseLeave(EventArgs e){mouseover = false;base.OnMouseLeave(e);}}}上⾯的⼯作完成以后会在vs的⼯具栏发现刚刚⾃⼰写的那个MyButton新建⼀个窗⼝,拖上去就可以了。
Windows Mobile手机游戏(基础教程)
用GAPI开发Windows Mobile手机游戏(基础教程)操纵GAPI (1)判断是否是标准显示设备 (3)开始绘制像素 (4)GAPI高效贴图 (4)Gapi键盘消息 (8)游戏的振动感 (9)获得振动设备属性 (9)开始第一手机游戏历程 (11)第三方开发库介绍 (13)打开显示设备 (13)取回主界面和后背缓冲 (15)失败的界面 (17)结论 (18)作者:傅曦目前mobile phone 游戏API简称GAPI为手机上的游戏开发者提供了强有力的高效率的编程接口,当然GAPI不仅仅使用在游戏方面,需要高效率图形显示处理的地方都可以使用GAPI。
GAPI是基于动态连接库方式,应用程序直接调用动态库里的函数,一般GAPI库的文件名为GX.dll,目前mobile phone里都提供了gx.dll文件。
一个典型的游戏或者应用程序使用下列GAPI函数:∙OpenDisplay (fullscreenflag)打开GAPI显示功能。
∙OpenInput打开直接响应硬件键盘输入消息功能∙GetDisplayProperties获得VFB详细结构信息∙GetDefaultKeys获得缺省的键值操纵GAPI开始一个游戏编写,首先要打开GAPI显示功能,获得控制视频显示缓存的控制权限。
可以调用GXOpenDisplay(HWND hwnd, DWORD dwFlags)hwnd参数是游戏程序的窗口句柄,dwFlags定义了显示模式,宏GX_FULLSCREEN定义全屏模式,就能对设备的全屏区域进行控制。
返回值1说明打开成功,0是失败。
虽然都是使用mobile phone系统但是不同系列的产品可能使用不同的显示设备,那么对于不同的显示设备就可能有不同的显示性能参数,不同的分辨率率,不同的色深,不同的颜色显示能力。
当在编写一个为mobile phone 系列运行的游戏程序时不得不考虑这些问题,以使程序能适应在不同的显示环境下达到程序所希望的显示效果。
GDI(widowsAPI函数)讲解
GDI相关函数说明AddFontResource 在Windows系统中添加一种字体资源CreateFont 用指定的属性创建一种逻辑字体CreateFontIndirect 用指定的属性创建一种逻辑字体CreateScalableFontResource 为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统DrawText 将文本描绘到指定的矩形中DrawTextEx 与DrawText相似,只是加入了更多的功能EnumFontFamilies 列举指定设备可用的字体EnumFontFamiliesEx 列举指定设备可用的字体EnumFonts 列举指定设备可用的字体ExtTextOut 经过扩展的文本描绘函数。
也请参考SetTextAlign函数GetAspectRatioFilterEx 用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时,本函数可判断纵横比大小GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串GetCharWidth 调查字体中一个或多个字符的宽度GetFontData 接收一种可缩放字体文件的数据GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息GetKerningPairs 取得指定字体的字距信息GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息GetRasterizerCaps 了解系统是否有能力支持可缩放的字体GetTabbedTextExtent 判断一个字串占据的范围,同时考虑制表站扩充的因素GetTextAlign 接收一个设备场景当前的文本对齐标志GetTextCharacterExtra 判断额外字符间距的当前值GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息GetTextColor 判断当前字体颜色。
Windows Form GDI绘图
加载及显示位图
使用Graphics类的DrawImage方法剪裁及缩放 对象 DrawImage方法的某些重载接受两个参数: Bitmap object 以及Rectangle object 想要剪裁及缩放图像,可指定适当的矩形大小
剪裁及缩放图像
旋转、倾斜及折射图像
◦ –使用DrawImage方法并通过指定左上角、右上角、 左下角的目标坐标来实现
◦ –Windows提供的典型图案填充图形
TextureBrush: 纹理画刷 LinearGradientBrush: 渐变画刷
◦ –用平滑过渡的颜色来填充一个图形
PathGradientBrush: 路径渐变画刷
◦ –基亍某一路径,用复杂的混合色渐变进行填充
画刷(Brush)
Brushes类型
颜色(Color)
颜色的HSB模型
Hue:色调0…360 Saturation:饱和度0…1
Brightness:亮度0…1
颜色(2)
创建Color对象: Color clr; clr= Color.FromArgb(255, 255, 0, 255)
另一个方法: Color.FromKnownColor(…)
创建Hatch实心形状
使用gradient brush实现渐变的颜色
创建Gradient实心形状
使用path gradient brush实现用渐变的颜色 填充图形,彩色渐变是从路径的中点到路径的外 边界边缘的平滑的彩色渐变
创建Path Gradient实心形状
颜色的alpha值表示颜色的透明度 创建透明的对象,须将alpha值设置为小亍 ‘255’
mfc中gdiplusstartup函数
MFC(Microsoft Foundation Class)是微软公司推出的面向Windows评台的一种C++程序设计框架,旨在简化Windows应用程序的开发过程。
在MFC中,GDI+(Graphics Device Interface Plus)是用于创建和操作2D图形和图像的API,提供了更丰富的绘图功能和更好的性能。
在实际开发中,我们经常会使用到GDI+库来进行图形绘制和处理。
在MFC中,GdiplusStartup函数是为了初始化GDI+库而存在的。
以下是关于MFC中GdiplusStartup函数的相关内容:1. GDI+的初始化GDI+是一个用于图形绘制和处理的强大工具,但在使用之前,我们需要先对其进行初始化。
在MFC中,可以通过调用GdiplusStartup函数来实现GDI+的初始化工作。
2. GdiplusStartup函数的参数GdiplusStartup函数包含了多个参数,其中最常用的参数包括输入的指向一个GdiplusStartupInput结构的指针,以及一个指向GdiplusStartupOutput结构的指针。
这些参数用于指定GDI+的初始化配置和获取初始化的状态信息。
3. GDI+的初始化配置GdiplusStartupInput结构用于指定GDI+的初始化配置,包括扩展的版本号、GDI+库的管理模式以及其他相关信息。
通过配置这些参数,我们可以灵活地控制GDI+的初始化过程,以适应不同的开发需求。
4. 初始化结果的获取GdiplusStartupOutput结构用于获取GDI+的初始化结果,包括GDI+库的版本号、Token值以及其他相关信息。
这些信息对于后续的图形操作和资源管理非常重要,因此能够准确获取初始化结果是非常关键的。
5. GDI+的释放除了初始化之外,GDI+的释放同样是一个重要的工作。
在MFC中,我们可以通过调用GdiplusShutdown函数来释放GDI+库所占用的资源,确保程序运行的稳定性和高效性。
GDI原理
GDI原理GDI,全称为图形设备接口(Graphics Device Interface),是一种用于在Windows操作系统中绘制图形的技术。
它提供了一种将图形显示在屏幕上的标准方法,同时也是Windows应用程序与显示设备之间通信的桥梁。
在本文中,我们将深入探讨GDI的原理及其工作方式。
首先,GDI通过使用设备无关的图形对象(如画笔、画刷、字体等)来描述图形。
这些图形对象可以在不同的输出设备上进行绘制,而无需对应用程序进行修改。
这种设备无关性使得GDI成为了一种非常灵活的图形绘制技术。
其次,GDI通过使用设备上下文(Device Context,简称DC)来实现图形的绘制。
设备上下文是一个与设备相关的数据结构,它包含了绘制图形所需的各种参数和信息。
应用程序可以通过GDI函数来获取设备上下文,并在其上进行图形的绘制操作。
另外,GDI还提供了一系列的绘图函数,用于在设备上下文中进行各种图形的绘制操作。
这些函数包括了直线绘制、矩形绘制、圆形绘制、文本输出等功能。
通过调用这些函数,应用程序可以实现各种复杂的图形绘制效果。
除此之外,GDI还支持图形的变换和组合操作。
应用程序可以通过GDI函数来对图形进行平移、旋转、缩放等变换操作,也可以将多个图形进行组合,实现复杂的图形效果。
最后,GDI通过使用裁剪区域来限制图形的绘制范围。
裁剪区域是一个与设备相关的区域,它可以用来限制图形的绘制范围,从而实现局部图形的显示和隐藏。
总的来说,GDI是一种强大而灵活的图形绘制技术,它为应用程序提供了丰富的图形绘制功能,并且具有良好的设备无关性。
通过使用GDI,应用程序可以实现各种复杂的图形效果,从而提升用户界面的质量和用户体验。
在本文中,我们对GDI的原理及其工作方式进行了深入的探讨,希望能够帮助读者更好地理解和应用GDI技术。
通过对GDI的学习和掌握,我们可以更加轻松地实现各种复杂的图形效果,从而为用户提供更加丰富和优秀的应用程序。
GDI+的使用方法
在应用程序中使用GDI+库应该遵循一下步骤:1.包含Gdiplus.h头文件,如果图方便,加上:using namespace Gdiplus;这样使用GDI+中的任何东西就不需要重新指定命名空间了。
2.链接DLL的导入库Gdiplus.lib。
在VS中有两种方法,一是直接在项目属性->链接->输入中填入Gdiplus.lib;二是直接使用编译器原语:#pragma comment(lib, "Gdiplus.lib")3.在调用任何GDI+函数前一定要调用GDI+库初始化函数GdiplusStartup(),初始化GDI+库。
4.在确定不需要使用任何GDI+函数并且所有GDI+对象均已销毁(变量超过了生存期),需要调用GDI+关闭函数GdiplusShutdown()。
GDI+支持多线程,所以可以在任意一个线程中调用。
1.在Stdafx.h头文件中添加如下代码#include <GdiPlus.h>#pragma comment(lib, "Gdiplus.lib")2.在CGdiplusTestApp类中,添加两个变量,用于GDI+初始化函数。
private:Gdiplus::GdiplusStartupInputgdiplusStartupInput;ULONG_PTR gdiplusToken;3.在CGdiplusTestApp::InitInstance()函数中添加如下代码,一定要在pMainFrame-> ShowWindow(m_nCmdShow)之前,建议添加在CWinAppEx::InitInstance()之后。
// Initialize GDI+.Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);4.重载CGdiplusTestApp的ExitInstance()函数,然后添加GDI+关闭函数。
GDI
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
感谢观看
GDI+在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions唯一可进 行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换 (譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就 可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备 及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方 便了开发工作。
你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效 果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜 色与背景色相互融合,填充色越透明,背景色显示越清晰,四个椭圆被填充了同样的颜色,但由于拥有不同的透 明度而呈现不同的显示效果。
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩 阵对象总是和一个图形变换对相起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接 受矩阵对象的,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照 先缩放后旋转完成。
Windows GDI和GDI
Windows GDI和GDI+编程实例全剖析(2) 2005年11月11日 10:06 天极yeskyMFC使用GDI+编程设置VC2005“项目/*属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入GdiPlus.lib 后按“应用”钮,最后按“确定”钮关闭对话框。
在需要用到GDI+的文件头加上下面两句#include <gdiplus.h>using namespace Gdiplus;在应用程序类应用程序类(CGDIPlusDemoApp) 头文件中声明一个成员变量:ULONG_PTR m_gdiplusToken; // ULONG PTR 为int64 类型并在该类的初始化函数CGDIPlusDemoApp::InitInstance() 中加入以下代码来对GDI+进行初始化:GdiplusStartupInput gdiplusStartupInput;GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);注意:这两个语句必须加在应用程序类的InitInstance函数中的CWinApp:: InitInstance ();语句之前,不然以后会造成视图窗口不能自动重画、程序中不能使用字体等等一系列问题。
还要在CGDIPlusDemoApp::ExitInstance() 函数(重写)中加入以下代码来关闭GDI +:GdiplusShutdown(m_gdiplusToken);上面是所需步骤..MFC使用GDI+编程基础封装在GDI+ API中的各种C++类、函数、常量、枚举和结构,都被定义在Gdiplus.h头文件所包含的一系列头文件中。
所以,采用MFC进行GDI+编程,必须包含Gdiplus.h头文件。
封装在GDI+类中方法,最后都需要调用GDI+平面API中的相关底层函数,才能完成实际的操作。
button控件的使用流程
Button控件的使用流程1. 简介Button(按钮)是一种常见的用户界面控件,用于触发特定的操作或事件。
在软件应用中,Button通常用于提交表单、执行命令、切换选项等功能。
2. Button的基本属性在使用Button控件之前,我们需要了解一些基本属性,以便正确地配置和使用Button。
以下是Button控件的常见属性:•Text: 按钮上显示的文本。
•Enabled: 按钮是否可用。
•Visible: 按钮是否可见。
•Width: 按钮的宽度。
•Height: 按钮的高度。
•Background Color: 按钮的背景颜色。
•Text Color: 按钮上文本的颜色。
3. 创建Button控件在使用Button控件之前,我们首先需要在应用界面中创建并配置Button控件。
以下是创建Button控件的步骤:1.打开应用界面的布局文件。
2.找到你想要放置Button控件的位置。
3.在布局文件中添加Button控件的代码,可以使用XML或代码两种方式添加。
4.配置Button控件的属性,如Text、Enabled等。
5.保存并关闭布局文件。
4. 设置Button事件处理程序Button控件的主要功能是响应用户的点击事件,执行相关操作或命令。
为了实现这种功能,我们需要为Button控件设置事件处理程序。
以下是设置Button事件处理程序的步骤:1.打开Activity或Fragment代码文件。
2.找到Button控件的引用。
3.使用setOnclickListener方法为Button控件设置点击事件监听器。
4.在监听器中实现Button的点击逻辑。
5. Button的常见用途Button作为一种常见的用户界面控件,具有广泛的应用场景。
以下是Button控件的一些常见用途:•提交表单:在表单中使用Button控件,用户点击按钮后,将表单数据提交到服务器或本地存储。
•执行命令:在应用中实现特定功能的命令按钮,例如删除、保存、关闭等。
mfc button 的使用方法
mfcbutton的使用方法MFC(MicrosoftFoundationClass)是一个在Windows平台上广泛使用的C++类库,它为开发者提供了强大的工具来构建图形用户界面(GUI)。
在这个部分,我们将深入探讨如何使用MFCButton控件。
一、创建MFC按钮首先,在MFC应用程序中添加一个新的按钮控件。
你可以通过在资源视图中双击工具箱中的按钮来创建新的按钮。
你也可以通过编程方式添加按钮,这通常在创建窗口或对话框时进行。
二、设置按钮属性创建并添加按钮后,你可以通过编程方式设置其属性,如标题、图标等。
例如,你可以使用`SetWindowText`函数设置按钮的标题。
同样,你也可以使用`SetIcon`函数添加图标。
三、响应按钮事件MFCButton控件提供了许多事件,如单击、双击等。
你可以通过重写按钮的`OnClick`或`OnDblClk`函数来响应这些事件。
这些函数通常用于执行特定的操作,如显示对话框、启动新线程等。
四、使用按钮控件变量为了方便操作,你可以将按钮控件封装为一个变量。
这样,你就可以使用这个变量来获取和设置按钮的状态,如选中/未选中状态、是否显示图标等。
五、动态调整按钮大小有时,你可能需要根据用户的屏幕分辨率或窗口大小来动态调整按钮的大小。
你可以使用`SetBoundsRect`函数来设置按钮的大小和位置。
此外,你还可以使用`GetClientRect`函数获取窗口的客户区大小,以便在需要时调整按钮的大小。
六、总结使用MFCButton控件可以使你的应用程序更加友好和易于使用。
通过设置属性、响应事件、使用变量以及动态调整大小,你可以轻松地使用MFCButton控件。
在实际应用中,你可能还需要考虑一些其他因素,如异常处理、资源释放等。
希望这篇文章能帮助你更好地理解和使用MFCButton控件。
devexpress buttonedit用法
devexpress buttonedit用法DevExpress ButtonEdit 是一个非常实用的控件,用于在界面上显示一个按钮和一个编辑框,用户可以通过点击按钮或者直接在编辑框中输入数据。
它的用法非常简单,下面我将详细介绍如何在WinForms中使用DevExpress ButtonEdit。
1. 引用DevExpress组件库:在使用DevExpress ButtonEdit之前,首先需要在项目中引用DevExpress组件库。
可以通过NuGet安装DevExpress WinForms组件库或手动引用DevExpress dll文件。
2. 在窗体中添加ButtonEdit控件:打开窗体设计器,从工具箱中找到ButtonEdit控件并拖拽到窗体上。
之后可以通过属性窗口修改控件的属性,如大小、位置、外观等。
3. 设置ButtonEdit的按钮文本和操作:在ButtonEdit控件的属性窗口中可以找到ButtonEditProperties按钮属性。
通过设置该属性可以修改按钮的文本,例如将按钮文本设置为“选择”。
4. 处理ButtonEdit按钮点击事件:ButtonEdit控件的按钮被点击后,我们可以通过处理ButtonEdit.ButtonClick 事件来执行相应的操作。
在ButtonEdit的事件属性窗口中双击ButtonClick事件即可创建对应的事件处理方法。
5. 获取ButtonEdit的编辑框中的值:通过ButtonEdit的EditValue属性可以获取或设置编辑框中的值。
可以在ButtonClick事件处理方法中使用该属性来获取编辑框中的值,并执行相应的逻辑。
6. 设置ButtonEdit的验证:ButtonEdit控件可以进行输入的验证,例如限制只能输入数字、邮箱等。
在ButtonEdit的属性窗口中可以找到ButtonEditProperties.Mask属性来设置验证规则。
mfc button 的使用方法 -回复
mfc button 的使用方法-回复MFC(Microsoft Foundation Classes)是微软公司推出的一组C++类库,它提供了一种使用面向对象的编程方法来开发Windows应用程序。
MFC被广泛用于创建窗口、对话框、控件以及处理用户输入等任务。
在MFC中,按钮也是常见的控件之一,它可以用于触发特定的操作或执行特定的代码。
本文将详细介绍在MFC中使用按钮控件的方法。
首先,要使用按钮控件,我们需要创建一个对话框或窗口。
在MFC中,可以使用资源编辑器来设计对话框或窗口的布局。
你可以在工具箱中找到按钮控件,并将其拖放到你想要放置按钮的位置。
一旦按钮控件被放置到对话框或窗口中,你可以使用类向导来关联一个成员变量到按钮控件。
在Visual Studio的类向导中,你可以通过右键单击对话框或窗口类,选择“添加变量”的选项来打开类向导。
在类向导中,选择“控件变量”选项卡,并点击“添加变量”按钮。
接下来,会弹出一个对话框,允许你选择按钮控件的类型以及成员变量的名称。
你可以选择按钮控件的类型,例如普通按钮(Button)、单选按钮(Radio)或复选框(Checkbox)。
选择一个有意义的变量名,以便于在代码中引用该按钮控件。
点击“完成”按钮,类向导将为你自动生成一个变量。
现在,你可以在代码中使用这个按钮控件的成员变量来操作它。
你可以在成员函数中添加相关的事件处理代码,例如在按钮被点击时执行某些操作。
在MFC中,按钮的点击事件通常是通过`OnBnClicked`函数来处理的。
在你的对话框或窗口类中,你可以找到一个与按钮控件关联的`OnBnClicked`函数。
你可以在这个函数中编写相关的代码。
例如,如果你想在按钮被点击时显示一个消息框,你可以在`OnBnClicked`函数中添加以下代码:cppvoid CMyDialog::OnBnClickedButton(){MessageBox(_T("按钮被点击了!"), _T("提示"), MB_OK);}在上面的代码中,`MessageBox`函数用于显示一个消息框,第一个参数是要显示的文本内容,第二个参数是消息框的标题,第三个参数是消息框的类型(例如确定按钮、取消按钮等)。
gdi 写文本基本用法
gdi 写文本基本用法在 GDI+ 中,可以使用 Graphics 类来绘制文本。
以下是一个简单的示例,演示了如何在 Windows Forms 应用程序中使用 GDI+ 绘制文本:首先,需要创建一个 Windows Forms 应用程序,并在窗体上添加一个 PictureBox 控件。
然后,在窗体的 Paint 事件中编写以下代码:cprivate void Form1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;string text = "Hello, world!";Font font = new Font("Arial", 12);PointF point = new PointF(50, 50);// 设置文本的格式TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter;// 绘制文本g.DrawString(text, font, Brushes.Black, point, flags);}这段代码首先创建了一个 Graphics 对象,该对象表示窗体上的绘图表面。
然后,定义了一个字符串变量 text,用于存储要绘制的文本。
接着,创建了一个 Font 对象,该对象表示要使用的字体和字体大小。
然后,定义了一个 PointF 对象,该对象表示文本的起始位置。
最后,使用 TextFormatFlags 枚举来设置文本的对齐方式和垂直对齐方式,并使用Graphics 对象的 DrawString 方法将文本绘制到窗体上。
在上面的代码中,我们使用了 Arial 字体和黑色画刷来绘制文本。
当然,您可以使用其他字体、颜色和样式来绘制文本,以满足您的需求。
gdi控制方法
gdi控制方法
GDI(图形设备接口)是一组函数和数据结构,用于在Microsoft Windows 操作系统上创建和操纵图形对象。
下面是一些控制GDI 的方法:
1. 创建GDI 对象:使用GDI 函数创建诸如窗口、菜单、按钮、位图、画笔和画刷等可视对象。
2. 设置GDI 对象的属性:使用GDI 函数设置对象的属性,例如设置画刷颜色、字体、线宽等。
3. 绘制GDI 对象:使用GDI 函数将对象绘制到屏幕上。
4. 裁剪GDI 对象:使用GDI 函数裁剪对象的可见部分,以允许对象的部分重叠或不重叠。
5. 转换GDI 对象:使用GDI 函数将对象移动、旋转或缩放来改变对象的位置和尺寸。
6. 销毁GDI 对象:使用GDI 函数释放GDI 对象占用的系统资源。
以上是一些常见的控制GDI 的方法,当然还有更多的GDI 函数和属性可用。
cmfcbutton 用法
cmfcbutton 用法CMFCButton 是 MFC(Microsoft Foundation Class)框架中的一个类,它是用于创建和管理按钮的控件。
在使用 CMFCButton 进行按钮的创建和管理时,可以按照以下步骤进行操作:1. 在 Visual Studio 中创建 MFC 项目并进入资源视图,选择 Dialog 框的设计器。
2. 在 Dialog 框的设计器中选择“按钮”工具,绘制一个按钮控件,并为其指定一个 ID。
3. 在 Dialog 类的头文件中添加一个成员变量,将其设置为 CMFCButton 类型,并赋予按钮的 ID。
4. 在 OnInitDialog() 函数中调用 CMFCButton 类的 Create() 函数,创建按钮的实例。
5. 在按钮的回调函数中添加相应的逻辑处理。
以下是使用 CMFCButton 的一个简单示例:首先,在 Visual Studio 中创建一个新的 MFC 对话框项目,然后按照上述步骤进行操作。
步骤1:在资源视图中选择 Dialog 框的设计器,双击打开 Dialog 对话框设计器。
步骤2:在设计器中选择“按钮”工具,绘制一个按钮控件,并为其指定一个ID。
例如,将按钮的 ID 设置为 IDC_BUTTON。
步骤3:在 Dialog 类的头文件中添加一个 CMFCButton 类型的成员变量,将其设置为按钮的 ID。
例如,添加以下代码:```cppCMFCButton m_btn;```步骤4:在 OnInitDialog() 函数中调用 CMFCButton 类的 Create() 函数,创建按钮的实例,并设置按钮的样式、文本和位置。
例如,添加以下代码:```cppBOOL CMyDialog::OnInitDialog(){CDialogEx::OnInitDialog();// 创建按钮实例m_btn.Create(_T("我的按钮"), WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON, CRect(10, 10, 100, 30), this, IDC_BUTTON);return TRUE;}```步骤5:在按钮的回调函数中添加相应的逻辑处理。
gdi+原理
GDI (Graphics Device Interface) 是一种图形设备接口,它提供了一组函数和数据结构,用于在计算机屏幕上绘制图形和文本。
GDI 的工作原理可以简单概括如下:
1. 设备无关性:GDI 提供了一套抽象的图形操作接口,使得应用程序不需要关心底层硬件的差异。
它可以在不同类型的图形设备(如显示器、打印机)上执行相同的绘图操作。
2. 句柄管理:GDI 使用句柄来标识各种图形对象,例如窗口、画刷、字体等。
应用程序通过创建和使用这些句柄来操作图形对象。
GDI 负责管理这些句柄,包括分配、释放和查询对象。
3. 绘图操作:GDI 提供了一系列函数,用于在设备上进行绘图操作。
这些函数包括绘制线条、填充区域、绘制文本等。
应用程序可以根据需要调用这些函数来实现所需的图形效果。
4. 坐标系统:GDI 使用一个坐标系统来确定图形和文本的位置。
通常,坐标原点位于设备的左上角,水平向右为正,垂直向下为正。
应用程序可以使用坐标系统来定位和变换图形对象。
5. 双缓冲技术:为了避免绘图时的闪烁和不流畅现象,GDI 使用双缓冲技术。
在内存中创建一个临时的图像缓冲区,所有的绘图操作先在缓冲区中进行,然后再将整个缓冲区一次性地绘制到屏幕上,从而实现平滑的图形显示。
总之,GDI 是一个用于绘制图形和文本的图形设备接口,它提供了设备无关性、句柄管理、绘图操作、坐标系统和双缓冲等特性,使得应用程序可以方便地操作图形对象并实现所需的图形效果。
1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows Mobile载入位图的方法
Windows Mobile载入位图的方法
目前我自己只知道三种方法
一、LoadBitmap
功能:
பைடு நூலகம்
可从一个执行模块中载入指定的位图。
原型:
HBITMAP LoadBitmap(
__in HINSTANCE hInstance,
__in LPCTSTR lpBitmapName
);
参数:
hInstance [in]
包含位图的模块句柄
lpBitmapName [in]
以’’结尾的字符串,包含将要载入位图资源名字。可使用MAKEINTRESOURCE将资源ID号转换。
返回值:
SelectObject(hMemDc, hOldBmp);
DeleteDC(hMemDc);
}
}
void MyButton::SetUpButtonImage(HWND hWnd, int nSel)
{
HDC hdc = GetDC(hWnd);
}
}
void MyButton::AddButton(CString sDownImage, CString sUpImage)
{
hDownBitmap[m_nCurrentCount] = SHLoadImageFile(sDownImage);
// 这里应该加个断言防止加载失败
Windows Mobile 使用GDI实现BUTTON效果
当我们开发WM程序的时候,BUTTON控件用得比较多,通常用BUTTON控件捕捉用户点击的消息,在这里我们可以使用GDI方式实现类似BUTTON控件的功能。
实现思路( 伪代码):
1. 建立两个文件: MyButton.h MyButton.cpp
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rcSel.left, rcSel.top, rcSel.right - rcSel.left, rcSel.bottom - rcSel.top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rcSel.left, rcSel.top, rcSel.right - rcSel.left, rcSel.bottom - rcSel.top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
SelectObject(hMemDc, hOldBmp);
DeleteDC(hMemDc);
}
int MyButton::OnClick(IN HWND hwnd, IN CPoint pt) // 捕捉点击消息
{
int nClicked = -1; // 选中的图标
HBITMAP hUpBitmap[10] // 定义松开时图片
void InitButtonImage(HWND hWnd); // 初始化图标
void SetDownButtonImage(HWND hWnd, int nPreSel); // 声明按下图标方法
void SetUpButtonImage(HWND hWnd, int nSel); // 声明松开图标方法
ASSERT(NULL != hDownBitmap[m_nCurrentCount]);
hUpBitmap[m_nCurrentCount] = SHLoadImageFile(sUpImage);
// 这里应该加个断言防止加载失败
ASSERT(NULL != hUpBitmap[m_nCurrentCount]);
{
HDC hdc = GetDC(hWnd);
// 利用双缓冲绘图
for(int n = 0; n < m_nCurrentCount; n ++)
{
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc, hDownBitmap[m_nCurrentCount]);
2. 在MyButton.h 中声明几个变量
// 外部接口:
public:
void AddButton(CString sDownImage, Cstring sUpImage); // 设置一个BUTTON按下前后的图片路径
void SetButtonRect(CRect rc); // 设置该BUTTON的位置以及大小
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rc[m_nCurrentCount].left, rc[m_nCurrentCount].top, rc[m_nCurrentCount].right - rc[m_nCurrentCount].left, rc[m_nCurrentCount].bottom - rc[m_nCurrentCount].top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
MyButton::MyButton()
{
m_nCurrentCount = 0;
// 初始化
for(int n = 0; n < 10; n ++)
{
hDownBitmap[n] = NULL;
hUpBitmap[n] = NULL;
SelectObject(hMemDc, hOldBmp);
DeleteDC(hMemDc);
}
void MyButton::SetUpButtonImage(HWND hWnd, int nPreSel)
{
HDC hdc = GetDC(hWnd);
InvalidateRect(hwnd, rc[m_nCurrentSel], TRUE); // 刷新选中范围
InvalidateRect(hwnd, rc[m_nPreSel], TRUE); // 刷新上一级选中范围
}
}
以上思路实现的BUTTON效果,简单点来说,就是捕捉用户按下松开的消息,改变对应位置的图标,看起来有点像BUTTON的效果,但是相对BUTTON来说,这种方法比较简洁,同时可以增加更多的功能,例如,用户按下某个图标,图标产生旋转,缩放或者闪烁,发出声音等等效果。设计程序就更加灵活了。
for ( int n = 0; n < m_nCountTool; n ++)
{
if ( m_Rect[n].PtInRect(pt))
{
nClicked = n;
break;
}
}
if ( -1 == nClicked )
{
protected:
int m_nCurrentCount; // 当前BUTTON数目
protected:
int m_nCurrentSel; // 当前选中图标的索引
int m_nPreSel; // 上一级选中图标索引
3. MyButton.cpp 实现
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rc[m_nCurrentCount].left, rc[m_nCurrentCount].top, rc[m_nCurrentCount].right - rc[m_nCurrentCount].left, rc[m_nCurrentCount].bottom - rc[m_nCurrentCount].top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
{
HDC hdc = GetDC(hWnd);
// 利用双缓冲绘图
for(int n = 0; n < m_nCurrentCount; n ++)
{
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc, hDownBitmap[m_nCurrentCount]);
return -1;
}
else
{
m_nCurrentSel = nClicked;
SetDownImage(hwnd, m_nCurrentSel); // 设置当前选中图标
SetUpImage(hwnd, m_nCurrentSel); // 恢复上一级选中图标的状态
CRect rcSel;
rcSel = rc[nSel];
m_nPreSel = nSel;
// 利用双缓冲绘图
HDC hMemDc = CreateCompatibleDC(hdc);