マウス位置数値を取得、変数を得るには?


はんにゃ  URL  2011-01-27 16:54:28  No: 72267

環境WindowsXp,VC6.0 C言語ソース(既存のものを利用中 元はSGI/WSで動作)
右ボタンメニュの
  if (qtest() || !attached)
  { 
    switch (qread(&value))
    {
      case MENUBUTTON:  
        if (value == 1)  menval=dopup(mainmenu);  /* right mouse button is pressed */
          switch (menval)
          {
            case 1:
              movzoom();
              break;

で選択した  次のサブルーチンでプログラムが”応答なし”になります。

void movzoom(void){
  static  int dx, dy, odx, ody, tdx,tdy,otdx,otdy;
  odx= getvaluator(MOUSEX); ody= getvaluator(MOUSEY);
printf("2011 getvaluator(MOUSEX) (MOUSEY) odx==%d ody=%d\n",odx,ody);/*このPrint表示でここまでは動作することを確認*/

  while(TRUE){ 
  while( qtest() || !attached ){ 
    devd= qread(&value); 
     if( devd==INPUTCHANGE) attached=value;         
    else if( devd==MENUBUTTON && value==0 ){ qreset(); return; }
    } /*  end while(qtest)  */
   /* w_axis();set graph axis onto w_view(), x1right, y1lower, x2left, y2upper*/
   dx=getvaluator(MOUSEX); tdx=tdx+(dx-odx); odx=dx; 
以下マウス位置数値を取得、変数を得る
}
上の   while(TRUE){  以下に問題があるようですが、どのようにしたら  
マウス値をえることができるでしょうか?


仲澤@失業者  2011-01-27 20:58:52  No: 72268

while(TRUE){ 
の行にブレークポイントを設定して、デバッグ実行を開始して
当該機能を実行してみてください。ブレークポイントで、
停止したらステップ実行して、各変数の内容をウォッチに
登録して何が起こっているか見てみましょう。
いちいちprintf()等でチェックライトを入れる必要はないはずですね。


はんにゃ  URL  2011-01-28 04:09:17  No: 72269

ありがとうございます
多分
while( qtest() || !attached ){ }
の中で問題があるのでしょう。
助言の
”の行にブレークポイントを設定して、”
は  VC6では  メニューでBPの挿入で  赤丸点が出て  確認できました
"デバッグ実行を開始して"
はビルドの中で  選択しました。
すると  実行されます。
”当該機能を実行してみてください。ブレークポイントで、
停止したらステップ実行して、”
は  土このメニューにあるのでしょうか?
ステップインが灰色文字です

”各変数の内容をウォッチに
登録して何が起こっているか見てみましょう。”
は  表示のデバッグウインドウでしょうか  これも灰色です。  

”いちいちprintf()等でチェックライトを入れる”
はい、debugの方法を知らないもので  この方法を使っていました。


はんにゃ  URL  2011-01-30 00:05:36  No: 72270

このソースはSGI/WSでのsgl.libを使用したときのもので  現在Windows機で  glut.h や  glut32.dllを使用しています。
while( qtest() || !attached ){ /* checks the contents of the event*/
  devd= qread(&value); 
 if( devd==INPUTCHANGE) attached=value;  *reads the first entry in the event queue*/     
  else if( devd==MENUBUTTON && value==0 ){ qreset(); return; }
    } /*  end while(qtest)  */
}
内の各関数との関係が定かではないのですが、

linkしている他のソースには下の記述があります。

int qread(int *value)
{
  *value = 0;

  if (qin != qout)
  {
    int type = events[qout][0];
    *value = events[qout++][1];

    if (qout >= QSIZE) qout = 0;

    return type;
  }
  
  return 0;
}

多分  sglとの整合を取っていると思われます。
ここで  sglとは独立に
同様な  推測するに  カーソルがWindowから離れずに、Key/Maouse等が押されて、変化したら  Whileを抜けて、Menu右ボタンがおされたら、この関数を抜けるReturn;するとしている  こともよくわからないが  そのような
典型的な関数はありませんか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加