一种全新的软件界面设计方法

史上最详细的JS脚本调用VC自定义函数资料(含完整源码) 史上最详细的JS脚本调用VC自定义函数资料 看完准保不后悔 可以节省你很多时间的 实现原理: 利用BHO实现IDocHostUIHandler接口和IDispatch接口 通过BHO拦截网页加载完毕事件,将自己的IDocHostUIHandler接口设置给网页 网页中的JS脚本在调用window.external.abc("asdfa")时触发IDocHostUIHandler接口的GetExternal函数,并将IDispatch接口中abc()函数的接口放回给Js脚本 目前网上并没有如此完美的整套代码,我也是通过网络上只字片解的资源进行的整理和调试. 这份代码我花费了整整一个星期的时间才整理完毕,希望能给用到的人们有所帮助 QQ:280713743 里凡 2011年11月25日 立即下载

一种全新的软件界面设计方法

撰文:Aweay

你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。

下载实例代码

关键字:COM MySpy IE SetUIHanlder IcustomDoc IDocHostUIHandler GetExternal

前言

作者在解决各种问题的时候喜欢首先使用C++ Builder来尝试,这篇文章也是这样,但这并不影响其他开发工具的使用者阅读,因为这都是微软的开发技术,选择什么工具并不重要,我们理解了他的原理可以使用任何工具实现同样的功能。

正文

使用过VC.Net的朋友可能知道,在VC.Net中全新提供了一种基于Web的界面设计方法,不过可能真正用到的人很少,至少我在国内的软件中没有看到过这样的界面设计方法。当初使用VC.net的时候就希望BCB的下个版本可以加入这样灵活的界面设计方法,但是到现在还没有等到,我想也不能一直这样等下去,于是就自己研究其中的实现方法,终于让我研究出来。这篇文章就是讨论这样方法,以及在软件设计设计中的可行性。

说了这么多,可能还有朋友不知道这样的界面到底有什么不同,有什么优点呢?如果你也有同样的好奇感的话,请你继续看下去。

在Windows2000下,大家经常使用控制面板/添加、卸载软件的对话框就是基于这样的界面(Xp下暂时不清楚),我不说出来可能很少有人知道-那个对话框整个就是个网页?什么你不相信?如果是网页为什么能和本地的计算机程序交互?为什么不能选择网页里面的文字?为什么不能弹出右键菜单?如果是网页,那它的html代码在那里?

为了证明上面的说法,我们需要一些特殊的软件,这个软件就是作者写的MySpy,可以到作者的站点(http://siney.yeah.net)免费下载使用,我们可以从MySpy的界面中看到添加/删除程序的对话框是个Internet Explorer_Server,这说明它是个网页,

在MySpy的Web页面还可以看到这个页面的地址是:res://sp3res.dll/default.hta,

近一步使用MySpy得到这个网页的代码(不能直接右键获取代码),部分如下:

<HTML xmlns:ctls><HEAD><TITLE id=ARP>添加/删除程序</TITLE>

< META http-equiv=Content-Type content="text/html; charset=gb2312"><BASE href=res://appwiz.cpl/><LINK href="arp.css" type=text/css rel=stylesheet>

<STYLE>>ctls/:PLACES { behavior: url(places.htc); }ctls/:LISTBOX { behavior: url(listbox.htc); }ctls/:ACCEL { behavior: url(accel.htc); }.PlacesBar {background-color:threedshadow}.Hide {display:none}.NonClientBackground {                          background-color: buttonface;}.Header {                                       padding-bottom: 5px;vertical-align: text-top; }.GroupImage {                                   margin-right: 5px;}.GroupDesc {padding-left: 1em;padding-right: 1em;}.AppNameRow {}.AppImageTD {width: 20px; padding: '4px 2px 2px 2px';}.InfoPane {                                     padding-top:4px;                            vertical-align: top;}.PropLabel {width: 7em;padding-top: 2px;padding-bottom: 2px;padding-right: 3px;text-align: right;}.PropValue {width: 6em;text-align: right;padding-right: 7px;}.AddPropLabel {padding-top: 2px;padding-bottom: 2px;padding-right: 3px;text-align: right;}.AddPropValue {width: 13em;text-align: right;padding-right: 7px;}.ButtonDescPane {                               padding-top: 5px;                           padding-bottom: 7px;padding-right: 5px;}.ButtonPane {                                   width: 15em;                                padding: 5px;                               text-align: right;}.FakeAnchor {cursor:hand;}#idClientCatName {font-weight: bold;padding-bottom: 1ex;}.disabled {color: graytext;}#idTblExtendedProps.Focus {color: highlighttext;}</STYLE>

 

嗬嗬,是不是很神奇呢,这只是一个应用的例子,其实还有很多软件的界面使用了上面的方法来创建界面,比如Norton AntiVirsu,MS Visual Studio.net,C# Builder等。其实深入仔细思考的话,这样的界面最困难的是如何和本地代码交互,为什么在网页里点一个按钮能执行自己的代码呢?有过COM编程经验的人,可能会想到用COM编写一个外部对象,在网页中使用脚本创建这个对象,然后调用对象的方法似乎可以完成这样的功能?但是这里有很多不好的地方:

1.         需要注册COM的本地运行安全,否则IE会有安全警告,这肯定是最终用户不愿意看到的;

2.         用户可以轻松从html代码里获得COM对象的使用方法(就像上面用MySpy获得代码一样),这样他们可以轻松使用你的COM对象完成他们自己的界面,这样不够隐蔽,不安全。

也许还有更多不好的地方,但暂时作者没有想到,因为微软及其他软件公司都不是这样做的,他们也许知道更多。下面我们就来讨论一种既安全又隐蔽的实现方法。

从IE4开始,微软提供了一个ICustomDoc接口,ICustomDoc的SetUIHandler允许用户设置一个基于IDocHostUIHandler的接口来接管界面处理器,在IDocHostUIHandler提供了很多的虚拟方法,需要程序员来重载他们实现不同的定制功能,这里有一篇文章详细介绍了这些信息http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp,在这里我们需要重载GetExternal方法来扩展IE DOM,如果我们成功的扩展了DOM,那么我们就这可以这样编写html代码来实现与本地程序交互,例如:

<html>

<head>

<SCRIPT language="JScript">

function MyFunc()

{

    external.HelloWorld(); //HelloWorld是我们扩展的方法

}

</SCRIPT>

</head>

<body>

<input type="Button" value="Show hello world" onClick="MyFunc();" />

</body>

</html>

HelloWorld就是我们扩展的一个方法,当点击按钮的时候external对象会调用HelloWorld方法调用本地代码,对于external对象则会调用上面提到的GetExternal方法来查询是否提供了扩展,下面是如何实现GetExternal方法来实现扩展external对象,代码如下:

class MyDocHandler :public IDocHostUIHandler

{

  long refcount;

public:

  MyDocHandler() :refcount(1){ }

  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID classid, void** intf) {

    if (classid == IID_IUnknown)

    {

      *intf = (IUnknown*)this;

      AddRef();

    }

    else if (classid == IID_IDocHostUIHandler)

    {

      *intf = (IDocHostUIHandler*)this;

      AddRef();

    }

    else if (classid == IID_IDispatch)

    {

      *intf = (IDispatch*)this;

      AddRef();

    }

    else

      return E_NOINTERFACE;

    return S_OK;

  }

  virtual ULONG STDMETHODCALLTYPE AddRef() {

    InterlockedIncrement(&refcount);

    return refcount;

  }

  virtual ULONG STDMETHODCALLTYPE Release() {

    InterlockedDecrement(&refcount);

    if (refcount == 0)

      delete this;

    return refcount;

  }

  //返回S_OK,屏蔽掉右键菜单

  virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(

    /* [in] */ DWORD dwID,

    /* [in] */ POINT __RPC_FAR *ppt,

    /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,

    /* [in] */ IDispatch __RPC_FAR *pdispReserved) {

        return S_OK;

    }

  virtual HRESULT STDMETHODCALLTYPE GetHostInfo(

    /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE ShowUI(

    /* [in] */ DWORD dwID,

    /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,

    /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,

    /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,

    /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE HideUI( void) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE UpdateUI( void) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE EnableModeless(

    /* [in] */ BOOL fEnable) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(

    /* [in] */ BOOL fActivate) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(

    /* [in] */ BOOL fActivate) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE ResizeBorder(

    /* [in] */ LPCRECT prcBorder,

    /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,

    /* [in] */ BOOL fRameWindow) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(

    /* [in] */ LPMSG lpMsg,

    /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,

    /* [in] */ DWORD nCmdID) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(

    /* [out] */ LPOLESTR __RPC_FAR *pchKey,

    /* [in] */ DWORD dw) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE GetDropTarget(

    /* [in] */ IDropTarget __RPC_FAR *pDropTarget,

    /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE GetExternal(

    /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) {

      *ppDispatch = new MyCommandHandler();

      return S_OK;

    }

  virtual HRESULT STDMETHODCALLTYPE TranslateUrl(

    /* [in] */ DWORD dwTranslate,

    /* [in] */ OLECHAR __RPC_FAR *pchURLIn,

    /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut) {

        return E_NOTIMPL;

    }

  virtual HRESULT STDMETHODCALLTYPE FilterDataObject(

    /* [in] */ IDataObject __RPC_FAR *pDO,

    /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet) {

        return E_NOTIMPL;

    }

};

上面重载了ShowContextMenu方法屏蔽掉右键菜单,使用户不能得到网页代码,关于GetExternal是这样实现的:

  virtual HRESULT STDMETHODCALLTYPE GetExternal(

    /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) {

      *ppDispatch = new MyCommandHandler();

      return S_OK;

    }

可以看到只是简单返回了MyCommandHandler对象,MyCommandHandler必须继承自IDispatch接口来实现支持自动化的调用方式,它是这样实现的:

class MyCommandHandler : public IDispatch

{

  long refcount;

public:

  MyCommandHandler() :refcount(1){ }

  virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(

            /* [out] */ UINT *pctinfo){

    return S_OK;

  }

  virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(

      /* [in] */ UINT iTInfo,

      /* [in] */ LCID lcid,

      /* [out] */ ITypeInfo **ppTInfo){

      return S_OK;

  }

        virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(

            /* [in] */ REFIID riid,

            /* [size_is][in] */ LPOLESTR *rgszNames,

            /* [in] */ UINT cNames,

            /* [in] */ LCID lcid,

            /* [size_is][out] */ DISPID *rgDispId){

            *rgDispId=1;

            return S_OK;

        }

        virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(

            /* [in] */ DISPID dispIdMember,

            /* [in] */ REFIID riid,

            /* [in] */ LCID lcid,

            /* [in] */ WORD wFlags,

            /* [out][in] */ DISPPARAMS *pDispParams,

            /* [out] */ VARIANT *pVarResult,

            /* [out] */ EXCEPINFO *pExcepInfo,

            /* [out] */ UINT *puArgErr){

            if(dispIdMember==1)

            {

              MessageBox(0,"Hello World","Hello",0); //place your code here

              frmweb->Edit1->Text="Hello World(这也可以?)";

            }

            return S_OK;

        }

  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID classid, void** intf) {

    if (classid == IID_IDispatch)

    {

      *intf = (IDispatch*)this;

      AddRef();

    }

    else

      return E_NOINTERFACE;

    return S_OK;

  }

  virtual ULONG STDMETHODCALLTYPE AddRef() {

    InterlockedIncrement(&refcount);

    return refcount;

  }

  virtual ULONG STDMETHODCALLTYPE Release() {

    InterlockedDecrement(&refcount);

    if (refcount == 0)

      delete this;

    return refcount;

  }

};

如果大家了解一些COM知识,我们知道这里关键的是GetIDsOfNames和Invoke方法的实现,因为自动化对象只能通过这样的方式来调用,而不能使用函数指针直接调用虚拟方法,GetIDsOfNames查询指定的函数名的调用ID,就是说如果有一个方法是“HelloWorld”,那么它会先调用GetIDsOfNames方法来查询这个方法是否支持,如果支持则给出该方法的调用ID(通过修改rgDispId[out]参数),如果不支持则返回E_NOTIMPL,他的实现简单如下:

        virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(

            /* [in] */ REFIID riid,

            /* [size_is][in] */ LPOLESTR *rgszNames,

            /* [in] */ UINT cNames,

            /* [in] */ LCID lcid,

            /* [size_is][out] */ DISPID *rgDispId){

            *rgDispId=1;

            return S_OK;

        }

这里我们假定了只有一个扩展函数HelloWorld,如果有多个,我们需要比较rgszNames参数的函数名返回不同的调用ID,有了调用ID,实现Invoke方法就很简单了:

virtual HRESULT STDMETHODCALLTYPE Invoke(

            /* [in] */ DISPID dispIdMember,

            /* [in] */ REFIID riid,

            /* [in] */ LCID lcid,

            /* [in] */ WORD wFlags,

            /* [out][in] */ DISPPARAMS *pDispParams,

            /* [out] */ VARIANT *pVarResult,

            /* [out] */ EXCEPINFO *pExcepInfo,

            /* [out] */ UINT *puArgErr){

            if(dispIdMember==1)

            {

              MessageBox(0,"Hello World","Hello",0); //place your code here

              frmweb->Edit1->Text="Hello World(这也可以?)";

            }

            return S_OK;

        }

根据dispIdMember的不同实现不同的代码,如果方法是有参数的可以在pDispParams中取得,如果有什么不明白可以参考MSDN和一些COM的书籍,这里就不详细解释了。

最后我们要做的就是使我们的浏览器知道我们扩展了external,代码如下:

  dochandler = new MyDocHandler;

  webBrowser->Navigate(WideString(L"E://Projects//extWeb//ext.htm"));

  while(webBrowser->Busy)

      Application->ProcessMessages();

  ICustomDoc *custdoc;

  webBrowser->Document->QueryInterface(&custdoc); //取得IcustomDoc接口

  if (custdoc)

  {

    custdoc->SetUIHandler(dochandler); //设置我们自己的界面处理器

    custdoc->Release();

  }

注意上面的粗体“我们的浏览器”,因为这样的扩展仅针对与自己程序里使用WebBrowser控件,不影响IE本身的扩展,也就是说那个ext.htm文件只能在我们的程序中有效,就算其他用户得到了这段htm代码也不能正常运行的,如果你想测试,你得到的是:

因为他们并不知道如何扩展external对象,这点就解决了刚才我们说的使用COM的问题。

说句实话设计这样界面还是有一定难度的,那么它在实际开发中到底有什么好处呢?我想至少有以下几点:

1.       界面设计和程序逻辑设计分离,美工可以和程序员一起工作,界面设计再也不是没有审美细胞程序员的问题;

2.       轻松实现Skin功能,界面的改变不需要重新编译代码,只需要换一个不同htm代码文件就可以;

3.       再也无法使用Spy工具获得窗体Handler做各种Hook,使你的程序运行的更安全;

4.       充分使用IE现有技术,搭建功能更强大的软件;

5.       使你的软件看起来更酷,更专业。

怎么样?心动了吗?赶快改善你的界面吧。如果你有更多想法,可以通过 siney@yeah.net 取得联系。

界面设计的方法和指导原则 软件界面设计需要有一定的指导原则,需要了解大众用户的思维习惯和操作习惯。。。 立即下载

相关推荐

gui界面设计的方法

基于MATLAB图像处理中gui平台界面设计的方法。该实验平台主要包括图像处理中的几何变换、图像增强、图像平滑、边缘与分割、假彩色编码等模块内容,其中,几何变换模块主要包含了图像平移、图像镜像、图像旋转、图像错切、比例缩放、复合变换等功能;图像增强由线性变换、行对数变换、直方图均衡化、直方图规定化、索引/二值图像等5个功能块组成;图像平滑主要包括模拟噪声生成、邻域平均、中值滤波、巴特沃斯低通滤波、指数型低通滤波、梯形低通滤波、Sobel 算子滤波、空域高通滤波等功能模块;边缘与分割分为图像分割、Hough变换、边缘检测等3个模块;假彩色编码包括RGB空间伪彩色编码、灰度彩色变换法编码和频率伪彩色编码等三个功能模块。

在C++ Builder6上使用Boost正则表达式库

在C++ Builder6上使用Boost正则表达式库撰文:Aweay正则表达式是一种模式匹配形式,它通常用在处理的文本程序中。比如我们经常使用的grep工具,还是perl语言都使用了正则表达式。传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑柄,现在情况不一样了,因为有了boost。Boost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效

Siney的BlOG http://www.sineysoft.com 8117

CSR mascon产品深度解析

GRACE数据产品 mascon产品 质量变化 地球重力场

weixin_43047707的博客 4432

【产品设计】界面设计方法(7):界面的布局

为了满足客户的需求,软件界面的表达形式千差万别;但与网站的界面形式(电子商务、政府政务、各类网站等)相比,作为企业管理(ERP)类系统的界面形式比较低调;由于需要长时间对着屏幕操作、观看、思考,因此要设计得比较沉稳、简洁,布局的规律性强,表达形式也不需要过于炫耀、跳跃、刺激。这里介绍几种最为常见和常用的PC端界面形式:卡片式、列表式、主细表式、树形式和页签式,以及这些界面形式对应的设计原则;这几种形式基本上可以满足大部分客户业务处理的需求,如有不同之处,本文中的设计原则也可以作为参考之用。前面介绍了界面、控

杰西笔记 6266

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

如何在R语言中使用Logistic回归模型

在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价、身高、GDP、学生成绩等,发现这些被预测的变量都属于连续型变量。然而有些情况下,被预测变量可能是二元变量,即成功或失败、流失或不流失、涨或跌等,对于这类问题,线性回归将束手无策。这个时候就需要另一种回归方法进行预测,即Logistic回归。 在实际应用中,Logistic模型主要有三大用途: 1)寻找危险因素,找到某些影响...

weixin_34056162的博客 9552

java中栈区、堆区、数据区和代码区

栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。 堆区:用于存放动态分配的对象, 当你使用 malloc和new 等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你 能够 free和delete它们。 数据区:全局,静态和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。 ...

qq_37089829的博客 815

周志华《机器学习》课程系列笔记——目录导航页

最近自学机器学习课程,注意到了南京大学周志华老师的课程。我是在学堂在线平台观看的,注意到b站上也有相应视频,但b站上并未获得授权,随时有消失的可能。周志华老师的网络教学视频中,与其西瓜书相比确实少了一些内容。但幸运的是,缺失的内容实际上对于初学者来说并不会产生太大影响。目前这一笔记也遵循视频内容,相比西瓜书中也会有一些缺失,敬请谅解。可能以后如果有机会和时间,我会再阅读周志华老师的书籍将缺失内容补全。一切内容敬请关注我的个人Page页面。

Sinocifengs的博客 1685

电子科大软件系统架构设计——用户界面设计

Web总体页面结构是指连接Web系统所有页面的整体结构模型,它决定了系统功能模块组织、页面导航路径、人机交互关系。移动App是指基于移动终端设备 (如智能手机、平板电脑、可穿戴设备等)的应用软件。移动App已广泛应用在信息系统中,成为用户普遍使用的应用软件。

m0_63230155的博客 4979

BUCK 电路详解

参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到,使用一个滑动变阻器即可实现降压和稳压的效果。当负载波动时,通过改变滑动变阻器的阻值,可以调节负载所获得的电压。但是使用滑动变阻器的劣势也很明显,大量的耗能会导致器件温度快速升高。 上面所提到的电路主要缺点在于导通器件(变阻器或三极管)本身存在耗能,那么有没有不会耗能的导通器件呢?

Guanngxu的博客 3985

智慧工地算法视频分析服务器区域入侵检测AI视频分析技术在煤矿的实战应用

通过实时分析和处理井下视频资料,智慧矿山算法视频分析服务器不仅能够及时发现并预警人员违规行为和设备异常状况,还能够通过智能分析预防潜在的安全风险,从而显著提高煤矿的安全管理水平和生产效率。

EasyDarwin开源社区技术博客 560

如何做好软件界面设计?2个方法一次掌握!

好的软件界面设计要做到清晰、舒适、美观。要想做好软件界面设计,需要遵循软件界面设计的 4 大原则:清晰、高效、一致、明了。同时还需要不断的临摹优质的软件界面设计,取长补短,渐渐精进自己的软件界面设计能力!

FourxiYuanzi的博客 2841

(五)激光线扫描-位移台标定

线激光属于主动测量方式,但是由于线激光的特性,我们只能通过提取激光中心线获取这一条线上的高度信息,那么要进行三维重建的话,就需要通过平移或者是旋转的方式,来让线激光扫描被测物体的完整轮廓,也就是整个表面。激光线的密度越高还原出来的物体越细腻,但由于数据量大,也会导致速度变慢。下面以位移台为例讲解,如何标定位移台。

FlyWine的博客 2889

一种全新的软件界面设计方法 (一)

一种全新的软件界面设计方法撰文:Aweay下载本文实例代码(代码已更新2004.12.10)关键字:COM MySpy IE SetUIHanlder IcustomDoc IDocHostUIHandler GetExternal 前言作者在解决各种问题的时候喜欢首先使用C++ Builder来尝试,这篇文章也是这样,但这并不影响其他开发工具的使用者阅读,因为这都是微软的

ClassFree(自由魔方)的Blog 1604

实时数字人SoulX-FlashHead 音视频不对齐解决

【代码】实时数字人SoulX-FlashHead 音视频不对齐解决。

jacke121的专栏 200

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一种全新的软件界面设计方法(续)

一种全新的软件界面设计方法(续)点击下载文章所附代码撰文:Aweay你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。前段时间,笔者写了一篇关于使用Web页面设计见面用于Win32应用程序的文章,详细内容请点击这里参考此文。但很可惜很多网友发mail说不知道我写的是什么,不就是设计网页嘛,早都有的技术为什么说是“全新的”的呢?还有网友提出如何实现像网

Siney的BlOG http://www.sineysoft.com 4177

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[转]一种全新的软件界面设计方法

一种全新的软件界面设计方法撰文:Aweay你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。下载实例代码关键字:COM MySpy IE SetUIHanlder IcustomDoc IDocHostUIHandler GetExternal 前言作者在解决各种问题的时候喜欢首先使用C++ Builder来尝试,这篇文章也是这样,但这并不影

wuhran的Blog-C++,Linux,MySQL,PHP 875

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一种全新的软件界面设计方法(摘)

下载实例代码关键字:COM MySpy IE SetUIHanlder IcustomDoc IDocHostUIHandler GetExternal 前言作者在解决各种问题的时候喜欢首先使用C++ Builder来尝试,这篇文章也是这样,但这并不影响其他开发工具的使用者阅读,因为这都是微软的开发技术,选择什么工具并不重要,我们理解了他的原理可以使用任何工具实现同样的功能。正文

abysm的专栏 1779

一种全新的软件界面设计方法(续)

点击下载文章所附代码你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。前段时间,笔者写了一篇关于使用Web页面设计见面用于Win32应用程序的文章,详细内容请点击这里参考此文。但很可惜很多网友发mail说不知道我写的是什么,不就是设计网页嘛,早都有的技术为什么说是“全新的”的呢?还有网友提出如何实现像网际飞音那样的自定义协议,比如安装网际飞音后中浏览器会处理dnmp

xu的blog 1632

全新的界面设计

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_36042918的博客 689
上一篇: 深入分析基于VCL派生的ActiveX控件的实现原理及应用
下一篇: 一种全新的软件界面设计方法(续)
Siney
博客等级 码龄24年 16粉丝 24原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值