2009-05-28 6 views
0

何らかの理由で、ユーザーが実際にXボタンをクリックしたときを検出する必要があります。私はこれまで持っていることはこれです:ウィンドウ内の "X"ボタンの座標はどのように取得できますか?

protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN 
     { 
      Point p = new Point((int)m.LParam); 
      p = this.PointToClient(p); 
      if (p.X > 680) 
      { 
       //do what I need to do... 
      } 
     } 

     base.WndProc(ref m); 
    } 

基本的に、私は、ウィンドウの非クライアント領域上でのマウスクリックで「WM_NCLBUTTONDOWN」メッセージを探してください。次に、LParamからX座標とY座標を取得し、最後にそれをScreen Coordinatesに変換します。この時点で、私はユーザーが非クライアント領域をクリックしたことを知り、フォーム上のどこにいるのか知っています。

私の質問は、これらの座標がXボタンに表示されているかどうかを確認する方法です。現時点では、私は680をハードコーディングしています(これはかなり大きいわけではありません)が、現在のウィンドウサイズで動作するためですが、問題はXPよりも大きなXボタンを持つWindows 7を使用していることです。オプション。さらに、私はY座標をコーディングしていないので、誰かがウィンドウの右端をクリックすると、そのコードもトリガーされます。だから誰にでもアイデアはありますか?

+3

ボタンのクリックが重要か、ユーザーがアプリケーションを終了しているかどうかを実際に確認しようとしていますか? –

+1

「xボタン」を他の閉じる/終了メッセージとは異なる方法で処理したいのはなぜですか? – Tim

+0

それは奇妙な状況ですが、私は認めますが、基本的にはダイアログであり、終了時に検証をトリガーしたいのですが、標準のFormValidatingイベントはDialogであるためプロパティを使用できません(別の投稿、私はそれがバグだと思う)。 FormClosingイベントで手動でValidationを処理していますが、ユーザーがXをクリックしたかどうかを知る必要があります。その場合、検証をスキップします。意味がありますか? – BFree

答えて

3

OKボタンとキャンセルボタンがあるとします。これらのボタンの1つがクリックされたときに値を設定するだけです。フォームのClosingイベントで、この値が設定されていない場合、Xボタンがクリックされたことがわかります。フォームを閉じるの他の方法がある場合を除き、私は...を認識していないよ

編集:

は、代わりにグローバルなブールを使用しての、あなたはボタンのクリックでフォームのDialogResultプロパティを変更することができます。あなたがXボタンをクリックしたときにDialogResultの値が何であるか分かりません。試してみる必要があります。

+0

あなたの投稿をもう一度読んだだけで、今あなたが言っていることが分かります。私は実際にバリデーションを引き起こすボタンのためにブーリアンを保つ必要はない。他の解決法がない場合、私はこれに頼る必要があります。今のところ私はこの質問を開いたままにしておきます。誰も解決策を提供できない場合は、これを受け入れたものとしてマークします。ありがとう! +1 – BFree

+0

は、検証する必要があるためのフラグを保持していますが、ハッキーですが、OPがもともとやっていることよりもハッキリです。 +1 – Tim

+1

また、ブーリアンの代わりにDialogResultを使用して、私の編集をチェックすることもできます! –

0

WM_NCHITTESTメッセージをテストすると、マウスが閉じるボタンの上にマウスを置いたときに表示されるはずです。

関連する問題