读书人

模仿QQ的小键盘控件以及圆形密码解决方

发布时间: 2012-03-16 16:34:56 作者: rapoo

模仿QQ的小键盘控件以及圆形密码
效果图

渐变按键,用了图片的

只用颜色的



小键盘控件下载地址
http://download.csdn.net/source/2403660

实现方法
1.新建一个窗体,用来放小键盘,设置窗体BorderStyle为BsNone,AutoSize为True
窗体设置为自动创建,不要每次按小键盘按钮的时候动态创建一个然后释放,因为这个窗体
有可能需要经常显示。

2.自定义一个消息 WM_PASSWORDADDCHAR = WM_USER + 100;
在主界面上处理此消息

Delphi(Pascal) code
  procedure TMainForm.WMPASSWORDADDCHAR(var Message: TMessage);  begin    PasswordEdit.Text := PasswordEdit.Text + '●';  end;  

3.声明3个全局变量
Delphi(Pascal) code
  TruePassword: string;//用来存储真正的密码  PasswordSelStart: Integer;//密码框中光标所处位置  MouseOnKeyPad: Boolean; //鼠标是否在小键盘按钮上  


4.在小键盘的OnKeyPadClick事件中加入以下代码
Delphi(Pascal) code
    procedure TKeyPadForm.MyKeypadKeyPadClick(var aChar: Char);  begin    //密码长度超过16 则发出警告然后退出    if Length(TruePassword) >= 16 then begin      MessageBeep(MB_OK);       Exit; end;    //发送消息使密码框增加一个●    PostMessage(Application.MainForm.Handle, WM_PASSWORDADDCHAR, 0, 0);    //修改密码 achar为鼠标点击小键盘的字符    Insert(aChar, TruePassword, PasswordSelStart + 1);    //光标向前进一位    PasswordSelStart := PasswordSelStart + 1;    //随机改变小键盘上按键的顺序    MyKeypad.RandomKeyPad;  end;  

5.小键盘按钮点击事件
Delphi(Pascal) code
  procedure TMainForm.KeyPadBtnClick(Sender: TObject);  var    BtnPoint: TPoint;  begin    //判断小键盘窗体有无显示    if not KeyPadForm.Showing then    begin      //计算小键盘窗体在屏幕上显示的坐标      BtnPoint.X := KeyPadBtn.Left - 4;      BtnPoint.Y := KeyPadBtn.Top + 17;      BtnPoint := ClientToScreen(BtnPoint);      KeyPadForm.Top := BtnPoint.Y;      KeyPadForm.Left := BtnPoint.X;      KeyPadForm.Show;      //初始化光标位置      PasswordSelStart := PasswordEdit.SelStart;     end else KeyPadForm.Hide;  end;  

6.主窗体被激活的时候需要隐藏小键盘
Delphi(Pascal) code
  procedure TMainForm.FormActivate(Sender: TObject);  begin    //防止小键盘显示不正确     //因为有可能主窗体激活事件和小键盘按钮点击事件接连发生    if MouseOnKeyPad then Exit;    if KeyPadForm.Showing then KeyPadForm.Hide;  end;  procedure TMainForm.KeyPadBtnMouseEnter(Sender: TObject);  begin    MouseOnKeyPad := True;  end;  procedure TMainForm.KeyPadBtnMouseLeave(Sender: TObject);  begin    MouseOnKeyPad := False;  end;   

7.现在小键盘可以使用了,但是密码框还是不行
Delphi(Pascal) code
  procedure TMainForm.PasswordEditKeyPress(Sender: TObject; var Key: Char);  begin    case Ord(Key) of      8: DeletePasswordStr;//是BackSpace键的话就删除选中的字符      13: BtnClick;//是回车的话就点击按钮    //如果字符被允许则增加    else if IsAllowedPasswordChar(Key) then AddPasswordChar(Key);    end;    Key := Chr(0);  end;  procedure TMainForm.DeletePasswordStr;  var    SelStart: Integer;    SelLength: Integer;  begin    SelStart := PasswordEdit.SelStart;    SelLength := PasswordEdit.SelLength;    //删除TruePassword对应字符串    if SelLength <> 0 then      Delete(TruePassword, SelStart + 1, SelLength)    else if SelStart <> 0 then    Delete(TruePassword, SelStart, 1) else MessageBeep(MB_OK);    //同步TruePassword长度与密码框中●的个数    PasswordEdit.Text := CreatePasswordStrByCount(Length(TruePassword));    if SelLength <> 0 then PasswordEdit.SelStart := SelStart else    PasswordEdit.SelStart := SelStart - 1;  end;  procedure TMainForm.AddPasswordChar(const aChar: Char);  var    SelStart: Integer;    SelLength: Integer;  begin    SelStart := PasswordEdit.SelStart;    SelLength := PasswordEdit.SelLength;       if SelLength <> 0 then      Delete(TruePassword, SelStart + 1, SelLength)    else if Length(TruePassword) = 16 then begin    MessageBeep(MB_OK); Exit; end;    Insert(aChar, TruePassword, SelStart + 1);    //同步TruePassword长度与密码框中●的个数    PasswordEdit.Text := CreatePasswordStrByCount(Length(TruePassword)); ;    PasswordEdit.SelStart := SelStart + 1;  end;  function CreatePasswordStrByCount(aPasswordCharCount: Integer): string;  var    i: Integer;  begin    Result := '';    for I := 0 to aPasswordCharCount - 1 do      Result := Result + '●';  end;   



[解决办法]
看了下 真的很不错!!
[解决办法]
好贴要顶
[解决办法]
共享精神值得提倡
[解决办法]
看了下 真的很不错!!
[解决办法]
好东西,学习~~~
[解决办法]
好好的顶下
[解决办法]
不错,有创意
[解决办法]
共享精神值得提倡
[解决办法]
好东西,谢了
[解决办法]
学习了
[解决办法]

[解决办法]
很有意思,顶一下,谢谢分享好创意
[解决办法]
什么东西啊
[解决办法]
哇,不错,顶一个!
[解决办法]
learning......
[解决办法]
看了下 真的很不错!!
[解决办法]
学习!
[解决办法]
顶下,有用的东西饿
[解决办法]
学习


[解决办法]
顶一下 哈

[解决办法]
啊啊啊啊啊啊
[解决办法]
顶一个,呵
[解决办法]
卡不到
[解决办法]
学习学习了
[解决办法]
看了下 真的很不错!!
[解决办法]
学习.
[解决办法]
学习了。
[解决办法]
不赖,顶起
[解决办法]
不赖,顶起
[解决办法]
看了下 真的很不错!!
[解决办法]
呵呵 呵呵
[解决办法]
呵呵 呵呵
[解决办法]
呵呵 呵呵
[解决办法]
顶一个


[解决办法]
=======================================
[解决办法]
好东西,顶,随便也学习了
[解决办法]
Delphi写的我就不看了
[解决办法]
好!顶一个!
[解决办法]
那么帅啊
[解决办法]
什么东东啊!
[解决办法]
zhenhao a heheh
[解决办法]
支持支持
[解决办法]
路过,路过,学习
[解决办法]
这个很不错哦

[解决办法]
不错!
顶起!
[解决办法]
广告占太多页面了,请版主处理一下
[解决办法]
呵呵呵呵呵呵呵
[解决办法]
学习………………………………
[解决办法]
好东西,学下下
[解决办法]
不错不错,来看看
[解决办法]
mark+ 收藏
[解决办法]
谢谢分享
[解决办法]
不错,好东西呀!顶一个。。。。
[解决办法]
厉害,代码蛮简单的,易学!谢谢
[解决办法]
貌似不支持vb.net啊
[解决办法]
mark!
[解决办法]
好东西啊,收藏了,下次肯定用得着!
[解决办法]
好好学习 天天向上

[解决办法]
看了下 真的很不错!!
[解决办法]
很好!谢谢分享

[解决办法]
真的很不错,谢谢
[解决办法]
真的不错,谢啦~~
[解决办法]
分享高尚!!!!
[解决办法]
呵呵,不错哦,吼
[解决办法]
很有意思啊

[解决办法]
UPUP
[解决办法]
jf,jf
[解决办法]
好好啊
------解决方案--------------------


先试试,很好
[解决办法]
不错不错,学习了,
[解决办法]
犀利!  学习了
[解决办法]
收藏先。。。
[解决办法]
看起来挺复杂的.
[解决办法]
好东西.学习了
[解决办法]
好东西啊,先保存了再慢慢研究
[解决办法]
犀利!  学习了
[解决办法]
恩,这个非常不错
[解决办法]
不错啊
[解决办法]
不错,MARK!
[解决办法]
好东西,看看
[解决办法]
好东西,看看去
[解决办法]
不错,顶一下
[解决办法]
lz好人呀,谢谢分享!我收藏了……
[解决办法]
真的很不错,可是广告却是让人很讨厌。
[解决办法]
好强,学习学习
[解决办法]
学习了~~~~~~~~~~~~~~~~~~~~~~~~~
[解决办法]
基础真扎实 谢谢分享 顶LZ
[解决办法]
不错,学习了。
[解决办法]
好好学习哈。。
[解决办法]
好东西,写了,我要了
[解决办法]
学习。。。

读书人网 >.NET

热点推荐