直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円、家賃4万円で生活するひつじ人間。

【C#】境界線のないウィンドウでリサイズを実現するための処理とパフォーマンス

 C# ウィンドウズフォームアプリケーションを使ったものです。WPFではありません(アレはよくわからん)

 納得いかなくていろいろ試す羽目になりました。目的がSticky noteの模倣なんで・・・・


 基本的にパフォーマンスがいいのは、stack ovreflowで提示されていたWndproc(フォームを直接処理する関数)をオーバーライドする方法になりました。
 Rectangle構造体を宣言して、その四角い領域の中で検知するのが最もスマートなようです。
 

コレですね。
 https://stackoverflow.com/questions/2575216/how-to-move-and-resize-a-form-without-a-border


       フォームリサイズ

  隠れてしまう
 
 重ねると隠れてしまう。更にフォームとコントロールの間に隙間がないとリサイズ出来ません。


 1番目はOnpaintメソッドをオーバーライドして、その中でフォームを対象にRectangleで対象を決めて描画するってカンジですか。 
 この方法はRichtextboxとか、他のコントロールを載せちゃうと下に隠れてしまうという問題がありますね。悪くはないんだけど。 使いたいんなら、大きめの隙間を空けて小さく描画する必要がありそうですね。


Macのアプリは右下だけでリサイズすると聞いてますが・・・・





 で、冒頭リンクの2番目の方法が最もWindowsらしいフォームに仕上がりますね。
 各部にRectangleを宣言する手法は共通ですが、 
WndProcで
 TopLeft.Contains(cursor)) message.Result と、カーソル位置にキャストする方法です。特に精度が良く、ウィンドウの境界をよく捉えてくれます。
 boderlessだとテキストボックス等がdock = fillで動作しませんので、anchorプロパティで固定したうえで適度な隙間を作ってやる必要があります。

  開発中のFakestickyにて

      



   Formとの隙間が大きいほど掴みやすくなるようです。


  フォームに、テキストボックスと同じ背景色を設定することで違和感を消せます。
       こんな基本機能の実装すらえらい時間が掛かりましてねー|д゚
  いや慣れてはきたんだけど。
 

 3番目は試してないけどスイッチ文を使う方式のようです。






 和製だとこれ
フォームの端をドラッグしてサイズ変更する機能を提供するクラス(C#用) 
 if文判定ですね。

  Core2Quad Q6600 2.4 Ghz で試しました。

 このクラス単体だと差は出ませんが、ちらつき抑止処理なども足すと途端に重くなるようです。


 
       

 

ちらつき抑止
    this.ResizeRedraw = true;//再描画させる
            this.DoubleBuffered = true;  //コントロールの表面を再描画するかどうか。
            this.SetStyle(ControlStyles.ResizeRedraw, true); //サイズ変更で再描画
            SetStyle(ControlStyles.OptimizedDoubleBuffer |
           ControlStyles.AllPaintingInWmPaint |
           ControlStyles.UserPaint |
           ControlStyles.SupportsTransparentBackColor |
           ControlStyles.ResizeRedraw, true);


     protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
              //  拡張ウィンドウスタイルにWS_EX_COMPOSITEDを追加する
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }  
 


前者はif文で判定、後者はWndprocをオーバーライドしたresizableなフォーム(stack overflowのヤツ)です。
 結構な差が出てますね。





 
 とりあえずやり方がいろいろあって、それぞれ方式や利用法も違うんで面白いものだと。



関連記事
スポンサーサイト

 Optiplex 780 SFF

0 Comments

Leave a comment