捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:微软手写(Microsoft Tablet PC)
laihongbo 41755 2011/8/5 14:13:23
用到什么组件, 请去下载Microsoft Tablet PC Platform SDK了解一下...

使用例子, 例子写得很简单, 不懂的自已摸索...
uses HandWriter;

Procedure TForm1.FormCreate(Sender: TObject);
Var
  I: Integer;
Begin
  HandWrite := THandWriteX.Create(self);
  HandWrite.InitHandWrite(WritePanel.Handle);
  HandWrite.OnRecognizerContext := HandWriteRecognizer;
  SetLength(ResultBtn, HandWrite.MaxResult);
  For I := 0 To HandWrite.MaxResult - 1 Do
    ResultBtn[I] := TSpeedButton(FindComponent(format('SpeedButton%d', [I + 1])));
  ResultList := TStringList.Create;
End;

Procedure TForm1.HandWriteRecognizer(ASender: TObject; Const ContextList: WideString);
Var
  I: Integer;
Begin
  Timer.Enabled := false;
  Timer.Enabled := True;

  ResultList.Text := ContextList;
  For I := 0 To ResultList.Count - 1 Do
    ResultBtn[I].Caption := ResultList[I];
End;

Procedure TForm1.ClearBtnClick(Sender: TObject);
Var
  I: Integer;
Begin
  For I := Low(ResultBtn) To High(ResultBtn) Do
    ResultBtn[I].Caption := '';
  ResultEdit.Clear;
  HandWrite.ClearStroke;
End;

Procedure TForm1.SendText(Text: String);
Const
  CtNum: Array['0'..'9'] Of Byte = (VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9);
Var
  I, J: Integer;
  ch: Byte;
  SCanCode: Byte;
  S: String;
Begin
  I := 1;
  While I <= Length(Text) Do
  Begin
    ch := Byte(Text[I]);
    If IsDBCSLeadByte(ch) Then
    Begin
      S := IntToStr(Word(Text[I]) Shl 8 + Word(Text[I + 1]));
      keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
      For J := 1 To Length(S) Do
      Begin
        ch := CtNum[S[J]];
        SCanCode := MapVirtualKey(Word(ch), 0);
        keybd_event(Word(ch), SCanCode, 0, 0);
        keybd_event(Word(ch), SCanCode, KEYEVENTF_KEYUP, 0);
      End;
      keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
      Inc(I, 2);
    End
    Else
    Begin
      SCanCode := MapVirtualKey(Word(ch), 0);
      keybd_event(ch, SCanCode, KEYEVENTF_EXTENDEDKEY Or 0, 0);
      keybd_event(ch, SCanCode, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0);
      Inc(I);
    End;
  End;
End;
Procedure TForm1.SpeedButtonClick(Sender: TObject);
Var
  wsStr: WideString;
Begin
  { wsStr := ResultEdit.Text;
   wsStr := wsStr + (Sender As TSpeedButton).Caption;
   ResultEdit.Text := wsStr;    }
  SendText((Sender As TSpeedButton).Caption);
  HandWrite.ClearStroke;
  Timer.Enabled := false;          //无点击时,自动选择第一个
End;

Procedure TForm1.TimerTimer(Sender: TObject);
Begin
  SpeedButton1.Click;
End;

Procedure TForm1.ColorBox1Change(Sender: TObject);
Begin
  HandWrite.PenColor := ColorBox1.Selected;
End;

Procedure TForm1.SpinEdit1Change(Sender: TObject);
Begin
  HandWrite.penWidth := SpinEdit1.Value;
End;

Procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
  ResultList.free;
  HandWrite.free;
End;
softyes 41754 2011/8/5 13:09:00
Unit HandWriter; 这个单元怎么用啊? QQ 65508383    65508383@qq.com  谢谢
ouyang2003 38937 2009/10/31 11:16:32
laihongbo,这个单元怎么用啊?我用了怎么不能得到手写的字符啊,能给个例子吗?
goodseraph 37345 2009/4/27 17:27:55
知道咋用了,谢谢
goodseraph 37344 2009/4/27 17:20:56
laihongbo,这个单元要咋用哦
coolstar1204 37340 2009/4/27 12:31:45
为什么我注册后一运行,就报不支持此接口错误,版本问题?我的是xp pro sp3
laihongbo 37142 2009/4/9 15:25:30
准不准确不是这个单元问题,是否准确这些都是决定于微软的手写组件
nettan 37139 2009/4/9 13:02:13
laihongbo,该单元可以识别很多字,但是准确率太低了,能不能改进一下呢?
laihongbo 37137 2009/4/9 12:40:52
可以识别多字的单元类

Unit HandWriter;
{
作者:风铃夜思雨
主页:HTTP://WWW.SKYGZ.COM
日期:2009-03-07
}
Interface

Uses
  Windows, Classes, Graphics, MSINKAUTLib_TLB;

Type
  TMaxRlt = 1..20;
  TRecognizerEvents = Procedure(ASender: TObject; Const ContextList: WideString) Of Object;

  THandWriteX = Class(TComponent)
  Private
    FHandle: THandle;
    FMaxResult: TMaxRlt;
    FPenColor: TColor;
    FPenWidth: Single;
    FRecognizer: TRecognizerEvents;
    InkRecognizerContext: TInkRecognizerContext;
    InkCollector: TInkCollector;
    Procedure SetPenColor(Value: TColor);
    Function GetPenColor: TColor;
    Procedure SetPenWidth(Value: Single);
    Function GetPenWidth: Single;

    Procedure InkCollectorStroke(ASender: TObject; Const Cursor: IInkCursor;
      Const Stroke: IInkStrokeDisp; Var Cancel: WordBool);
    Procedure InkRecognizerContextRecognitionWithAlternates(ASender: TObject; Const RecognitionResult: IInkRecognitionResult;
      CustomData: OleVariant; RecognitionStatus: InkRecognitionStatus);
  Protected

  Public
    Constructor Create(AOwner: TComponent); Override;
    Destructor Destroy; Override;

    Procedure InitHandWrite(HWnd: THandle);
    Procedure ClearStroke;

  Published
    Property MaxResult: TMaxRlt Read FMaxResult Write FMaxResult;
    Property PenColor: TColor Read GetPenColor Write SetPenColor;
    Property PenWidth: Single Read GetPenWidth Write SetPenWidth;

    Property OnRecognizerContext: TRecognizerEvents Read FRecognizer Write FRecognizer;
  End;

Implementation

Uses
  OleServer;

Constructor THandWriteX.Create(AOwner: TComponent);
Begin
  Inherited Create(AOwner);
  InkCollector := TInkCollector.Create(AOwner);
  InkCollector.AutoConnect := False;
  InkCollector.ConnectKind := ckRunningOrNew;
  InkCollector.OnStroke := InkCollectorStroke;
  InkRecognizerContext := TInkRecognizerContext.Create(AOwner);
  InkRecognizerContext.AutoConnect := False;
  InkRecognizerContext.ConnectKind := ckRunningOrNew;
  InkRecognizerContext.OnRecognitionWithAlternates := InkRecognizerContextRecognitionWithAlternates;
  FMaxResult := 5;
  FPenColor := clRed;
  FPenWidth := 50;
End;

Destructor THandWriteX.Destroy;
Begin
  If Assigned(InkRecognizerContext) Then
    InkRecognizerContext.Free;
  If Assigned(InkCollector) Then
    InkCollector.Free;
  Inherited Destroy;
End;

Procedure THandWriteX.SetPenColor(Value: TColor);
Begin
  FPenColor := Value;
  If InkCollector.Enabled Then
    InkCollector.DefaultDrawingAttributes.Color := Value;
End;

Function THandWriteX.GetPenColor: TColor;
Begin
  Result := InkCollector.DefaultDrawingAttributes.Color;
End;

Procedure THandWriteX.SetPenWidth(Value: Single);
Begin
  FPenWidth := Value;
  If InkCollector.Enabled Then
    InkCollector.DefaultDrawingAttributes.Width := Value;
End;

Function THandWriteX.GetPenWidth: Single;
Begin
  Result := InkCollector.DefaultDrawingAttributes.Width;
End;

Procedure THandWriteX.InkCollectorStroke(ASender: TObject; Const Cursor: IInkCursor;
  Const Stroke: IInkStrokeDisp; Var Cancel: WordBool);
Begin
  InkRecognizerContext.StopBackgroundRecognition;
  InkRecognizerContext.Strokes.Add(Stroke);
  InkRecognizerContext.CharacterAutoCompletionMode := IRCACM_Full;
  InkRecognizerContext.BackgroundRecognizeWithAlternates(0);
End;

Procedure THandWriteX.InkRecognizerContextRecognitionWithAlternates(ASender: TObject; Const RecognitionResult: IInkRecognitionResult;
  CustomData: OleVariant; RecognitionStatus: InkRecognitionStatus);
Var
  Alts: IInkRecognitionAlternates;
  I: Integer;
  S: WideString;
Begin
  If Not RecognitionStatus = IRS_NoError Then exit;
  Alts := RecognitionResult.AlternatesFromSelection(0, -1, FMaxResult);
  For I := 0 To Alts.Count - 1 Do
    S := S + Alts.Item(I).String_ + #13#10;
  If Assigned(FRecognizer) Then
    FRecognizer(self, S);
End;

Procedure THandWriteX.InitHandWrite(HWnd: THandle);
Begin
  FHandle := HWnd;
  If Not InkCollector.Enabled Then
    InkCollector.HWnd := HWnd;
  InkCollector.Enabled := HWnd > 0;
  {If HWnd > 1 Then
  Begin
    InkCollector.HWnd := HWnd;
    InkCollector.Connect;
    InkRecognizerContext.Connect;
    InkCollector.Enabled := true;
  End Else
  Begin
    InkCollector.Enabled := False;
    InkCollector.Disconnect;
    InkRecognizerContext.Disconnect;
  End; }
  If InkCollector.Enabled Then
  Begin
    InkRecognizerContext.Strokes := InkCollector.Ink.Strokes;
    SetPenColor(FPenColor);
    SetPenWidth(FPenWidth);
  End;
End;

Procedure THandWriteX.ClearStroke;
//Var
  //I: Integer;
Begin
  If InkCollector.CollectingInk Then exit;
  InkRecognizerContext.StopBackgroundRecognition;
  InkCollector.Ink.DeleteStrokes(InkCollector.Ink.Strokes);
  {For I := 0 To InkRecognizerContext.Strokes.Count - 1 Do
  Begin
    Strokes := IInkStrokes(InkRecognizerContext.Strokes.Item(I));
    InkRecognizerContext.Strokes.RemoveStrokes(Strokes);
  End;}
  InkRecognizerContext.Strokes := Nil;
  If InkCollector.Enabled Then
    InkRecognizerContext.Strokes := InkCollector.Ink.Strokes;
  If FHandle > 0 Then
    RedrawWindow(FHandle, Nil, 0, RDW_ERASE Or RDW_INVALIDATE Or RDW_ALLCHILDREN);
End;

End.
nettan 37135 2009/4/9 12:03:19
用迅雷下载,黄山和广西的都可以呀!
nettan 37134 2009/4/9 12:02:47
用迅雷下载,黄山和关系的可以下载
beginner999 37133 2009/4/9 11:50:13
下载不了,找不到相应资源。
nettan 37132 2009/4/9 9:38:34
大家能不能帮忙看看,为什么这个东东每写一笔只能出来一个字,而微软的居然能出来五个,大家不要光下载不提意见呀!VC我又不会, Delphi 才入门。高手们帮帮忙呀!大家有什么更新之类的,发个email: nettan@163.com 给我呀,谢谢呀!
520god 37128 2009/4/8 20:45:25
谢谢了..@!!!学习学习
第一页 上一页 下一页 最后页 有 14 条纪录 共1页 1 - 14
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表