当前位置:首页 » 净水方式 » edi控件

edi控件

发布时间: 2020-12-18 11:49:00

Ⅰ 在WebService中怎么调用alasunsmscon.ocx控件错误

这就是说,你能够用编程的方法通过来调用这个应用程序。对Web service 更精确的解释: Web services是建立可互操作的分布式应用程序的新平台。作为一个Windows程序员,你可能已经用COM或DCOM建立过基于组件的分布式应用程序。COM是一个非常好的组件技术,但是我们也很容易举出COM并不能满足要求的情况。Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问 2. 基本概念 SOAP Web service建好以后,其他人就会去调用它。简单对象访问协议(SOAP)提供了标准的远程过程调用( RPC)方法来调用Web service。SOAP规范定义了SOAP消息的格式,以及怎样通过Http协议来使用SOAP。SOAP也是基于xml和XSD的,XML是SOAP的数据编码方式。客户端和服务端之间的方法调用请求和结果返回值都放在这些消息里。 XML和XSD可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的。XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,还是 64位?这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合Web service标准,所有使用的数据类型都必须被转换为XSD类型。3.Webservice的技术特点 长项一: 跨防火墙的通信如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。 举个例子,在应用程序里加入一个新页面,必须先建立好用户界面(Web页面),并在这个页面后面,包含相应商业逻辑的中间层组件,还要再建立至少一个ASP页面,用来接受用户输入的信息,调用中间层组件,把结果格式化为HTML形式,最后还要把“结果页”送回浏览器。要是客户端代码不再如此依赖于HTML表单,客户端的编程就简单多了。 如果中间层组件换成Web Service的话,就可以从用户界面直接调用中间层组件,从而省掉建立ASP页面的那一步。要调用Web Service,可以直接使用Microsoft SOAP Toolkit或.NET这样的SOAP客户端,也可以使用自己开发的SOAP客户端,然后把它和应用程序连接起来。不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。同时,应用程序也不再需要在每次调用中间层组件时,都跳转到相应的“结果页”。 从经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用Web Service这种结构,可以节省花在用户界面编程上20%的开发时间。另外,这样一个由Web Service组成的中间层,完全可以在应用程序集成或其它场合下重用。最后,通过Web Service把应用程序的逻辑和数据“暴露”出来,还可以让其它平台上的客户重用这些应用程序。 长项二: 应用程序集成企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常需要从运行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集成起来。通过Web Service,应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用。 例如,有一个订单登录程序,用于登录从客户来的新订单,包括客户信息、发货地址、数量、价格和付款方式等内容;还有一个订单执行程序,用于实际货物发送的管理。这两个程序来自不同软件厂商。一份新订单进来之后,订单登录程序需要通知订单执行程序发送货物。通过在订单执行程序上面增加一层Web Service,订单执行程序可以把“Add Order”函数“暴露”出来。这样,每当有新订单到来时,订单登录程序就可以调用这个函数来发送货物了。 长项三: B2B的集成 用Web Service集成应用程序,可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。Web Service是B2B集成成功的关键。通过Web Service,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子发票系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发票。当然,这并不是一个新的概念, Edi(电子文档交换)早就是这样了。但是,Web Service的实现要比EDI简单得多,而且Web Service运行在Internet上,在世界任何地方都可轻易实现,其运行成本就相对较低。不过,Web Service并不像EDI那样,是文档交换或B2B集成的完整解决方案。Web Service只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。用Web Service来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为Web Service,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本,让许多原本无法承受EDI的中小企业也能实现B2B集成。 长项四: 软件和数据重用 软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,另一种形式是二进制形式的组件重用。 当前,像表格控件或用户界面控件这样的可重用软件组件,在市场上都占有很大的份额。但这类软件的重用有一个很大的限制,就是重用仅限于代码,数据不能重用。原因在于,发布组件甚至源代码都比较容易,但要发布数据就没那么容易,除非是不会经常变化的静态数据。Web Service在允许重用代码的同时,可以重用代码背后的数据。使用Web Service,再也不必像以前那样,要先从第三方购买、安装软件组件,再从应用程序中调用这些组件;只需要直接调用远端的Web Service就可以了。举个例子,要在应用程序中确认用户输入的地址,只需把这个地址直接发送给相应的Web Service,这个Web Service 就会帮你查阅街道地址、城市、省区和邮政编码等信息,确认这个地址是否在相应的邮政编码区域。Web Service 的提供商可以按时间或使用次数来对这项服务进行收费。这样的服务要通过组件重用来实现是不可能的,那样的话你必须下载并安装好包含街道地址、城市、省区和邮政编码等信息的数据库,而且这个数据库还是不能实时更新的。 另一种软件重用的情况是,把好几个应用程序的功能集成起来。例如,要建立一个局域网上的门户站点应用,让用户既可以查询联邦快递包裹,查看股市行情,又可以管理自己的日程安排,还可以在线购买电影票。现在Web上有很多应用程序供应商,都在其应用中实现了这些功能。一旦他们把这些功能都通过Web Service “暴露”出来,就可以非常容易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。 将来,许多应用程序都会利用Web Service,把当前基于组件的应用程序结构扩展为组件/Web Service 的混合结构,可以在应用程序中使用第三方的Web Service 提供的功能,也可以把自己的应用程序功能通过Web Service 提供给别人。两种情况下,都可以重用代码和代码背后的数据。

Ⅱ 谁知道EDIVS这个软件

南阳油田勘探数据库系统

为使勘探开发数据库这一庞大的信息资源在油田的各项工作中发挥其应有的作用,河南 油田的勘探开发工作人员进行了多年的不懈努力,目前,河南油田的勘探开发数据库 建设和应用已颇具规模,在利用计算机及网络技术、数据库技术来解决生产、科研、 管理过程中的实际问题以及在提高日常工作效率、管理水平、决策水平等方面取得了 明显的效益。特别是在数据共享、查询、统计分析等表单数据的应用软件开发方面成 绩显著。
实际上,在油田勘探开发领域,“数据”与“图形”相辅相承,缺一不可,数据是图形 的内容,图形是数据的表现。数据库、图形库应用软件建设,正是要融合数据与图形 的内容,使它们有机地结合在一起,为油田的科研生产、增储上产服务。
为此,河南油田提出了建立本企业的勘探开发信息可视化系统(Exploration and Development Information Visualization System,简称EDIVS,下同)的需求,并就 EDIVS系统提出了较为详尽的功能要求。期望建立一个以图形化系统为工作界面,以浏 览器为应用工具,集数据、图表、图形和图像的录入、管理、查询和维护于一体的勘 探开发信息数据库综合应用系统。

功能:
EDIVS既是一个日常工作中的通用系统,同时又是可扩展性要求很高的专业 工作系统,因此要求有很强实用性和灵活性,主要是:
速度性能:
软件运行的速度一方面取决于硬件性能,另一方面取决于程序的代 码效率。编程时应采用代码效率高、编译器功能强的编程语言工具,特别是应选用高速 的专用数据库引擎,避免使用速度慢的通用数据库接口(如ODBC)。
易使用性:
用户界面友好,易于为操作员、单位领导到勘探专业技术人员掌握 和使用。所有使用代码的地方,应以中文提示出现,用户不需查询和记忆代码含义。所 有由于用户填写查询条件的界面应提供所有的函数、操作符及条件项目列表,供用户选 择。所有提示均应以中文出现。
可理解性:
程序代码应结构简洁、层次明确,易于阅读和理解。所有变量均应 说明其用途、出处,全局变量应说明其在程序代码中使用的模块位置。尽可能避免使用 转移语句。用户界面应易于操作者理解,每一步的菜单和对话框均应有相应的帮助信息。 对话框应采用中文提示。
可维护性:
包括系统可维护性和代码可维护性。代码中应避免出现交叉重复的 代码段,各模块的出入口应清楚、明确,各模块均应有明确的助记符,模块间应有明确 的数据协议。
可移植性:
各功能模块的代码结构应具有较强的独立性,一便于移植使用。
可扩充性:
数据字典、图例库应具有可扩充修改能力,扩充修改后的数据字典、 图例库程序应能自动识别,而无需修改程序代码。可编辑的图件类型和表格类型也应具 有可扩充能力,新增的文件类型或表格类型应可很方便地扩充挂接到程序中,而不需大 量修改代码段。
安全保密性:
数据库、图形库、地质地理信息库均应建立完善的安全机制。所有 用户必须以用户名和口令登录方能使用本系统,用户只能查询和使用自己权限范围内的 数据。后台服务器的数据库对于所有前端用户均仅为只读,前端处理使用后的所有数据 原则上均不能返回后端数据库。
设计实现:
在充分考虑了用户实际需要以及用户的工作习惯、工作流程、工作分工的基 础上,EDIVS系统要用最直观、最方便操作、最直接的方式来实现用户的需求。EDIVS软件的开 发采用浏览器/服务器(B/S)的方式与客户端/服务器(C/S)结合的方式进行开发实现。
C/S方式实现:
通过统一的、可视化的平台定制维护工具Builder实现:用户定制、 可视化表单定制、业务流程定制、业务功能定制、用户权限分配、各种数据源数据的导入导 出等功能,维护工具Builder采用C++语言开发,做到接口统一,易于维护,方便扩充,容易 移植。
B/S方式实现:
用户在浏览器端按照所拥有的权限操作C/S端定制的 业务功能,即在浏览器来完成数据及图形的(单条或批量)录入,修改,查询功能。B/S端基 于java jsp+jdbc实现纯HTML语言的代码,避免了对第三方控件的依赖,提高了系统的执行效 率、健壮率,使系统的维护性、扩充性、可移植性大大增强。

运行环境:
硬件环境:
服务器:SUN服务器,操作系统为SOLARIS 8, 9
客户机:微机PⅢ 500,64MB以上,21”显示器,WINDOWS98/2000/NT
软件环境:
数据库平台:ORACLE8i, 9i
Application Server: Jrun 4.0 或Tomcat 4.0

Ⅲ delphi 中怎么用ListView控件和 OPENdialog 控件 使打开的文件夹下的 文件名在listVIEW中显示 求具体代码

工具,选项抄,安全性,个人信息选袭项下面,把勾选去掉 。如果是2007的话就点击工作簿上的office徽标-Excel选项-信任中心-个人信息选项,文档特定设置下的“保存时从文件属性中删除个人信息(R)”前面的“√”取消!

Ⅳ 求一款电音效果插件Autotune,是Cool Edia用的

安装到你能找到的位置,然后刷新效果列表。

Ⅳ C++编辑框控件对WM_CHAR的筛选

截获++编辑框控件的窗口过程:

WNDPROC OldEditProc=0L;
// InterceptEdit, 截获 Edit 的 WM_CHAR 消息. 当消息处理完毕后必须把消息回送给默认的RichEdit的窗口处理过程. OldEditProc 为 Edit 的旧窗口地址。
long InterceptEdit(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){

switch(uMsg){
case WM_CHAR:{
static char g_sz[128]; sprintf(g_sz,"wParam=0x%x=%c, lParam=%x, repeat count=%d", wParam, wParam,lParam,lParam&0xF);
MessageBox(0,g_sz,0,0);
}break;

default: break;
} // switch(uMsg)

return CallWindowProc(OldEditProc, hWnd, uMsg, wParam, lParam);
}

// DialogProc, IDD_DIALOG1对应的对话框窗口过程. int CALLBACK DialogProc( HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_INITDIALOG:{
// 在dialog初始化时截取Edit窗口过程. 也可以在主窗口WndProc初始化时截取。
HWND hEdit=GetDlgItem(hdlg,IDC_EDIT1); if(!hEdit) break;
OldEditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(long)InterceptEdit);
}break;

case WM_DESTROY: break;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDCANCEL:
case IDOK:{ // DestroyWindow(hdlg);
EndDialog(hdlg,0);
} break;

default: break; // switch(LOWORD(wParam))} break; // case WM_COMMAND:
} // switch(uMsg)
return false;
}

Ⅵ 如何对DBEdi进行t编辑Delphi

将其和“数据表控件” 或者 “数据查询控件”中的某个字段相关联,就可编辑此DBEdit。

Ⅶ 装的破解版Edius6.08,求能用的好用的经典的字幕插件啊,(雷特字幕、传奇字幕等Edius6不能用的除外)!!

我的看法是,LZ还是不要太去看中那些传说中的字幕插件了,因为你即使拥有了版它,你不是权还得去系统地学习它的使用方法?这不是走了一大截弯路吗?在我看来,这是不值得的。
以上看法,纯属个人观点,LZ可别生气哦。
我常用的做法是:先用PS做出自己想要的文字效果,保存成PSD文件导入EDIUS里,然后再把那些什么“扫光了、走光了”的特效拖放进去,想要多炫就有多炫。

Ⅷ 如何自定义iOS中的控件

在开发过程中,有时候UIKit的标准控件并不能满足我们的需求,例如你需要一个控件能支持用户方便的选择0-360°之间的一个角度值,此时就需要根据自己的需求自定义控件了。

对于选择角度值的控件可以这样实现:创建一个圆形的滑块,用户通过拖动手柄操作就能选择角度值。实际上这样的控件在别的一些平台中你可能看到过,但是在UIKit中并没有。

本文就实现一个选择角度值的控件来介绍控件的自定义。下面先来看看到底要做成什么样子:

1. 子类化UIControl
UIControl 是UIView的子类,它又是所有UIKit控件的父类(例如UIButton、UISlider和UISwitch等)。

UIControl的主要作用是创建相应的逻辑将action分发到对应的target,另外90%的情况下,它会根据自身的状态(例如Highlighted, Selected和Disabled等)来绘制用户界面。

通过UIControl,我们主要管理3个重要的任务:

绘制用户界面
跟踪用户的操作
Target-Action模式
在本文的圆形滑块中,我们要做如下一些事情:

定制一个用户界面(圆形滑块本身),通过该界面用户可以通过手柄进行界面交互。用户的交互操作会被转换为控件target对应的action(控件将滑块按钮的frame origin转换为0-360之间的一个值,并用于target/action上)。

建议在学习本文的时候从文章尾部的连接中下载完整的示例工程。

下面我将从上面列出的3个重要任务一一进行分解介绍。

这些步骤都是模块化的,所以如果你对界面的绘制不感兴趣,可以跳 绘制用户界面 ,直接学习后面的步骤。

打开工程文件中的 TBCircluarSlider.m 文件。然后开始学习下面的内容。

1.1 绘制用户界面
我比较喜欢使用Core Graphics,唯一用到UIKit的就是通过textfield来显示滑块的值。

提醒 :此处需要用到一些 Core Graphics 知识,如果你不懂也没多大关系,我会尽量把代码做详细的讲解。

我们先来看看控件的不同组成部分,这样更有利于后面的学习。

首先,是用一个 黑色的圆环 当做滑块的背景。

可操作区域(active area) 是一个从蓝色到紫色的梯度渐变效果。

用户通过拖拽下面的这个手柄按钮来选择值:

最后,用于显示选中值的 TextField 。在下一版中,我计划让用户可以通过键盘输入角度值。

控件界面的绘制主要使用drawRect函数,首选我们需要获取到当前使用的图形上下文,如下代码所示:

CGContextRef ctx = UIGraphicsGetCurrentContext();
1.1.1 绘制背景

背景是360°的,所以只要用CGContextAddArc给图形上下文添加正确的path,并设置正确的stroke即可。

下面的代码可以就可以完成背景的绘制:

//Add the arc path
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, radius, 0, M_PI *2, 0);

//Set the stroke colour
[[UIColor blackColor]setStroke];

//set Line width and cap
CGContextSetLineWidth(ctx, TB_BACKGROUND_WIDTH);
CGContextSetLineCap(ctx, kCGLineCapButt);

//draw it!
CGContextDrawPath(ctx, kCGPathStroke);
CGContextArc 函数的参数包括图形上下文,弧度的中心坐标点,以及半径(是一个私有变量),接着是弧度开始和结束时的角度(在TBCircularSlider.m文件的头部可以看到一些关于数学计算的方法),最后一个参数标示绘制的方向,0表示逆时针方向。

接下来的3行的代码是用来设置一些信息的,例如颜色和线条宽度等。最后使用 CGContextDrawPath 方法完成背景的绘制。

1.1.2 绘制用户的可操作区域

这部分需要利用一点小技巧才行。此处我们绘制一个线性渐变的掩码图片,下面看看原理:

此处掩码图片的工作原理是可以看到原始渐变矩形框的一个孔。

在这里绘制的弧度有一个阴影,这是创建掩码图时使用了一点模糊的效果。

下面是创建掩码图的相关代码:

UIGraphicsBeginImageContext(CGSizeMake(320,320));
CGContextRef imageCtx = UIGraphicsGetCurrentContext();

CGContextAddArc(imageCtx, self.frame.size.width/2 , self.frame.size.height/2, radius, 0, ToRad(self.angle), 0);
[[UIColor redColor]set];

//Use shadow to create the Blur effect
CGContextSetShadowWithColor(imageCtx, CGSizeMake(0, 0), self.angle/20, [UIColor blackColor].CGColor);

//define the path
CGContextSetLineWidth(imageCtx, TB_LINE_WIDTH);
CGContextDrawPath(imageCtx, kCGPathStroke);

//save the context content into the image mask
CGImageRef mask = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
UIGraphicsEndImageContext();
在上面的代码中首先创建了一个图形上下文,然后设置了一下阴影。通过 CGContextSetShadowWithColor 方法,我们可以设置如下内容:

上下文
偏移量(此处不需要)
模糊值(该值是通过参数控制的:使用当前的角度除以20,当用户与此控件交互时,以此获得一个简单的动画模糊值)
颜色
接着是根据当前的角度绘制一个相应的弧度。

例如,如果当前的角度变量是360°,那么就绘制一个圆弧,如果是90°,就绘制一个弧度为90°的一个弧。最后,利用 CGBitmapContextCreateImage 方法获取一张图片(刚刚绘制的弧)。这个图片就是我们所需要的掩码图了。

裁剪上下文:

现在我们已经有一个渐变的掩码图了。接着利用函数 CGContextClipToMask 对上下文进行裁剪——给该函数传入上面刚刚创建好的掩码图。代码如下所示:

CGContextClipToMask(ctx, self.bounds, mask);
最后我们来绘制渐变效果,代码如下所示:

//Define the colour steps
CGFloat components[8] = {
0.0, 0.0, 1.0, 1.0, // Start color - Blue
1.0, 0.0, 1.0, 1.0 }; // End color - Violet

CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = (baseSpace, components, NULL, 2);

//Define the gradient direction
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

//Choose a colour space
CGColorSpaceRelease(baseSpace), baseSpace = NULL;

//Create and Draw the gradient
CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient), gradient = NULL;
绘制渐变效果需要很多处理,不过我们可以将其分为4部分:

定义颜色的变化范围
定义渐变的方向
选择颜色空间
创建并绘制渐变
最终的显示效果(看到渐变矩形框的一部分)要归功于之前创建的掩码图。

另外,为了在背景边框模拟光线反射,我添加了一些灯光效果。

1.1.3 绘制手柄

下面我们根据当前的角度值,在的正确位置绘制出手柄。

实际上,在绘制过程中,这一步非常简单,复杂一点的就是计算一下手柄所在的位置。

这里我们需要使用三角函数将一个 标量值(scalar number) 转换为 CGPoint 。不要担心有多复杂,只需要使用Sin和Cos函数就可以完成。代码如下所示:

-(CGPoint)pointFromAngle:(int)angleInt{

//Define the Circle center
CGPoint centerPoint = CGPointMake(self.frame.size.width/2 - TB_LINE_WIDTH/2, self.frame.size.height/2 - TB_LINE_WIDTH/2);

//Define The point position on the circumference
CGPoint result;
result.y = round(centerPoint.y + radius * sin(ToRad(-angleInt))) ;
result.x = round(centerPoint.x + radius * cos(ToRad(-angleInt)));

return result;
}
上面的代码中,指定一个角度值,然后计算出在圆周上面的位置,当然,这里需要圆周的中心点和半径。

使用sin函数在使用sin函数时,需要一个Y坐标值,而cos函数则需要X坐标值。

需要注意的是此处每个函数返回的值都认为半径为1,所以需要将所得结果乘以我们指定的半径大小,并相对于圆周的中心做计算。

希望下面的公式对你的理解有所帮助:

1
2
point.y = center.y + (radius * sin(angle));
point.x = center.x + (radius * cos(angle));
通过上面的计算,现在我们已经知道手柄的具体位置了,所以,接下来就直接将手柄绘制到指定位置即可,如下代码所示:

-(void) drawTheHandle:(CGContextRef)ctx{

CGContextSaveGState(ctx);

//I Love shadows
CGContextSetShadowWithColor(ctx, CGSizeMake(0, 0), 3, [UIColor blackColor].CGColor);

//Get the handle position!
CGPoint handleCenter = [self pointFromAngle: self.angle];

//Draw It!
[[UIColor colorWithWhite:1.0 alpha:0.7]set];
CGContextFillEllipseInRect(ctx, CGRectMake(handleCenter.x, handleCenter.y, TB_LINE_WIDTH, TB_LINE_WIDTH));

CGContextRestoreGState(ctx);
}
具体操作步骤如下:

保存当前的上下文(当在一个单独的函数中进行绘制任务时,将上下文的状态进行保存是编程的一个好习惯)。
给手柄设置一些阴影效果
定义手柄的颜色,然后利用 CGContextFillEllipseInRect 将其绘制出来。
我们在drawRect函数的最后调用上面这个方法:

1
[self drawTheHandle:ctx];
至此,我们就完成了绘制部分的任务。

1.2 跟踪用户的操作
在UIControl的子类中,我们可以 override 3个特殊的方法来提供一个自定义的跟踪行为

1.2.1 开始跟踪

当在控件的bound内发生了一个触摸事件,首先会调用控件的 beginTrackingWithTouch 方法。

我们就看看如何 override 这个方法吧:

-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super beginTrackingWithTouch:touch withEvent:event];

//We need to track continuously
return YES;
}
该函数返回的BOOl值决定着:当触摸事件是dragged时,是否需要响应。在我们这里的自定义控件中,是需要跟踪用户的dragging,所以返回YES。

上面这个函数有两个参数:touch对象和事件。

1.2.2 持续跟踪

在上一个方法中我们指定了这里的自定义控件需要跟踪一个持续的事件,所以当用户进行drag时,会调用一个特殊的方法: continueTrackingWithTouch :

-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
该方法返回的BOOL值标示是否继续跟踪touch事件。

通过该方法我们可以根据touch位置对用户的操作进行过滤。例如,我们可以:仅当touch位置与手柄位置相交的时候才激活控件(activate control)。不过在这里我们的控制逻辑并不是这样的,我们希望用户点击任何位置都能对手柄做出相应的位置处理。

本文的该方法负责更新手柄的位置(在后面的一节中会看到我们把该位置信息传递给对应的target上)。

对上面这个方法的override代码如下所示:

-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super continueTrackingWithTouch:touch withEvent:event];

//Get touch location
CGPoint lastPoint = [touch locationInView:self];

//Use the location to design the Handle
[self movehandle:lastPoint];

//We'll see this function in the next section:
[self sendActionsForControlEvents:UIControlEventValueChanged];

return YES;
}
上面的代码中,首先利用 locationInView 获取到touch的位置,然后将该位置传递给 moveHandle 方法,该方法会将传入的值转换为一个有效的手柄位置(a valid handle position)。

此处“a valid position”的意思是什么呢?

此控件的手柄只能在背景圆弧定义的边界范围内做移动,但是我们不希望强制要求用户必须在很小的圆弧内才可以移动手柄,如果非要这样的话,用户体验会非常的糟糕。

moveHandle 的任务就是负责把任意的位置值转变为手柄可移动的值,另外,另外,在该函数中,还对指定的滑块角度值做了转换,代码如下所示:

-(void)movehandle:(CGPoint)lastPoint{

//Get the center
CGPoint centerPoint = CGPointMake(self.frame.size.width/2,
self.frame.size.height/2);

//Calculate the direction from the center point to an arbitrary position.
float currentAngle = AngleFromNorth(centerPoint,
lastPoint,
NO);
int angleInt = floor(currentAngle);

//Store the new angle
self.angle = 360 - angleInt;

//Update the textfield
_textField.text = [NSString stringWithFormat:@"%d",
self.angle];

//Redraw
[self setNeedsDisplay];
}
上面代码中,实际上主要任务都是在 AngleFromNorth 方法中处理的:根据两个point,就会返回一个连接这两点对应的一个角度关系, AngleFromNorth 方法的实现如下所示:

static inline float AngleFromNorth(CGPoint p1, CGPoint p2, BOOL flipped) {
CGPoint v = CGPointMake(p2.x-p1.x,p2.y-p1.y);
float vmag = sqrt(SQR(v.x) + SQR(v.y)), result = 0;
v.x /= vmag;
v.y /= vmag;
double radians = atan2(v.y,v.x);
result = ToDeg(radians);
return (result >=0 ? result : result + 360.0);
}
提醒: angleFromNorth 方法并不是我的原创,我是直接从苹果提供的OSX示例clockControl中拿过来用的。

在上面的代码中,获得了角度值以后,将其存储到 angle 中,然后更新一下textfield的值。

接着调用的 setNeedDisplay 是为了确保 drawRect 被调用,以尽快在界面上做出相应的更新。

1.2.3 结束跟踪

当跟踪结束的时候,会调用下面这个方法:

-(void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super endTrackingWithTouch:touch withEvent:event];
}
在本文中,我们并不需要override该方法。如果当用户完成控件的界面操作时,你希望做一些处理,那么该方法会非常有用。

1.3 Target-Action模式
至此,圆形滑块控件可以工作了,你可以drag手柄,并能看到textfield中值的改变。

发送action——控件事件

如果希望自己定制的控件与UIControl行为保持一致,那么当控件的值发生变化时,需要进行通知处理:使用 sendActionsForControlEvents 方法,并制定特定的事件类型,值改变对应的事件一般是 UIControlEventValueChanged 。

苹果已经预定义了许多事件类型(Xcode中,在UIControlEventValueChanged上 cmd + 鼠标单击 )。如果你的控件是继承自UITextField,那么你可能会对 感兴趣,如果你要做一个touch Up action,那么可以使用UIControlTouchUpInside。

如果你注意的话,在本文前部分的continueTrackingWithTouch方法里面,我们调用了 sendActionsForControlEvents 方法:

[self sendActionsForControlEvents:UIControlEventValueChanged];
这样处理之后,当控件值发生变化时,每一个对象(观察者——注册该事件)都会收到响应的通知。

Ⅸ 在VC中MFC,新建对话框该如何建立控件啊(比如static text , edit box等等)

|可以在工具箱中来点击对源应的图标。然后在对话框上画出即可,如动态创建,如cedit,
CEdit* pEdit = new CEdit;
pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
CRect(10, 10, 100, 100), this, 1);

Ⅹ edi文件阅读问题,急急急

EDI是电子数据交换,是数据存在的一种形式,为了方便数据交换,他有自己的标准,用得比较多的是x12(美国标准)和Edifact(联合国标准),你可以用记事本或者写字本等文本文件打开edi文件。

EDI由一个个的segment组成segment都由一个个element组成。为了方便说明,我们先看一个edi的片段(打开你的edi后,你可以看到相似的片段):

.......
NAD*BY*Wal-Mart~
NAD*SE*ABC~
......

第一个NAD的一行是一个segment(segment用~隔开),NAD是segment的名称, BY和Wal-Mart是它的element,用*隔开。BY是buyer(买家)的缩写,Wal-mart(沃尔玛)是buyer的名字。他说明了买家是walmart.同样第二行描述的是SE(SELLER,卖家的信息)。由于edi的segment和elment可以根据不同的事务,去定义是否需要,所以所有的edi都是有一个文件去说明他的segment和element的详细信息的。所以我们只有拥有了这个文件才能知道EDI是拿来干什么用的。

对于oa人员来说等非专业人员,本身往往无法明白edi的内容,但是不要忘记edi的作用是什么?是数据交换,软件人员会根据edi的说明文件,去编写edi的转换系统,把edi里面的数据转化为表单,pdf,网页等形式,这样oa人员就很容易去阅读理解了。

如果你是oa人员,请问一下相关的软件人员吧,看看是否你们的oa系统有这样能够转化edi数据的系统。

热点内容
丁度巴拉斯情人电影推荐 发布:2024-08-19 09:13:07 浏览:886
类似深水的露点电影 发布:2024-08-19 09:10:12 浏览:80
《消失的眼角膜》2电影 发布:2024-08-19 08:34:43 浏览:878
私人影院什么电影好看 发布:2024-08-19 08:33:32 浏览:593
干 B 发布:2024-08-19 08:30:21 浏览:910
夜晚看片网站 发布:2024-08-19 08:20:59 浏览:440
台湾男同电影《越界》 发布:2024-08-19 08:04:35 浏览:290
看电影选座位追女孩 发布:2024-08-19 07:54:42 浏览:975
日本a级爱情 发布:2024-08-19 07:30:38 浏览:832
生活中的玛丽类似电影 发布:2024-08-19 07:26:46 浏览:239