12

基本的に描画キャンバスであるカスタム コントロールと、それを使用してファイルを編集するプログラムがあります。ただし、新しいファイルを開くと、非常に奇妙なことが起こる場合があります。

TOpenDialogユーザーがアイテムを選択して を押す代わりに、[ファイルを開く] ダイアログ (標準コントロール) でファイルをダブルクリックするとENTER、その下のキャンバスはクリック イベントを登録し、読み込み直後のカーソルの位置で描画アクションを実行します。完了。

明らかに、これは意図された動作ではありません。マウスをダブルクリックすると、ダブルクリック メッセージが 2 回目のクリック メッセージの前に到着することに以前気付きました。ダイアログボックスがダブルクリックで閉じている可能性があると思います.2番目のクリックメッセージが到着し、適切な座標にあるものに送信されます.

これを止める方法はありますか?コードに「読み込み後、次のクリックを食べるだけ」と伝えることはできません。代わりに「ENTER」キーで開いた可能性があり、最初の正当なクリックを見逃す可能性があるためです。これを処理するためのより良い方法を考えられる人はいますか? (違いが生じる場合に備えて、Windows 7を使用しています。)

4

4 に答える 4

7

「2 回目のクリック メッセージ」が表示される場合は、何か問題があります。(1 つには、Windows には「クリック」メッセージがなく、マウスアップとマウスダウンのメッセージだけです。)ダブルクリックは次のようになります: マウスダウン、マウスアップ、ダブルクリック、マウスアップ。ダイアログは、ダブルクリック メッセージと 2 番目のマウスアップ メッセージの間で消えます。コントロールがマウスアップ メッセージを受信し、それをフル クリックとして処理する場合は、それで問題が説明され、停止する必要があります。クリックは常に、マウスダウンとマウスアップのメッセージのペアです。両方を取得していない場合、それはクリックではありません。

于 2013-02-04T04:51:05.843 に答える
1

実際には、2 番目のマウスアップ イベントが画像ボックスで発生し、イベント ハンドラーが呼び出されます。これは OpenFileDialog のバグのようです。マウス アップ イベントの IsMouseCaptured のチェックを追加する必要があります。1 回のクリックは、マウス アップだけではなく、マウス ダウンとマウス アップです。

于 2013-05-24T09:10:19.637 に答える
1

私はそのように解決しました(もちろん回避策です):

    CFileDialog my_file_dialog(...);
    if ( my_file_dialog.DoModal()!=IDOK )
        return;

    CString fileName= my_file_dialog.GetPathName();

    //...

    CSelectItemsDlg dlg;


    // Avoid that the double-click on the CFileDialog sends the WM_LBUTTONUP message to the next window causing the Unselect of an item that is under the mouse cursor.
    // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10287063.html#a2476475
    MSG msg;
    while(PeekMessage(&msg,0,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE));

    int DoModalRes = dlg.DoModal();

そして、私が上司の顔に満面の笑みを浮かべたと信じてください:)

于 2013-11-13T10:32:57.673 に答える