szhcracker老大,在回答(100)

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

likingzhe

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,期待
 
希望这次能搞定了。。。。坐标,被你打败了。。。。
 
好了,我大致的翻译了一下,你再试试。注意:把代码复制后另存为.dpr文件即可编译运行,不要别的什么窗体之类的东东了,再次祝您好运!program MultiTouSDK;uses Windows, Messages, SysUtils;type MTouchPoint = packed record x1: Integer; y1: Integer; x2: Integer; y2: Integer; end;type _TouchData = record dwTouchCount: DWORD; x1: DWORD; y1: DWORD; x2: DWORD; y2: DWORD; end; PointData = array[0..1] of _TouchData;const AppName = 'MultiTouSDK';var AppWnd: HWND; Msg: TMsg; WndClass: TWndClass; gBrBackground: HBRUSH; gCount: Integer = 0; gP1, gP2: MTouchPoint; 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';function MultTouchCallBack(const pd: PointData; Cnt: Integer): Integer; stdcall; // 用 stdcall 定义回调函数var Rect: TRect; Scx, Scy: Integer;begin Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rect.Left := 0; Rect.Top := 0; Rect.Right := Scx; Rect.Bottom := Scy; // 注:每个点都有两对坐标,即左上角和右下角坐标 if Cnt > 0 then // Cnt表示触摸的点数,1表示单点点触摸 begin gP1.x1 := pd[0].x1; // 单点触摸时该点的左上角x轴坐标 gP1.x2 := pd[0].x2; // 单点触摸时该点的右下角x轴坐标 gP1.y1 := pd[0].y1; // 单点触摸时该点的左上角y轴坐标 gP1.y2 := pd[0].y2; // 单点触摸时该点的右下角y轴坐标 if Cnt > 1 then begin gP2.x1 := pd[1].x1; // 两点触摸时第二点的左上角x轴坐标 gP2.x2 := pd[1].x2; // 两点触摸时第二点的右下角x轴坐标 gP2.y1 := pd[1].y1; // 两点触摸时第二点的左上角y轴坐标 gP2.y2 := pd[1].y2; // 两点触摸时第二点的右下角y轴坐标 end; end; gCount := Cnt; InvalidateRect(AppWnd, @Rect, False); UpdateWindow(AppWnd); end;function WndProc(Wnd: HWND; Msg, wParam: Word; lParam: LongInt): LongInt; stdcall;var Rect: TRect; Scx, Scy: Integer; DC: HDC; Ps: TPaintStruct; hBrushY, hBrushOld: HBRUSH;begin case Msg of WM_DESTROY: begin StopComDevice(); // 触摸屏停止 PostQuitMessage(0); end; WM_KEYUP: if wParam = VK_ESCAPE then // 按下 ESC 键 PostQuitMessage(0); WM_COMMAND: if LOWORD(wParam) = WM_CLOSE then DestroyWindow(Wnd); WM_PAINT: begin DC := BeginPaint(Wnd, Ps); Scx := GetSystemMetrics(SM_CXSCREEN); Scy := GetSystemMetrics(SM_CYSCREEN); Rect.Left := 0; Rect.Top := 0; Rect.Right := Scx; Rect.Bottom := Scy; FillRect(DC, Rect, gBrBackground); SetTextColor(DC, RGB(255, 128, 64)); SetBkMode(DC, TRANSPARENT); TextOut(DC, Round(Rect.Right / 2 - 100), 20, 'Please press ESC key to cancel.', 31); hBrushY := CreateSolidBrush(RGB(255, 128, 64)); hBrushOld := HBRUSH(SelectObject(DC, hBrushY)); if gCount > 0 then begin Rect.Left := Round(gP1.x1 * Scx / 4096); Rect.Right := Round(gP1.x2 * Scx / 4096); Rect.Top := Round(gP1.y1 * Scy / 4096); Rect.Bottom := Round(gP1.y2 * Scy / 4096); Ellipse(DC, Rect.Left - 5, Rect.Top - 5, Rect.Right, Rect.Bottom); if gCount > 1 then begin Rect.Left := Round(gP2.x1 * Scx / 4096); Rect.Right := Round(gP2.x2 * Scx / 4096); Rect.Top := Round(gP2.y1 * Scy / 4096); Rect.Bottom := Round(gP2.y2 * Scy / 4096); Ellipse(DC, Rect.Left - 5, Rect.Top - 5, Rect.Right, Rect.Bottom); end; DeleteObject(hBrushY); DeleteObject(hBrushOld); end; EndPaint(Wnd, Ps); end; end; WndProc := DefWindowProc(Wnd, Msg, wParam, lParam);end; begin if FindWindow(AppName, nil) <> 0 then Halt; FillChar(WndClass, SizeOf(WndClass), 0); with WndClass do begin style := CS_HREDRAW or CS_VREDRAW; lpfnWndProc := @WndProc; // 取回调函数 WndProc 的地址 hInstance := SysInit.HInstance; // 实例句柄 hIcon := LoadIcon(hInstance, 'MAINICON'); hCursor := LoadCursor(hInstance, IDC_ARROW); lpszClassName := AppName; // 窗口类名 end; RegisterClass(WndClass); // 注册窗口类 gBrBackground := CreateSolidBrush(RGB(0, 128, 255)); AppWnd := CreateWindow(AppName, nil, WS_POPUP or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0, 0, HInstance, nil); if AppWnd > 0 then begin ShowWindow(AppWnd, SW_NORMAL); UpdateWindow(AppWnd); RegistCallback(@MultTouchCallBack); // 注册回调函数 StartComDevice(0, True); // 启动 COM 口的触摸屏 end; while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end;end.
 
szhcracker老大。。。 您也太高看我的智商了吧。。。咱能不能简单点,让我看明白。。。 注意:把代码复制后另存为.dpr文件即可编译运行,不要别的什么窗体之类的东东了 这个是什么意思,没有窗口的unit嘛?搞不懂。。。 还有没有窗口的话,我上那里用类似label之类的东西,看2点的坐标呢?,,, 怎么得到它们?
 
?奇怪,我刚才发的话怎么都没了?
 
我把它们放在写字板里了,然后给了后缀名,可以运行。 现在有2个问题:1这种无窗体的程序,我怎么得到那2个坐标点,用label之类的显示或者把它们传递出来,类似和它相关的form界面里。。2运行程序后,鼠标图样变成了漏斗。。。可不可以保持鼠标原样或者不显示。呵呵,szhcracker 老大,你太有才了,我佩服你。。。
 
我不太会用这种无窗体的程序,它怎么和我有窗体的程序进行互动呢,或者把它改成有窗体的?
 
现在点击后结果如何?是否报错?我想知道的是程序能否正常运行。
 
能运行,接了触摸屏,2个点也能出来。目前看,和c给的例子程序是差不多的。就是鼠标变成漏斗了。我还在调试。
 
把那句 hCursor := LoadCursor(hInstance, IDC_ARROW);改为 hCursor := LoadCursor(0, IDC_ARROW);试试。
 
恩,变成箭头了,呵呵。老大你太厉害了!那个,怎们提取坐标点呢或者传递给其他窗口文件?没有这2个坐标,我无法进行其他的判断。或者把这个改成窗口似的?还有这是为什么呢?等弄好了,一定请老大吃烤鸭,拜老大为师,学习学习
 
也就是可以了,对吗?你要提取坐标点就提呗,都已经取到了还怕得不到?要把这个程序改成窗口式的(我估计你比较适应那种拖拖控件的窗口式编程吧,我也是)不是不可以,但是可能会有其他的问题(估计问题也不大),你自己可以试试,或者你把其他的处理加上即可不用修改成窗口式的了,提醒你一下:要加什么如label之类的东东要用代码自己画,不能像VCl中那样拖拖拉拉就可以的。还有,我的水平也一般,不是老大。
 
现在就是坐标了,也不用提个其他form,弄个ini文件,也就是了。我下午研究下!要是搞不定,szhcracker老大你要帮忙呦。呵呵,就是提坐标。其他的我想都是小问题了,可以不考虑了。
 
szhcracker 老大: 我弄个ini,我想把gp1.x1,gp.x2...它们写进去ini里,可是编译后,程序就自己释放自己了。。。。
 
szhcracker老大, 我搞不定啊,还是释放自己。怎么提取它们的坐标。。。老大,在帮一次忙。只要把坐标点提取出来就好了
 
老大,帮我想想办法,弄出这2个点的坐标。。。。鸭子还等我们呢
 
szhcracker老大: 在这成个程序里,我能得到坐标点。可是怎么把它们传递出来,把坐标1的x,y和坐标2的x,y传递给ini文件。或者其他窗口,至少让我能使用这个值。。。。
 
接受答案了.
 
后退
顶部