2013-02-04 9 views
10

私は本質的に描画キャンバスであるカスタムコントロールと、それを使ってファイルを編集するプログラムを持っています。しかし、新しいファイルを開くと、非常に奇妙なことが起きる可能性があります。[ファイルを開く]ダイアログのダブルクリックがその下のフォームにクリックを登録しないようにするにはどうすればよいですか?

代わりに、項目を選択し、ENTERを打つのファイルを開くダイアログ(標準TOpenDialogコントロール)内のファイル上でユーザーがダブルクリックすると、キャンバスが下にクリックイベントを登録しての位置でドローアクションを実行して終了ロード直後のカーソルが完了します。

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

これをやり直す方法はありますか?代わりに 'ENTER'キーで開かれていた可能性があるため、コードを「読み込んだ後、ただ次のクリックを食べる」と言うことはできません。誰もがこれを処理するためのより良い方法を考えることができますか? (Windows 7を使用して違いがある場合)

+0

私はあなたは、両方のダイアログ、XPのいずれか、Vistaのいずれかのソリューションがほしいと思います。 –

+1

重複するコードサンプルがありますか?空のプロジェクトにフォームのクリックを登録しません。 –

+0

Windows 7上で一貫して表示されています(別のOSで異なるかもしれません) –

答えて

7

「2回目のクリックメッセージ」がある場合は、何か問題があります。 (1つは、Windowsは「クリック」メッセージを表示せず、マウスアップメッセージとマウスダウンメッセージだけです)A double click goes like this:マウスを下に、マウスを上に、ダブルクリックしてマウスを上に移動します。ダブルクリックメッセージと2回目のマウスアップメッセージの間にダイアログが消えます。あなたのコントロールがマウスアップメッセージを受信し、完全なクリックとして扱う場合、それは問題を説明し、あなたは停止する必要があります。クリックは常にペアのマウスダウンメッセージとマウスアップメッセージです。両方を取得していない場合は、クリックではありません。

+0

コントロールが実際にクリックの代わりにマウスアップを捕まえているかのように見えます(*後者ではなく前者を捉える)。 –

+0

完璧!はい、私はダウンイベントの火災のメソッドでフラグを使用して解決しました。 ダウンイベントは、ピクチャが本当にclicckedされている場合にのみ起動されます: ます。private void pictureBox1_MouseD(オブジェクト送信者、MouseEventArgs e)の { picturebox_sel_clicked =はtrue。 Console.WriteLine( "D"); } – elle0087

1

実際には、イベントハンドラの呼び出しにつながる2番目のマウスアップイベントが画像ボックスで発生しました。これはOpenFileDialogのバグです。マウスアップイベントのIsMouseCapturedのチェックを追加する必要があります。ワンクリックでマウスが上に移動するのではなく、マウスが上に移動します。

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(); 

をそして、あなたは私が私の上司の顔に笑顔を入れていることを信じることができます:)

関連する問題