win32如何自己编写控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32如何自己编写控件相关的知识,希望对你有一定的参考价值。

参考技术A 可以!!!
首先要相信,只有你想不到,没有你做不到。VC博大精神。。。

现在就说一下我的思路:

1、首先要远程注入,因为这是跨进程的访问数据,因此,如果不注入的话,是很难从一个进程直接访问另一个进程的空间的,因为每个进程都有自己私有的4G空间。注入的方法很多,不说了。
2、枚举所有的浏览器子窗口。EnumChildWindow
3、监测枚举到的子窗口,获得其注册名字(classname),由此判断是不是一个Edit控件。如果是一个edit控件,则获得它的风格,如果有PASSWORD风格,则说明是一个密码输入框。
4、使用SendMessage( WM_GETTEXT )等函数获得Edit框中的文本。
5、搞定。

另外,至于要判断是不是处于焦点,更简单了。
使用上面第3步得到的Edit句柄,去判断GetFocus()是不是相等。就知道了。

还有,第一步非常重要,否则,余下的都不能实现。

Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)

写给觉得自己编写Delphi很复杂的人,包括自己。

Delphi自己写控件其实并不难,难的在于开发复杂的控件。(其实,编程,很多东西都是会了就不难,因此,我怕自己日后觉得自己写控件很难,特意在这记录自己写控件的过程,顺便也写下接口的使用)

第一步:控件代码:

下面是控件的一个Unit内容:

 

复制代码
代码
unit pgdbedit;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, CnEdit;

const
  IID_pgDBConInterface=\'{88CEA70D-0506-4CC0-ABB0-4BDBFA0DDBCE}\';


type
  TdbType = (dbText, dbInteger, dbFloat, dbBit, dbTime, dbBlob); //文本类型

  IpgDBConInterface = interface(IInterface) //定义数据库操作控件的接口
    [IID_pgDBConInterface]
    //Stdcall是指示函数的参数入栈方式是从右到左
    function GetCanUpdate: Boolean;
    procedure SetCanUpdate(value: Boolean);
    property DB_canUpdate: Boolean read GetCanUpdate write SetCanUpdate; //是否更新数据。
  end;
  TpgDbEdit = class(TEdit, IpgDBConInterface)
  private
    { Private declarations }
    FCanUpdate: Boolean;
    function GetCanUpdate: Boolean;
    procedure SetCanUpdate(value: Boolean);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property DB_canUpdate: Boolean read GetCanUpdate write SetCanUpdate; //是否更新数据。

implementation

function tpgdbedit.GetCanUpdate: Boolean;
begin
  Result:=FCanUpdate;
end;

procedure tpgdbedit.SetCanUpdate(value: Boolean);
begin
  FCanUpdate:=value;
end;
end.
复制代码

 

 

说明:这里没有RegisterComponents是因为打算创建2个包,一个是运行时的包以及设计时的包。

 

第二步:创建注册单元:

下面是这个单元的源码:

 

复制代码
代码
unit pgControlsRegister;

interface
uses
  Classes;

procedure Register;
{* 控件、组件编辑器、属性编辑器注册过程}

implementation

uses
  pgdbedit;

procedure Register;
begin
  RegisterComponents(\'pgControls\', [TpgDbEdit]);
end;

end.
复制代码

 

 

第三步:创建运行时的包:

(文件->新建->其它->Package)

在创建出来的Package中点上面的Add按钮,把第一步中的单元添加进去,然后点上面的Options按钮,在Usage Options中选择Runtime only。点击OK关闭掉Options,然后点Compile进行编译,系统会提示需要加入其它包的,点确认就行了,系统会自动添加必要的包。这样,运行时的包就创建完了。

 

第四步:创建设计时的包:

(文件->新建->其它->Package)

在创建出来的Package中点上面的Add按钮,把第二步中的单元添加进去,然后点上面的Options按钮,在Usage Options中选择Designtime only。点击OK关闭掉Options,然后点Compile进行编译,系统会提示需要加入其它包的,点确认就行了,系统会自动添加必要的包。这样,设计时的包就创建完了。

 

有关这两个包的概念,大家可以去:

http://www.cnpack.org/showdetail.php?id=510&lang=zh-cn

看下介绍,我都是看了介绍才知道,才会去这样弄。这里,我们也是安装设计时的包就行了。运行时的包不用管。

原创作品出自努力偷懒,转载请说明文章出处http://www.cnblogs.com/kfarvid/

http://www.cnblogs.com/kfarvid/archive/2010/08/05/1793219.html

以上是关于win32如何自己编写控件的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Win32 控件来包含其他 Win32 控件?

pthread 的 Win32 替代方案

Win32编程之静态库编写与使用.动态链接库的编写与使用

Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)

如何在 win32 gui 应用程序中使用另一个事件循环

为 Rundll32.exe 编写自己的 dll 的文档? [复制]