Re: WM_TOUCHメッセージについて ( No.1 ) |
- 名前:管理人 日時:2015/06/07 19:59
現在のプログラムを拝見できれば原因がわかるかもしれません
よろしければ現象が発生するプログラムをこちらの掲示板に貼り付けていただけないでしょうか?
もし長くて貼り付けられないということでしたら、メールでこちら
BQE00322(あっとまーく)nifty.com
( (あっとまーく)を@に置き換えてください )
に送っていただけないでしょうか?
|
Re: WM_TOUCHメッセージについて ( No.2 ) |
- 名前:けーー 日時:2015/06/07 21:55
ソースを複数ファイルにしていたのでまとめ、同じ挙動をすることを確認しました。
#include "DxLib.h"
#define MAXPOINTS 10
UINT cInputs;
PTOUCHINPUT pInputs;
POINT ptInput;
int index;
int idLookup[MAXPOINTS];
typedef struct{
int x,y;
int flag;
}TOUCHINFO;
TOUCHINFO TouchInfo[MAXPOINTS];
int GetContactIndex(int dwID){
for (int i=0; i < MAXPOINTS; i++){
if (idLookup[i] == -1){
idLookup[i] = dwID;
return i;
}else{
if (idLookup[i] == dwID){
return i;
}
}
}
return -1;
}
LRESULT CALLBACK WndProc(HWND WindowHandle, UINT Message, WPARAM wParam, LPARAM lParam){
switch(Message){
case WM_TOUCH:
cInputs = LOWORD(wParam);
pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (int i=0; i < static_cast<INT>(cInputs); i++){
TOUCHINPUT ti = pInputs[i];
index = GetContactIndex(ti.dwID);
if (ti.dwID != 0 && index < MAXPOINTS){
ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
ScreenToClient(GetMainWindowHandle(), &ptInput);
if (ti.dwFlags & TOUCHEVENTF_UP){
TouchInfo[index].x = -1;
TouchInfo[index].y = -1;
TouchInfo[index].flag = -1;
}else{
TouchInfo[index].x = ptInput.x;
TouchInfo[index].y = ptInput.y;
TouchInfo[index].flag = ti.dwFlags;
}
}
}
}
CloseTouchInputHandle((HTOUCHINPUT)lParam);
delete [] pInputs;
}
break;
}
}
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow){
SetGraphMode(1280,720,32);
SetHookWinProc(WndProc);
DxLib_Init();
RegisterTouchWindow(GetMainWindowHandle(),0);
SetDrawScreen(DX_SCREEN_BACK);
while(!ProcessMessage()){
ClearDrawScreen();
for(int i = 0;i < MAXPOINTS;i ++){
if((TouchInfo[i].flag & TOUCHEVENTF_DOWN) || (TouchInfo[i].flag & TOUCHEVENTF_MOVE)){
DrawCircle(TouchInfo[i].x,TouchInfo[i].y,40,GetColor(255,0,0),TRUE);
}
}
ScreenFlip();
}
DxLib_End();
UnregisterTouchWindow(GetMainWindowHandle());
return 0;
}
|
Re: WM_TOUCHメッセージについて ( No.3 ) |
- 名前:管理人 日時:2015/06/07 23:07
ソースの貼り付けありがとうございます
タッチに対応した WindowsOSのデバイスがないので実際にテストすることができないのですが、
ソースを拝見する限りで試す価値がありそうなものとして
WndProcの関数の最後の箇所に
SetUseHookWinProcReturnValue( TRUE ) ;
return 0 ;
という記述を追加してみる、というのがあります
SetHookWinProc で登録する関数が返す値は何もしないとDXライブラリは無視するので、
return の前に SetUseHookWinProcReturnValue( TRUE ) ; を実行して戻り値を使うようにすると
何か動作に変化があるかもしれません
よろしければお試しください
あと、タッチに対応した WindowsOSのデバイスをなるべく早く用意して手元でテストできる環境を整えたいと思います m(- -;m
|
Re: WM_TOUCHメッセージについて ( No.4 ) |
- 名前:けーー 日時:2015/06/08 00:32
返信ありがとうございます。またソースを書く上で改善が見られたら書き込みたいと思います。
|
Re: WM_TOUCHメッセージについて ( No.5 ) |
- 名前:管理人 日時:2015/06/09 23:36
タッチに対応した WindowsOS のデバイス( Surface Pro 3 )を手に入れたので No.2 に
載せていただいたプログラムをこちらでも試してみました
結果、少なくとも私の環境では TOUCHEVENTF_UP が問題なく発生していました
ただ、No.2 に載せていただいたプログラムでは幾つか問題があり、複数の点をタッチした際や
TOUCHEVENTF_UP が発生した後に正常に動作しなくなってしまうようになっていましたので、
それらの問題が発生しないようにしてみました
よろしければこちらのプログラムでけーーさんの環境でも正常に動作するかお試しになってみてください m(_ _)m
#include "DxLib.h"
#define MAXPOINTS 10
UINT cInputs;
PTOUCHINPUT pInputs;
POINT ptInput;
int index;
int idLookup[MAXPOINTS];
typedef struct {
int x, y;
int flag;
}TOUCHINFO;
TOUCHINFO TouchInfo[MAXPOINTS];
int GetContactIndex(int dwID) {
// 既にIDが登録されているか調べる
for (int i = 0; i < MAXPOINTS; i++) {
if (idLookup[i] == dwID) {
return i;
}
}
// IDが登録されていなかったら空いているスロットを探す
for (int i = 0; i < MAXPOINTS; i++) {
if (idLookup[i] == -1) {
idLookup[i] = dwID;
return i;
}
}
return -1;
}
LRESULT CALLBACK WndProc(HWND WindowHandle, UINT Message, WPARAM wParam, LPARAM lParam) {
switch (Message) {
case WM_TOUCH:
cInputs = LOWORD(wParam);
pInputs = new TOUCHINPUT[cInputs];
if (pInputs) {
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))) {
for (int i = 0; i < static_cast<INT>(cInputs); i++) {
TOUCHINPUT ti = pInputs[i];
index = GetContactIndex(ti.dwID);
if ( index >= 0 ) {
ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
ScreenToClient(GetMainWindowHandle(), &ptInput);
if (ti.dwFlags & TOUCHEVENTF_UP) {
// TOUCHEVENTF_UP だったらスロットを無効にする
idLookup[index] = -1;
}
else {
TouchInfo[index].x = ptInput.x;
TouchInfo[index].y = ptInput.y;
TouchInfo[index].flag = ti.dwFlags;
}
}
}
}
CloseTouchInputHandle((HTOUCHINPUT)lParam);
delete[] pInputs;
}
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
SetGraphMode(1280, 720, 32);
SetHookWinProc(WndProc);
DxLib_Init();
// すべてのスロットを無効にする
for (int i = 0; i < MAXPOINTS; i++) {
idLookup[i] = -1;
}
RegisterTouchWindow(GetMainWindowHandle(), 0);
SetDrawScreen(DX_SCREEN_BACK);
while (!ProcessMessage()) {
ClearDrawScreen();
for (int i = 0;i < MAXPOINTS;i++) {
// スロットが無効だったら何もしない
if( idLookup[i] == -1 ){
continue;
}
if ((TouchInfo[i].flag & TOUCHEVENTF_DOWN) || (TouchInfo[i].flag & TOUCHEVENTF_MOVE)) {
DrawCircle(TouchInfo[i].x, TouchInfo[i].y, 40, GetColor(255, 0, 0), TRUE);
}
}
ScreenFlip();
}
DxLib_End();
UnregisterTouchWindow(GetMainWindowHandle());
return 0;
}
|
Re: WM_TOUCHメッセージについて ( No.6 ) |
- 名前:けーー(解決) 日時:2015/07/20 17:09
返信が大変遅れてしまい申し訳ございません。
私の環境でも仰る通りのコードで動作しました。
アドバイスありがとうございました。
|
|