C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WPFでWindow枠のカーソル設定方法


(過去ログ 73 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■42517 / inTopicNo.1)  WPFでWindow枠のカーソル設定方法
  
□投稿者/ NICO (17回)-(2009/10/16(Fri) 19:35:47)

分類:[.NET 全般] 

こんばんは。

お世話になっております。
WPFで開発をしています。

あるWindowのResizeModeを、リサイズ可の"CanResize"に設定していますが、
縦方向のみのリサイズを許容し、横方向にはリサイズをさせたくないため、
幅、最大幅、最小幅を共通の値で設定しています。
(Width="572" MinWidth="572" MaxWidth="572")

横方向のリサイズはできないように制御できたのですが、
マウスカーソルがリサイズできるカーソルの種類になってしまいます。

Windowの横枠にマウスが来たときには、カーソルの種類を"NoResize"の時と
同じように表示したいのですが、方法がわかりません。

有識者のかたいらっしゃいましたらご教授お願いいたします。






引用返信 編集キー/
■42539 / inTopicNo.2)  Re[1]: WPFでWindow枠のカーソル設定方法
□投稿者/ Hongliang (488回)-(2009/10/17(Sat) 11:44:42)
直接ウィンドウメッセージ WM_NCHITTEST を処理する必要があるでしょう。
WPF では HwndSource.AddHook によってウィンドウプロシージャをフックすることができるようになっています。
HwndSource のインスタンスは HwndSource.FromHwnd で取得できます。引数に使用するハンドルは WindowInteropHelper を使って取得できます。
なお、Window のインスタンス作成時点ではハンドルがまだ生成されていないので、Loaded イベント辺りで HwndSource を取得するのが妥当でしょう。

さて、WM_NCHITTEST の返値を調整すればお望みの動作になります。
引数のマウスカーソルの位置から判断するのは非常に困難なので、先に既定のウィンドウプロシージャを呼び出してそこがどんなのかを取得させるのが一般的です。
しかし、WinForm での WndProc のオーバーライドでしたら先に base.WndProc を呼び出して Result を参照できるのですが、HwndSource.AddHook では、そのウィンドウが定義しているウィンドウプロシージャを先に呼び出すと言うことができないようです。
そのため、代わりに Win32API の DefWindowProc 関数を呼び出し、これの返値でもって「いまのマウスカーソルの位置がどんな領域か」を判断します。
これで HTLEFT や HTRIGHT、あと HTTOPLEFT や HTBOTTOMRIGHT などなどが返されたとき、handled を True にした上で、HTBORDER や HTTOP などを返すようにすると良いでしょう。
引用返信 編集キー/
■42621 / inTopicNo.3)  Re[2]: WPFでWindow枠のカーソル設定方法
□投稿者/ NICO (18回)-(2009/10/19(Mon) 14:30:50)
No42539 (Hongliang さん) に返信
こんにちは、いつもアドバイスありがとうございます。

Windowのロード時にHwndSourceインスタンスを設定しました。
Win32API の DefWindowProc 関数を呼び出す場所は、MouseMoveイベント処理内であってますでしょか?

しかし、、Win32API の DefWindowProc 関数を呼び出す方法がわからなくて困っています。。


        private void View_Loaded(object sender, RoutedEventArgs e)
        {
            WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this);
            // HwndSourceクラスインスタンスの設定
            hwndSource = HwndSource.FromHwnd(windowInteropHelper.Handle);
        }

        private void View_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            // Win32API.DefWindowProc()???
        }

どうぞよろしくお願いいたします。

引用返信 編集キー/
■42634 / inTopicNo.4)  Re[3]: WPFでWindow枠のカーソル設定方法
□投稿者/ Hongliang (489回)-(2009/10/19(Mon) 18:08:57)
> Windowのロード時にHwndSourceインスタンスを設定しました。
> Win32API の DefWindowProc 関数を呼び出す場所は、MouseMoveイベント処理内であってますでしょか?
いいえ、AddHook で追加するハンドラ(メソッド)の中で、引数 msg が WM_NCHITTEST だったときです。
WM_NCHITTEST などの定数が指している実際の値は、Windows SDK に入っているヘッダファイルを直接確認するのが一番いいですが、大体はウェブ検索でも間に合うでしょう。

> しかし、、Win32API の DefWindowProc 関数を呼び出す方法がわからなくて困っています。。
DllImport 属性を使ってください。
「DllImport DefWindowProc」で検索すれば宣言自体がすぐ見つかるでしょう。
引用返信 編集キー/
■42715 / inTopicNo.5)  Re[4]: WPFでWindow枠のカーソル設定方法
□投稿者/ NICO (22回)-(2009/10/20(Tue) 15:14:40)
No42634 (Hongliang さん) に返信
いつも的確なアドバイスありがとうございます。
無事、実装することができました。

どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -