• ベストアンサー

ファイルパスの二回目の読み込み(API・C言語)

ウィンドウから右クリックでファイルダイアログを開き、 ファイルパスを取得、ある操作をさせて ウィンドウ上に表示させると言うプログラムを、 C言語、コンパイラはBorland C++、Windows APIにて 作成しております。 そこで、一回目、右クリックしてパスを読み込み、 表示させる事には成功したのですが、 二回目、同じようにウィンドウ上で右クリックして、 パスを読み込むと、おかしな表示となってしまいます。 二回目も一回目と同じような表示にさせるにはどうしたら いいでしょうか。 アドバイス宜しくお願い致します。 ソースはこちらです。 http://onegaisimasune.web.fc2.com/main3.txt

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

VC++2005に入れてみましたが、エラー多発で後で修正してみます。 初期化していない変数も沢山あるみたいですので、bccのエラーオプションを変更してチェックできませんか? それと、あちこちのInvalidateRgn( hWnd, NULL, TRUE)が意味無いどころかWM_PAINTの無限ループになっています。これも修正してください。WM_PAINT中に書いてはいけません。

noname#142813
質問者

お礼

ファイルパスはうまく変わりながら表示されます。 その他の部分がうまくいきません。 長方形が増えていってしまいます。

noname#142813
質問者

補足

回答ありがとうございます。 WM_PAINTの中のInvaliddateRgnは消しました。

その他の回答 (1)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

どうもです、ざっと拝見しましたが、 WM_RBUTTONUP内でウィンドウへの描画処理がありません。 SetWindowTestをしているのでタイトルは変更されますが。。。 http://oshiete.nikkeibp.co.jp/qa3378721.htmlで 私が書いたコードを見ていただければ分るかと思います。 向こうの最後にも書いていますが、WM_PAINTを処理しているため 無効領域を発生させるだけでもOKです。 また、随所に InvalidateRgn( hWnd, NULL, TRUE)が 呼び出されていますが、あまり意味がありません。 基本的には画面の情報を更新したい時に1度呼び出せばOKです。 #今回なら WM_RBUTTONUP を処理した後 return する前とか。 #余談ですがいまのコードは恐らく実行できません。。。 #WndProc関数 619行あたりが。。。

noname#142813
質問者

お礼

このように修正しました。 右クリックでウィンドウが閉じてしまうようになってしまいました。。 memset( FullPath, '\0', sizeof(FullPath)); hdc = GetDC( hWnd ); if ( GetOpenFilePath( FullPath, sizeof(FullPath) )){/* GetOpenFileName(&ofn) */ InvalidateRgn(hWnd, NULL, TRUE); if ((fp = fopen(FullPath, "r")) == NULL) { /* 読み込むファイル名 */ exit(2);/* シェルへ戻る */ } /* 英単語がf見つかったら予約語かどうか調べる */ while (GetWord(fp, word)) { BSearch(word); } }else{ MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK ); break; } InvalidateRgn(hWnd, NULL, TRUE); SetWindowText( hWnd, FullPath ); fclose(fp); ReleaseDC( hWnd, hdc ); return 0; break;

noname#142813
質問者

補足

回答ありがとうございます。 ご指摘のコードを拝見させていただきましたが、 GetOpenFilePathは私のコンパイラでは使えませんでした。 GetOpneFileNameで試そうとした所、やはり無理でした。 アドバイスどうかお願いします。

関連するQ&A

専門家に質問してみよう