请szhcracker 老大回答(200)

  • 主题发起人 主题发起人 likingzhe
  • 开始时间 开始时间
L

likingzhe

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,专用贴。
 
来接分了,你那个dll的调用应该搞定了吧?
 
晕死,您速度真快。我正和人说话的功夫。。。。
 
好了,呵呵,我正操作呢。我正要给你发联系方式呢,就回头和别人说了会话,您就找到我的新地址了,呵呵。memo的那个您看到了吧,不是我不结,您之前的回答也是常规的回答,这个我承认,可是并不是我想到的,而且我无法结。。。我可不是故意的。。要是您一定要,等这个弄好,我可以给您,如果您有时间的话,帮我讲讲这个是怎么回事,就算memo的答案吧。那个memo的我最后找了个其他方法,凑合过去了。但不是我心目中的最佳
 
dll那个,还没有。我都断电跟踪的,不管是time,还是什么paint那个,设置了断点,程序就没有运行到那里。。。基础我还是知道些的。。。可是就没有运行到那里,我郁闷。别的可以说没有,可time,5毫秒自动触发的,也是无运行。老大你行行好了,在帮我把坐标显示搞定吧,这个就是真大功告成了。。。。
 
我看了一下,你试试下面的步骤:1、去掉定时器或定时器的代码;2、在程序的OnShow事件里写上 RegistCallback(@MultTouchCallBack); // 注册回调函数 StartComDevice(0, True); // 启动 COM 口的触摸屏3、我笔记里的代码中有2个全局变量gP1, gP2: PointData;而在函数MultTouchCallBack中会把坐标值放到gP1、gP2的成员里,那个就是你要的结果了(可能需要转换)。4、参考如下代码:// 根据 .cpp 的源码, 以下代码应该写在 WM_PAINT 消息中// 此处作为示例, 实际使用时可自行修改, 或许不必如此麻烦procedure TForm1.FormPaint(Sender: TObject); var Rct: TRect; Scx, Scy: Integer; vDC: HDC; Ps: TPaintStruct;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rct.Left := 0; Rct.Top := 0; Rct.Right := Scx; Rct.Bottom := Scy; if gCount = 1 then begin Rct.Left := Round(gP1.x1 * Scx / 4096); Rct.Right := Round(gP1.x2 * Scx / 4096); Rct.Top := Round(gP1.y1 * Scy / 4096); Rct.Bottom := Round(gP1.y2 * Scy / 4096); end; if gCount = 2 then begin Rct.Left := Round(gP2.x1 * Scx / 4096); Rct.Right := Round(gP2.x2 * Scx / 4096); Rct.Top := Round(gP2.y1 * Scy / 4096); Rct.Bottom := Round(gP2.y2 * Scy / 4096); end; vDC := BeginPaint(Self.Handle, Ps); Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom);end;关键是你要跟踪看看gP1、gP2里是不是有坐标值,如果有的话就说明程序是正确的,你要上电测试,如果可以,那么你把上面的代码再写到 WM_PAINT 消息中看看效果
 
好的,我去看看,有什么问题,第一时间反馈
 
我改了一下pas,你再看看:unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, StrUtils, StdCtrls;type TForm1 = class(TForm) btnTest: TButton; procedure FormShow(Sender: TObject); procedure btnTestClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormPaint(Sender: TObject); private public end;type _TouchData = record dwTouchCount: DWORD; x1: DWORD; y1: DWORD; x2: DWORD; y2: DWORD; end; PointData = ^_TouchData;var Form1: TForm1; gPointx: Integer = 0; gPointy: Integer = 0; gCount: Integer = 0; gP1, gP2: PointData; function StartComDevice(nport: Integer; bTransform: Boolean): Integer; cdecl; external 'MultiTouchSDK.dll'; function RegistCallback(hMultTouchCallBack: PChar): Integer; cdecl; external 'MultiTouchSDK.dll'; function StopComDevice(): Integer; cdecl; external 'MultiTouchSDK.dll';implementation{$R *.dfm}function MultTouchCallBack(const pd: PointData; Cnt: Integer): Integer; stdcall;var Rct: TRect; Scx, Scy: Integer;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rct.Left := 0; Rct.Top := 0; Rct.Right := Scx; Rct.Bottom := Scy; // 注:每个点都有两对坐标,即左上角和右下角坐标 if Cnt = 1 then // Cnt表示触摸的点数,1表示单点点触摸 begin gP1.x1 := pd.x1; // 单点触摸时该点的左上角x轴坐标 gP1.x2 := pd.x2; // 单点触摸时该点的右下角x轴坐标 gP1.y1 := pd.y1; // 单点触摸时该点的左上角y轴坐标 gP1.y2 := pd.y2; // 单点触摸时该点的右下角y轴坐标 end; if Cnt = 2 then begin gP1.x1 := pd.x1; // 两点触摸时第一点的左上角x轴坐标 gP1.x2 := pd.x2; // 两点触摸时第一点的右下角x轴坐标 gP1.y1 := pd.y1; // 两点触摸时第一点的左上角y轴坐标 gP1.y2 := pd.y2; // 两点触摸时第一点的右下角y轴坐标 gP2.x1 := pd.x1; // 两点触摸时第二点的左上角x轴坐标 gP2.x2 := pd.x2; // 两点触摸时第二点的右下角x轴坐标 gP2.y1 := pd.y1; // 两点触摸时第二点的左上角y轴坐标 gP2.y2 := pd.y2; // 两点触摸时第二点的右下角y轴坐标 end; gCount := Cnt;end;procedure FormShow(Sender: TObject);begin RegistCallback(@MultTouchCallBack); // 注册回调函数 StartComDevice(0, True); // 启动 COM 口的触摸屏end;procedure TForm1.btnTestClick(Sender: TObject); // 测试结果begin ShowMessageFmt('单点触摸时该点的左上角x轴坐标为:%d', [gP1.x1]);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin StopComDevice; // 触摸屏停止end;// 根据 .cpp 的源码, 以下代码应该写在 WM_PAINT 消息中procedure TForm1.FormPaint(Sender: TObject); var Rct: TRect; Scx, Scy: Integer; vDC: HDC; Ps: TPaintStruct;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rct.Left := 0; Rct.Top := 0; Rct.Right := Scx; Rct.Bottom := Scy; if gCount = 1 then begin Rct.Left := Round(gP1.x1 * Scx / 4096); Rct.Right := Round(gP1.x2 * Scx / 4096); Rct.Top := Round(gP1.y1 * Scy / 4096); Rct.Bottom := Round(gP1.y2 * Scy / 4096); end; if gCount = 2 then begin Rct.Left := Round(gP2.x1 * Scx / 4096); Rct.Right := Round(gP2.x2 * Scx / 4096); Rct.Top := Round(gP2.y1 * Scy / 4096); Rct.Bottom := Round(gP2.y2 * Scy / 4096); end; vDC := BeginPaint(Self.Handle, Ps); Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom);end;end.
 
好,我看看,呵呵,正要向您回报刚才那个问题呢。哈哈,您的速度比我快
 
szhcracker老大,这个是什么意思?procedure TForm1.btnTestClick(Sender: TObject); // 测试结果begin ShowMessageFmt('单点触摸时该点的左上角x轴坐标为:%d', [gP1.x1]);end;告诉我坐标的位置嘛?可是‘ShowMessageFmt’是什么,系统不认啊?我换成其他的,系统报错。我刚才用lab1.caption:=intostr(gp1.x1),这个到时可以打上,可是点了,程序就报错了。我觉得应该是这个意思了。只要取得gp1,x1它们那4个,应该就是我要的坐标点了。而且,2个点的坐标,应该是能时时显示的。
 
跟踪断点程序,好像并没有执行这个地方,跳过去了if gCount = 1 then begin Rct.Left := Round(gP1.x1 * Scx / 4096); Rct.Right := Round(gP1.x2 * Scx / 4096); Rct.Top := Round(gP1.y1 * Scy / 4096); Rct.Bottom := Round(gP1.y2 * Scy / 4096); end; if gCount = 2 then begin Rct.Left := Round(gP2.x1 * Scx / 4096); Rct.Right := Round(gP2.x2 * Scx / 4096); Rct.Top := Round(gP2.y1 * Scy / 4096); Rct.Bottom := Round(gP2.y2 * Scy / 4096); end;
 
加上 Dialogs 单元的引用即可你这个结果说明函数的调用是正确的,程序报什么错?
 
那说明 gCount 不等于 1 或 2,你看看等于什么,它的那个cpp源码上写得好像是 > 0和 > 1,你自己看看改改吧。
 
按照上面那个,点了按钮的报错是:access violation at adress 004522D0 in module 'MultiTouSDK.exe'.Read of address00000004.
 
c的是:if (gCount > 0) { rect.left = gp1.x1 * scx / 4096; rect.right = gp1.x2 * scx / 4096; rect.top = gp1.y1 * scy / 4096; rect.bottom = gp1.y2 * scy / 4096; Ellipse(hdc,rect.left-5,rect.top-5,rect.right,rect.bottom); if (gCount > 1) { rect.left = gp2.x1 * scx / 4096; rect.right = gp2.x2 * scx / 4096; rect.top = gp2.y1 * scy / 4096; rect.bottom = gp2.y2 * scy / 4096; Ellipse(hdc,rect.left-5,rect.top-5,rect.right,rect.bottom); } DeleteObject(hBrushY); DeleteObject(hBrushOld); }
 
改成这样了:if gCount > 0 then begin Rct.Left := Round(gP1.x1 * Scx / 4096); Rct.Right := Round(gP1.x2 * Scx / 4096); Rct.Top := Round(gP1.y1 * Scy / 4096); Rct.Bottom := Round(gP1.y2 * Scy / 4096); // Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom); // // if gCount > 1 then begin Rct.Left := Round(gP2.x1 * Scx / 4096); Rct.Right := Round(gP2.x2 * Scx / 4096); Rct.Top := Round(gP2.y1 * Scy / 4096); Rct.Bottom := Round(gP2.y2 * Scy / 4096); Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom); end; end;还是不执行。。
 
unit Main;interfaceuses Windows, Messages, SysUtils, Dialogs, Classes, Controls, Forms, StrUtils, StdCtrls;type TForm1 = class(TForm) btnTest: TButton; procedure btnTestClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); private public end;type _TouchData = record dwTouchCount: DWORD; x1: DWORD; y1: DWORD; x2: DWORD; y2: DWORD; end; PointData = ^_TouchData;var Form1: TForm1; gPointx: Integer = 0; gPointy: Integer = 0; gCount: Integer = 0; gP1, gP2: PointData; function StartComDevice(nport: Integer; bTransform: Boolean): Integer; stdcall; external 'MultiTouchSDK.dll'; function RegistCallback(hMultTouchCallBack: PChar): Integer; stdcall; external 'MultiTouchSDK.dll'; function StopComDevice(): Integer; stdcall; external 'MultiTouchSDK.dll';implementation{$R *.dfm}function MultTouchCallBack(const pd: PointData; Cnt: Integer): Integer; stdcall;var Rct: TRect; Scx, Scy: Integer;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rct.Left := 0; Rct.Top := 0; Rct.Right := Scx; Rct.Bottom := Scy; // 注:每个点都有两对坐标,即左上角和右下角坐标 if Cnt > 0 then // Cnt表示触摸的点数,1表示单点点触摸 begin gP1.x1 := pd.x1; // 单点触摸时该点的左上角x轴坐标 gP1.x2 := pd.x2; // 单点触摸时该点的右下角x轴坐标 gP1.y1 := pd.y1; // 单点触摸时该点的左上角y轴坐标 gP1.y2 := pd.y2; // 单点触摸时该点的右下角y轴坐标 if Cnt > 1 then begin gP2.x1 := pd.x1; // 两点触摸时第二点的左上角x轴坐标 gP2.x2 := pd.x2; // 两点触摸时第二点的右下角x轴坐标 gP2.y1 := pd.y1; // 两点触摸时第二点的左上角y轴坐标 gP2.y2 := pd.y2; // 两点触摸时第二点的右下角y轴坐标 end; end; gCount := Cnt; InvalidateRect(Form1.Handle, @Rect, False); // 或者用 Application.Handle UpdateWindow(Form1.Handle); // 或者用 Application.Handleend;procedure TForm1.FormShow(Sender: TObject);begin RegistCallback(@MultTouchCallBack); // 注册回调函数 StartComDevice(0, True); // 启动 COM 口的触摸屏end;procedure TForm1.btnTestClick(Sender: TObject);begin ShowMessageFmt('单点触摸时该点的左上角x轴坐标为:%d', [gP1.x1]);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin StopComDevice; // 触摸屏停止end;// 根据 .cpp 的源码, 以下代码应该写在 WM_PAINT 消息中// 此处作为示例, 实际使用时可自行修改, 或许不必如此麻烦procedure TForm1.FormPaint(Sender: TObject); var Rct: TRect; Scx, Scy: Integer; vDC: HDC; Ps: TPaintStruct;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rct.Left := 0; Rct.Top := 0; Rct.Right := Scx; Rct.Bottom := Scy; vDC := BeginPaint(Self.Handle, Ps); if gCount > 0 then begin Rct.Left := Round(gP1.x1 * Scx / 4096); Rct.Right := Round(gP1.x2 * Scx / 4096); Rct.Top := Round(gP1.y1 * Scy / 4096); Rct.Bottom := Round(gP1.y2 * Scy / 4096); Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom); if gCount > 1 then begin Rct.Left := Round(gP2.x1 * Scx / 4096); Rct.Right := Round(gP2.x2 * Scx / 4096); Rct.Top := Round(gP2.y1 * Scy / 4096); Rct.Bottom := Round(gP2.y2 * Scy / 4096); Ellipse(vDC, Rct.Left - 5, Rct.Top - 5, Rct.Right, Rct.Bottom); end; end; EndPaint(Self.Handle, Ps);end;end.
 
呵呵,老大就是老大,那个叫速度。呵呵,老大,中午了,先去吃饭吧。我这就调试,呵呵。老大辛苦了
 
呵呵,上来就报错了,无法运行.access violation at adress 00000000..Read of address00000000.
 
哦 忘了改为 cdecl 方式了,你先调试吧,如果还不行就照那个cpp改为Delphi的总该可以了吧?
 
后退
顶部