DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■35066 / inTopicNo.1)  Formのサイズ変更で掴める辺を制限したい
  
□投稿者/ ぺんたごん 一般人(1回)-(2022/06/08(Wed) 15:37:54)
  • アイコン環境/言語:[Win10 C# .NET 4.6.x] 
    分類:[.NET] 

    ごぶさたしてます、ぺんたごんです
    
    タイトルが適切かわからないんですが、
    Formのサイズ変更を右・下・右下しか掴めないようにしたいと思ってます。
    
    経緯としては独自ドロップダウンコントロールを作っており、
    ドロップダウンで出てくるパネル的なのをFormでやろうとしてます。
    
    自前でサイズ変更グリップ実装するのもめんどいので
    イベントやメッセージをフックして抑止してしまおうと考えました。
    
    WM_SIZINGなら掴んだ辺を判定できるので、
    以下のようにWndProcをオーバーライドしてみました。
    
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0214)
        {
            switch (m.WParam.ToInt32())
            {
                case 1: // 左
                case 3: // 上
                case 4: // 左上
                case 5: // 右上
                case 7: // 左下
                    m.Result = IntPtr.Zero;
                    return;
            }
        }
        base.WndProc(ref m);
    }
    
    しかし普通にサイズ変更できてしまいます。
    ググって出てくるウィンドウの移動やクローズを抑止する的な奴は
    全部この方法なんですが、サイズ変更に関しては不可能なんでしょうか。
    
    試しにWM_SIZEもフックして強制的にreturnしてみましたが
    相変わらず…WndProcじゃなくても何か方法ありましたら
    ご教示いただけると助かります。
    
    よろしくお願いいたします
    

引用返信 削除キー/
■35067 / inTopicNo.2)  Re[1]: Formのサイズ変更で掴める辺を制限したい
□投稿者/ Hongliang 大御所(627回)-(2022/06/08(Wed) 16:22:34)
  • アイコンよくある方法としては、WM_NCHITTESTで、HTTOPとかが来た時にNTCLIENTを返す、といったやり方でしょうか。
引用返信 削除キー/
■35068 / inTopicNo.3)  Re[2]: Formのサイズ変更で掴める辺を制限したい
□投稿者/ ぺんたごん 一般人(2回)-(2022/06/08(Wed) 16:56:05)
  • アイコン
    No35067に返信(Hongliangさんの記事)
    > よくある方法としては、WM_NCHITTESTで、HTTOPとかが来た時にNTCLIENTを返す、といったやり方でしょうか。
    
    迅速な回答ありがとうございます。
    なるほど、ヒットテストの段階で誤認させることで
    マウスカーソルの変化も防げるということですね。
    
    以下の方法で行けました。
    ポイントは、実際に触った場所を知るために
    よくあるWndProcのセオリーと違って先にbaseを呼んで、
    その後は2回呼ばないよう注意すべき点でしょうかね。
    
    HTCLIENTと判定して何か変な挙動を引き起こしてもアレなので
    今回はZeroをぶち込んでヒットしなかったことにしました。
    
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0084) // WM_NCHITTEST
        {
            base.WndProc(ref m); // 先に呼ぶ
            
            switch (m.Result.ToInt32())
            {
                case 10: // 左
                case 12: // 上
                case 13: // 左上
                case 14: // 右上
                case 16: // 左下
                    m.Result = IntPtr.Zero;
                    break;
            }
            return;
        }
        base.WndProc(ref m);
    }
    
    感謝です!

解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -