用C语言实现按钮新技术
- 格式:doc
- 大小:29.50 KB
- 文档页数:9
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:在按钮的回调函数中添加相应的逻辑处理。
VC按钮控件编程一按钮控件(Button)二复选框checkbox三单选按钮RadioButton四CButton类的常用函数MFC的CButton类对应着3个控件,按钮控件、复选框控件和单选框控件。
一按钮控件(Button)属性ID设置控件的ID。
Caption设置在控件上显示的字符串visible是否可见group将控件分组。
help id确定控件是否具有帮助IDdisabled是否可用tab stop按tab键是否能够获得焦点default button按钮具有黑色边框。
用户在对话框中按Enter键,如窗口中没有其他命令要处理,该按钮的单击事件将要被执行。
owner draw自定义按钮。
用户需要在OnDrawItem消息处理函数中绘制按钮外观。
Icon、Bitmap用一个图标或位图代替文本Multiline能够在按钮上显示多行文本Notify按钮能够将单击或双击事件通知父窗口,一般按钮按钮能够处理的消息是click 消息,是否选择这个属性后就可以写单击或双击消息了?通过实验好像是否选择都可以执行BN_CLICKED和BN_DOUBLECLICKED消息。
flat按钮不具有3D外观。
client edge使控件边框下凹static edge控件边缘为实边框modal frame控件呈现3D效果transparent控件透明。
控件下方的窗口不会被控件掩盖。
accept files是否接受文件拖动。
用户在对话框中拖动一个文件,控件将收到WM_DROPFILES消息。
Right aligned text文本右对齐Right-to-left reading order文本从右到左显示。
主要用于阿拉伯文等中东地区的语言习惯。
二复选框checkboxAuto是单击时,自动判断和设置是否选中,如果不选择就要通过GetCheck()和SetCheck ()来判断和设置。
left text表示文本在复选框的左边。
前一阵子参与一个项目开发,好友总是抱怨工具栏按钮太简陋了:要是弄得炫一点该多好啊,看看人家Mac的桌面工具栏!事实也的确如此,现在越来越多的程序界面做的是相当的酷啊,无论是什么平台Mac、Windows还是Linux,其界面元素越来越丰富,一个小小的button背景都要在鼠标的不同事件激活下渐变来渐变去。
但是,遍历VS IDE中默认的工具集合我们是无论如何也找不到如此复杂的控件的,所以,我们必须借助强大的.Net框架以及GDI+自己动手来制作类似的工具栏按钮控件。
我们要创建的控件简单说就是一个动态渐变的图片按钮,示例程序界面如下:这个button控件依旧继承自UserControl,UserControl是制作自定义UI控件绝对的父类,这里不再细说。
我们为这个button取名为DynamicImageButton。
制作图像按钮当然离不开绘制,所以还得用到GDI+,我曾经写过多篇关于界面元素的文章,比如”利用.Net绘图技术制作水晶按钮控件”、” 利用C#实现任务栏通知窗口”、” 利用C#为数码照片添加拍照日期”、” C#实现运行时拖动控件并调整控件大小”等等,其中都会涉及到GDI+的诸多方面,可见GDI+在设计制作UI上是多么的重要啊!对于按钮图片透明度渐变的操作则比较有技巧,采取了个人认为比较另类却极其高效的方法。
制作图片按钮肯定是要为这个button赋值一个图像文件的,我们需要公开一个属性,代码如下:大家注意到,当给这个DynamicImageButton的image属性赋值一幅图片后,立即就会对这个原始图片经过4种不同的alpha过滤后分别存放到bmp位图数组下。
bmp[0]保存原始图像,bmp[3]的图像则最透明。
这就是本程序的特点所在,也就是在运行时是不进行图像透明度渐变计算的,在给image属性赋值时计算工作同时也已经完成了,这样可以省下鼠标移动事件的巨大计算量。
returnAlpha方法就是将原始图像中的每一个像素按照相应的alpha值进行重新绘制后保存在bmp数组中,不同透明度的图像作为bmp数组的不同元素进行保存。
C#动态编译及实现按钮功能动态配置现在对做的系统要求要越来越灵活,功能配置越来越方便,牺牲一小部分的效率,而换取系统的灵活性,对于维护、功能扩展升级等工作提供了很大的方便。
前两天,一个项目要求界面上的按钮都是可以配置的,位置和功能都是可配置的。
位置好说,用xml即可。
但是功能可配置就有点难度了。
如果说使用接口,那么参数则不好设置,而且就算用接口,在实际调用时,也得明确实例化哪个类。
您可能还会说用反射,嗯,这的确是个好办法,但是还是在调用的时候,参数不确定,反射也就无用武之地了。
查了半天,最终还是选择了动态编译。
用一个专门的类,完成动态编译的过程。
其实这个动态编译,就是动态生成代码,经过动态编译,然后直接在系统中可以使用。
所以需要你在代码中添加中功能所需要的动态链接库、程序集以及命名空间。
以下是我用到的动态编译的类:using System;using System.Data;using System.Configuration;using System.IO;using System.Text;using piler;using System.Windows.Forms;using Microsoft.CSharp;using System.Reflection;namespace DynamicAddFunction{/// <summary>/// 本类用来将字符串转为可执行文本并执行,用于动态定义按钮响应的事件。
/// </summary>public class Evaluator{private string filepath = bine(Application.StartupPath, "FunBtn.config");#region 构造函数/// <summary>/// 可执行串的构造函数/// </summary>/// <param name="items">/// 可执行字符串数组/// </param>public Evaluator(EvaluatorItem[] items){ConstructEvaluator(items); //调用解析字符串构造函数进行解析}/// <summary>/// 可执行串的构造函数/// </summary>/// <param name="returnType">返回值类型</param>/// <param name="expression">执行表达式</param>/// <param name="name">执行字符串名称</param>public Evaluator(Type returnType, string expression, string name){//创建可执行字符串数组EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };ConstructEvaluator(items); //调用解析字符串构造函数进行解析}/// <summary>/// 可执行串的构造函数/// </summary>/// <param name="item">可执行字符串项</param>public Evaluator(EvaluatorItem item){EvaluatorItem[] items = { item };//将可执行字符串项转为可执行字符串项数组ConstructEvaluator(items); //调用解析字符串构造函数进行解析}/// <summary>/// 解析字符串构造函数/// </summary>/// <param name="items">待解析字符串数组</param>private void ConstructEvaluator(EvaluatorItem[] items){//创建C#编译器实例//ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());CSharpCodeProvider comp = new CSharpCodeProvider();//编译器的传入参数CompilerParameters cp = new CompilerParameters();Configer configer = Configer.Current(filepath);string[] assemblies = configer.GetAssembly("FunBtn//assembly//dll","name");cp.ReferencedAssemblies.AddRange(assemblies); //添加程序集集合//cp.ReferencedAssemblies.Add("system.dll"); //添加程序集 system.dll 的引用//cp.ReferencedAssemblies.Add("system.data.dll"); //添加程序集 system.data.dll 的引用 //cp.ReferencedAssemblies.Add("system.xml.dll"); //添加程序集 system.xml.dll 的引用 //cp.ReferencedAssemblies.Add("system.windows.forms.dll");//cp.ReferencedAssemblies.Add("FunButton.dll");//cp.ReferencedAssemblies.Add("DynamicAddFunction.exe");cp.GenerateExecutable = false; //不生成可执行文件cp.GenerateInMemory = true; //在内存中运行StringBuilder code = new StringBuilder(); //创建代码串/** 添加常见且必须的引用字符串*///获取引用的命名空间string[] usings = configer.GetAssembly("FunBtn//assembly//using", "name");foreach (var @using in usings){code.Append(@using+"\n");//添加引用的命名空间}//code.Append("using System; \n");//code.Append("using System.Data; \n");//code.Append("using System.Data.SqlClient; \n");//code.Append("using System.Data.OleDb; \n");//code.Append("using System.Xml; \n");//code.Append("using FunButton; \n");//code.Append("using System.Windows.Forms; \n");//code.Append("using DynamicAddFunction; \n");code.Append("namespace EvalGuy { \n"); //生成代码的命名空间为EvalGuy,和本代码一样code.Append(" public class _Evaluator { \n"); //产生 _Evaluator 类,所有可执行代码均在此类中运行foreach (EvaluatorItem item in items) //遍历每一个可执行字符串项{code.AppendFormat(" public {0} {1}() ", //添加定义公共函数代码.ToLower() , //函数返回值为可执行字符串项中定义的返回值类型 ); //函数名称为可执行字符串项中定义的执行字符串名称code.Append("{ "); //添加函数开始括号if ( == "Void"){code.AppendFormat("{0};", item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值}else{code.AppendFormat("return ({0});", item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值}code.Append("}\n"); //添加函数结束括号}code.Append("} }"); //添加类结束和命名空间结束括号//得到编译器实例的返回结果CompilerResults cr = pileAssemblyFromSource(cp, code.ToString());if (cr.Errors.HasErrors) //如果有错误{StringBuilder error = new StringBuilder(); //创建错误信息字符串error.Append("编译有错误的表达式: "); //添加错误文本foreach (CompilerError err in cr.Errors) //遍历每一个出现的编译错误{error.AppendFormat("{0}\n", err.ErrorText); //添加进错误文本,每个错误后换行}throw new Exception("编译错误: " + error.ToString());//抛出异常}Assembly a = piledAssembly; //获取编译器实例的程序集_Compiled = a.CreateInstance("EvalGuy._Evaluator"); //通过程序集查找并声明 EvalGuy._Evaluator 的实例 }#endregion#region 公有成员/// <summary>/// 执行字符串并返回整型值/// </summary>/// <param name="name">执行字符串名称</param>/// <returns>执行结果</returns>public int EvaluateInt(string name){return (int)Evaluate(name);}/// <summary>/// 执行字符串并返回字符串型值/// </summary>/// <param name="name">执行字符串名称</param>/// <returns>执行结果</returns>public string EvaluateString(string name){return (string)Evaluate(name);}/// <summary>/// 执行字符串并返回布尔型值/// </summary>/// <param name="name">执行字符串名称</param>/// <returns>执行结果</returns>public bool EvaluateBool(string name){return (bool)Evaluate(name);}/// <summary>/// 执行字符串并返 object 型值/// </summary>/// <param name="name">执行字符串名称</param>/// <returns>执行结果</returns>public object Evaluate(string name){MethodInfo mi = _Compiled.GetType().GetMethod(name);//获取 _Compiled 所属类型中名称为 name 的方法的引用 return mi.Invoke(_Compiled, null); //执行 mi 所引用的方法}public void EvaluateVoid(string name){MethodInfo mi = _Compiled.GetType().GetMethod(name);//获取 _Compiled 所属类型中名称为 name 的方法的引用 mi.Invoke(_Compiled, null); //执行 mi 所引用的方法}#endregion#region 静态成员/// <summary>/// 执行表达式并返回整型值/// </summary>/// <param name="code">要执行的表达式</param>/// <returns>运算结果</returns>static public int EvaluateToInteger(string code){Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);//生成 Evaluator 类的对像return (int)eval.Evaluate(staticMethodName); //执行并返回整型数据}/// <summary>/// 执行表达式并返回字符串型值/// </summary>/// <param name="code">要执行的表达式</param>/// <returns>运算结果</returns>static public string EvaluateToString(string code){Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);//生成 Evaluator 类的对像return (string)eval.Evaluate(staticMethodName); //执行并返回字符串型数据}/// <summary>/// 执行表达式并返回布尔型值/// </summary>/// <param name="code">要执行的表达式</param>/// <returns>运算结果</returns>static public bool EvaluateToBool(string code){Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 类的对像 return (bool)eval.Evaluate(staticMethodName); //执行并返回布尔型数据}/// <summary>/// 执行表达式并返回 object 型值/// </summary>/// <param name="code">要执行的表达式</param>/// <returns>运算结果</returns>static public object EvaluateToObject(string code){Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);//生成 Evaluator 类的对像 return eval.Evaluate(staticMethodName); //执行并返回 object 型数据 }/// <summary>/// 执行表达式并返回 void 空值/// </summary>/// <param name="code">要执行的表达式</param>static public void EvaluateToVoid(string code){Evaluator eval = new Evaluator(typeof(void), code, staticMethodName);//生成 Evaluator 类的对像 eval.EvaluateVoid(staticMethodName); //执行并返回 object 型数据}#endregion#region 私有成员/// <summary>/// 静态方法的执行字符串名称/// </summary>private const string staticMethodName = "ExecuteBtnCommand";/// <summary>/// 用于动态引用生成的类,执行其内部包含的可执行字符串/// </summary>object _Compiled = null;#endregion}/// <summary>/// 可执行字符串项(即一条可执行字符串)/// </summary>public class EvaluatorItem{/// <summary>/// 返回值类型/// </summary>public Type ReturnType;/// <summary>/// 执行表达式/// </summary>public string Expression;/// <summary>/// 执行字符串名称/// </summary>public string Name;/// <summary>/// 可执行字符串项构造函数/// </summary>/// <param name="returnType">返回值类型</param>/// <param name="expression">执行表达式</param>/// <param name="name">执行字符串名称</param>public EvaluatorItem(Type returnType, string expression, string name){ReturnType = returnType;Expression = expression;Name = name;}}}为了提高其灵活性,上面这个类添加的程序集和命名空间,以及调用功能的代码,都改成了读取xml格式的配置文件来获取。
如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC 提供那些标准控件。
这时,我们就必须自己另外多做些工作了。
就改变控件外观这一点来说,主要是利用控件的自绘功能(Owner Draw)实现的。
本篇将和各位一起定义一个XP风格的CXPButton按钮类,目的不在于介绍CXPButton类的使用技巧,而在于向各位阐述实现自绘按钮的方法。
当然如果你觉得CXPButton 有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中。
本篇要点:一、准备工作二、实现原理及难点三、按钮类的使用四、小结与提示五、附录下载文件 (已下载 373 次)点击这里下载文件: XPButtonDemo.zip一、准备工作在开始编码之前,首先应该确定好,更准确的说应该是设计好按钮在各种状态下的外观。
按钮控件的几中基本状态包括:Normal状态,就是按钮一开始显示时的样子。
Over状态,鼠标指针移动到按钮上面时按钮显示的样子。
Down状态,按下按钮时显示的样子。
Focus状态,按钮按下后松开的样子,例如标准按钮按下松开之后会看到按钮内部有一个虚线框。
Disable状态,当然就是按钮被设置成无效的时候的样子啦。
我参考了一下WindowsXP中普通按钮的实际样子,设计出XP按钮各种状态的外观,如下图所示:至于Down状态主要是在Over状态的基础上将文字往右下的方向稍微平移,以实现下压的效果。
二、实现原理及难点下面我们开始类的创建,在Workspace的ClassView页中右击列表树的根结点,选择New Class…在弹出窗口中进行派生类的定义,如下图所示,注意,你需要填写的只有Name 和Base class两项,其余的选项保持默认值就可以了。
按 OK按钮退出之后,我们可以在ClassView里面看到新创建的类的名字。
接下来我们可以为CXPButton类添加各种成员变量。
因为自绘控件说穿了就是画图,所以在成员变量中可以看到各种与画图有关的数据类型,一般来说成员变量会在类的构造函数中初始化,在类的析构函数中销毁。
objective c button click 原理Objective-C Button Click 原理Objective-C中的按钮点击是开发iOS应用程序中常见的一种交互操作。
本文将从浅入深地解释Objective-C按钮点击的原理。
简介按钮是iOS应用中最常见的用户界面元素之一,用于响应用户的点击事件。
Objective-C提供了一种简单且强大的机制,使开发者可以轻松地实现按钮点击功能。
UIButton类UIButton是Objective-C中的一个类,用于创建和管理按钮对象。
在创建按钮时,我们可以设置按钮的样式、标题、图片等属性。
按钮的创建我们可以使用以下代码创建一个UIButton对象:UIButton *button = [UIButton buttonWithType:UIButto nTypeSystem];上述代码创建了一个系统风格的按钮对象,并将其赋值给变量button。
通过设置buttonType参数,我们可以创建不同样式的按钮,如圆角按钮、带图标的按钮等。
设置按钮的标题和图片我们可以使用以下代码设置按钮的标题和图片:[button setTitle:@"点击" forState:UIControlStateNorm al];[button setImage:[UIImage imageNamed:@"buttonImage"] for State:UIControlStateNormal];上述代码将按钮的标题设置为”点击”,并设置了按钮的正常状态下的图片为名为”buttonImage”的图片。
添加点击事件按钮的点击事件可以通过添加目标操作来实现。
目标操作相当于定义了当按钮被点击时所要执行的代码。
使用addTarget:action:forControlEvents:方法我们可以使用UIButton类提供的addTarget:action:forControlEvents:方法来添加目标操作。
C语⾔API编写窗⼝界⾯和button近期有个同学的程序须要⽤对话框的⽅式实现,但前⾯都是通过⿊框形式完毕的,⽼师突然让添加⼀个界⾯,本来准备採⽤MFC完毕的,但后来⼀想,该程序核⼼东西是体如今它的算法上,控制台的程序并不是不好.转念⼀想,假设使⽤MFC这个⽅案好像须要再倒腾⼀遍,想到了⼤⼀在"C语⾔能⼲⼤事"中的东西,所以就准备採⽤这种形式直接完毕,投机取巧的⽅法.主要是通过调⽤Windows API界⾯的CreateWindows函数完毕,同⼀时候也能创建button,把參数设置为button,假设想响应该button,仅仅需在回调函数中添加消息WM_COMMAND推断就可以.代码例如以下:#include<windows.h>#include<stdio.h>//声明回调函数LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//主函数程序⼊⼝int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND hwnd ; //⽤来保存成功创建窗⼝后返回的句柄MSG msg ; //定义消息结构体变量WNDCLASS wndclass ; //窗⼝类wndclass.style = CS_HREDRAW | CS_VREDRAW ; //指定窗⼝风格wndclass.lpfnWndProc = WndProc ; ////函数指针,指向处理窗⼝消息的函数⼊⼝wndclass.cbClsExtra = 0 ; //结构体后附加的字节数,⼀般总为0wndclass.cbWndExtra = 0 ; //窗⼝实例附加的字节数,⼀般总为0wndclass.hInstance = hInstance ; //模块句柄wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标句柄任务栏显⽰的图标wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标句柄wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜⾊COLOR_BACKGROUNDwndclass.lpszMenuName = NULL ; //菜单名的字符串wndclass.lpszClassName = szAppName ; //⾃⼰定义类名,不要与其它类名反复if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("注冊类失败!"), szAppName, MB_ICONERROR) ;return 0 ;}int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中//创建窗⼝APIhwnd = CreateWindow(szAppName,TEXT("毕业设计"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);//显⽰窗⼝的API 传⼊须要显⽰的窗⼝句柄和显⽰⽅式ShowWindow(hwnd,iCmdShow);//刷新窗⼝的APIUpdateWindow(hwnd);//从系统的应⽤程序线程消息队列中取得⼀个消息while(GetMessage(&msg,NULL,0,0) > 0){DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc; //句柄PAINTSTRUCT ps;RECT rect; //矩形HINSTANCE hInstance; //窗⼝实例static HWND hwndButton[2]; //button句柄switch (message){case WM_CREATE: //创建button{hInstance = ((LPCREATESTRUCT)lParam)->hInstance;//button1hwndButton[0] = CreateWindow("BUTTON","训练",WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//button2hwndButton[1] = CreateWindow("BUTTON","获取",WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,250,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);return 0;}case WM_PAINT: //绘制⽂字hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("By:Eastmount CSDN制作"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd,&ps);return 0;case WM_COMMAND: //响应button消息if((HWND)lParam == hwndButton[0]){MessageBox(NULL,TEXT("是否训练图⽚?"),TEXT("提⽰"),MB_YESNO|MB_ICONQUESTION);}if((HWND)lParam == hwndButton[1]){MessageBox(NULL,TEXT("是否获取图⽚?"),TEXT("提⽰"),MB_YESNO|MB_ICONQUESTION);}return 0;case WM_CLOSE: //关闭if(IDYES==MessageBox(hwnd,"是否关闭程序?","提⽰",MB_YESNO|MB_ICONQUESTION)){DestroyWindow (hwnd);}return 0;case WM_DESTROY: //退出程序PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}程序执⾏结果例如以下图所看到的:当中主要涉及到的函数原型例如以下所看到的://创建窗⼝hwnd = CreateWindow (szClassName, /* Classname */"Windows App", /* Title Text */WS_OVERLAPPEDWINDOW, /* default window */CW_USEDEFAULT, /* Windows decides the position */CW_USEDEFAULT, /* where the window ends up on the screen */544, /* The programs width */375, /* and height in pixels */HWND_DESKTOP, /* The window is a child-window to desktop */NULL, /* No menu */hThisInstance, /* Program Instance handler */NULL /* No Window Creation data */);//创建按钮hwndButton = CreateWindow("BUTTON", // predefined class"OK", // button textWS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles10, // starting x position10, // starting y position100, // button width100, // button heighthwnd, // parent windowNULL, // No menu(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),NULL // pointer not needed);最后,写这篇⽂章主要是怀念⾃⼰⼤⼀时的⽣活,从⼀个什么都不知道的孩⼦,通过学习C语⾔,C语⾔能⼲⼤事開始接触编程.同⼀时候,我觉得这个程序也是很还的⼊门程序,希望刚接触程序的同学也能够看看,编编⾃⼰感兴趣的程序、写写博客、AC题⽬、编写游戏、聊天软件、移动开发,能从程序和⽣活中找到⼀些让⾃⼰⼼灵美妙的东西.(By:Eastmount 2014-5-25 夜2点半原创CSDN)。
手机双击按键程序c语言下面这段是引言,和按键程序实质内容没有任何关系,可以当P话,可直接跳到分割线的地方。
最近自己在琢磨按键程序,之前弄了,按键单击程序,程序可以实现读取按键的几个状态,然后根据需求使用。
单击按键的几个状态如下:单击后,马上返回按键值单击后,释放之后,返回按键值单击后,按住不放,多次返回按键值但是在其上面扩展双击和三击以及多击程序时,遇到了麻烦(其实就是不会啦),于是在网上看了某个老师的经典按键程序,里面讲了单击和双击,拿着源程序理解了半天,终于一知半解了(一知半解的状态就是能读懂思想,但是闭卷完全自己写,写不出)。
但是个人觉得其中的消抖部分还有按键释放的部分还可以改善,还有根据其思路扩展了三击以及N击。
此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击]。
本文分为三个部分,第一个部分是说[单击],[长按]的程序;第二部分是讲[双击];第三部分是讲[三击],[多击];一、[单击]、[长按]程序1.简单介绍本按键程序的单击和长按首先说一下单击,长按的响应情况,就是按多久算单击或者长按,按下按键马上返回有效键值,还是释放之后返回有效键值等等,下面说下它在什么情况下返回有效的【单击】和【长按】。
注:T1:是单击的按键消抖时长,这里预设的是30ms,也可以根据需求自行定义;T2:是单击时,按键释放的有效时间段,提前或者超过这个时间段释放的按键都再是单击了。
提前释放则是无效键值,超过后释放则是长按。
T3:是长按时长,按键超过此时长,则为长按。
这里的预设值是3s,同样可根据需求自行更改。
【单击】:按键按下超过消抖时长T1(30ms),并且在T2时间段内释放按键,按键一释放,马上返回有效按键值—【单击】。
注意:单击是释放后,才返回有效按键值,不释放时,是无效按键值。
【长按】:按键按下的时间超过预设的长按时长T3(3s),马上返回有效按键值—【长按】;注意:双击是只要按下的时间超过预设的长按时长,马上返回有效键值。
用C语言实现按钮新技术一、按钮显示原理按钮一般有按下和弹起两种状态,在3D studio中按钮也有这两种状态,Windows中虽然看到按钮虽是弹起的,但细心的用户不难发现,当选中按钮时,它有短暂的按下状态。
实际上,它的原理很简单,其实是利用改变按钮边框的颜色引起人视觉上的错觉而达到立体效果,让人们感到屏幕上真有凸起和凹下的按钮一样,如下图:@@T5S11500.GIF;图1@@图1和图2给出了按钮两种状态和图示,图1为按钮弹起时的状态图,其右边及下边的边框色为黑色(0X00),而左边及上边的边框颜色置为亮白(0x0f),而图2则恰恰相反,右边及下边的边框色为亮白,左边及上边为黑色,它反映了按钮被按下的状态。
在程序应用中,设置某一按钮时,显示图1的状态,再选中这个按钮时,则显示出图2的状态,经过短暂的延时后,恢复到图1的状态,给用户的感觉是按钮被按下后又弹起。
在Windows 中的按钮就是这样的,3D studio中的部分按钮当被选中时,只显示图2,这时用户可以很清晰地看到凹下的按钮。
二、程序实现主要包括按钮结构的意义和与它有关的几个函数。
1.结构定义typedef struet Button Def{short X1;short Y1;short X2;short Y1;} button(X1,Y1)和(X2,Y2)分别为按钮左上角和右下角的位置坐标,用于确定按钮的位置和大小。
为了程序需要,须定义几个常用的量。
#define START-X bt→X1#define START-Y bt→Y1#define END-X bt→X2#define END-Y bt→Y2#define Grap 1(Grap为按钮边框的宽度)#define Button White 0x0f#define Button Black 0x002.函数定义(1)void Button Define(button *bt,Short X1,Short Y,short X2,short Y2)该函数用于定义一个名为bt的按钮的大小和位置,其左上角及右下角坐标为(X1,Y1),(X2,Y2)。
START-X=X1;START-Y=Y1;END-X=X2;END-Y=Y2;(2)Void Release Button(button *bt)该函数显示按钮弹起时的状态。
(3)Put Down Button(button *bt)该函数显示按钮按下时的状态。
下面列出了以上函数用于定义按钮,显示按钮弹起,按下状态的程序,这个程序在屏幕上显示7个按钮,按下1~7个数字后就弹起某个按钮,非常方便,需要弹起某个数字就按哪个数字,特别需要指出的是,当Gsap大一些时,每个按钮,就如同键盘上的键一样,立体感很强,有兴趣的读者可以实践操作一下,并把这种简明易懂的技术用之于工作,以提高工作效率。
button.c#include<graphics.h>#include<conio.h>#include<alloc.h>#include<stdio.h>#include<process.h>#includebutton.h#define START-X bt->x1#define START-Y bt->y1#define END-X bt->x2#define END-Y bt->y2#define Grap 1#defile ScreenBkColor 2#define release-color 7#define put-color 3#define ButtonWhite 0x0f#define ButtonBlack 0x00#define delay 50000#define dis 10void ButtonDefine (button *bt.shout.short.short.short); void ReleaseButton(button *bt);void PutDownButton(button *bt);void delay-time(long int);main(){int gdriver=DETECT.gmode=VGAHI:button *but,*but1.*but2. *bt,*but3,*but4,*but5,*but6,*but7; int ch;initgraph(&gdriver,&gmode,d:\tc);setcolor(ScreenBkColor);setbkcolor(2);clrscr();ButtonDefine(but,50,50,600,400); putDownButton(but);ButtonDefine(but1,150,200,200,250); ButtonDefine(but2,200+dis,200,250+dis,250); ButtonDefine(but3,250+2*dis,200,300+2*dis,250); ButtonDefine(but4,300+3*dis,200,350+3*dis,250); ButtonDefine(but5,350+4*dis,200,400+4*dis,250); ButtonDefine(but6,400+5*dis,200,450+5*dis,250); ButtonDefine(but7,450+6*dis,200,500+6*dis,250); while(ch!=27){switch(ch) }case1:ReleaseButton(but1);break;case2:ReleaseButton(but2);break;case3:ReleaseButton(but3);break;case4:ReleaseButton(but4);break;case5:ReleaseButton(but5);break;case6:ReleaseButton(but6);break; case7:ReleaseButton(but7);break; }ch=getch();if(ch==27)break;switch(ch){case1:PutDownButton(but1);break; case2:PutDownButton(but2);break; case3:PutDownButton(but3);break; case4:PutDownButton(but4);break; case5:PutDownButton(but5);break; case6:PutDownButton(but6);break; case7:PutDownButton(but7);break; }delay-time(delay);}closegraph():return 0;}void ButtonDefine(button *bt.short x1,short y1,short x2,short y2) {START-X=x1;START-Y=y1;END-X=x2;END-Y=y2;}void ReleaseButton(button *bt){int i,j;setcolor(7);setfillstyle(1,7);bar(START-X,START-Y,END-X,END-Y);setcolor(Button White);setfillstyle(1,7);bar(START-X+Grap,START-Y+Grap,END-X-Grap,END-Y-Grap);setcolor(15);for(j=0;j<=Grap;j++){line(START-X,j+START-Y,END-X-j,j+STAT-Y);}for(i=0,i<=Grap;j++){line(START-X+i,START-Y+Grap,START-X+i,END-Y-i);}setcolor(ButtonBlack);for(j=0;j<Grap;j++)}line(END-X,j+END-Y-Grap,START-X+Grap-j,j+END-Y-Grap);}for(i=0,i<Grap;i++){line(i+END-X+Grap,END-Y-Grap,i+END+X-Grap,START-Y+Grap-i); }return;}void PutDownButton(button *bt)}int i,j;setcolor(put-color);setfillstyle(1,put-color);bar(START-X+Grap,START-Y+Grap,END-X-Grap,END-Y-Grap); setcolor(ButtonBlack);for(j=0;j<=Grap;j++){line(START-X,j+START-Y,END-X-j,j+START-Y);;}for (i=0;i<Garp;i++){line (START-X+i,START-Y+Grap,START-X+i,END-Y-i);setcolor(15);for(j=0,j<=Grap;j++){line(END-X,j+END-Y-Grap,START-X+Grap-j,j+END-Y-Grap);}for(i=0;i<=Grap;i++){line(i+END-X-Grap,END-Y-Grap,i+END-X-Grap,START-Y+Grap-i); }}void delay-time(long int i){i=0;while(i<=delay)i++;}button.htypedef struct ButtonDef{ short x1;short y1;short x2;short y2; }button;。