- PR -

非クライアント領域の再描画について

1
投稿者投稿内容
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 2008-12-05 14:01
環境はC#のWindowsアプリです。

WM_NCPAINTメッセージのときに、非クライアント領域に独自描画を行っています。

他のウィンドウを用いて、独自描画部分(非クライアント領域)を一旦隠してから外すと、非クライアント領域の再描画が起こらず、独自描画部分が表示されません。
(クライアント領域にウィンドウがかかれば独自部分も描画されます)

非クライアント領域の再描画はいつのタイミングで行えばよいのでしょうか?

protected override void WndProc(ref Message m)
{
  if (m.Msg == WM_NCPAINT) {
    base.WndProc(ref m);

    Graphics g = this.Parent.CreateGraphics();
    Rectangle drawRect = new Rectangle(this.Location, this.Size);
    drawRect.Inflate(10, 10);
    g.FillRectangle(Brushes.Blue, drawRect);
    g.Dispose();
    return;
  }
  base.WndProc(ref m);
}

よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-12-05 14:52
>非クライアント領域の再描画はいつのタイミングで行えばよいのでしょうか?

てか

>Graphics g = this.Parent.CreateGraphics();

だと、自ウィンドウの WM_NCPAINT で、親ウィンドウの非クライアント領域に描画することになるんですけど、なんかおかしくないですか?
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 2008-12-05 15:17
現在TextBoxコントロールの周り(非クライアント領域?)に独自に描画をしようと考えていたのですが、
上記を行う場合、TextBoxのWM_NCPAINT内で処理するのは間違いということでしょうか?
質問と同じコードをWM_PAINT内に移して試してみたところ、TextBoxの周りに描けました。
しかし、TextBoxの再描画タイミングがない場合、例えば、独自描画部分のみの更新が必要な場合は、描画が欠けてしまいます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-12-05 16:01
引用:

現在TextBoxコントロールの周り(非クライアント領域?)に独自に描画をしようと考えていたのですが、



あなたが「TextBox コントロールの周り」と呼んでいる領域はおろらく、「(TextBox コントロールの)親ウィンドウのクライアント領域」です。

.NET 標準の TextBox コントロールで「非クライアント領域」と呼べるのは、BoderStyle を None 以外に設定した時の「縁」の部分の僅か数ドットの範囲です。

引用:

上記を行う場合、TextBoxのWM_NCPAINT内で処理するのは間違いということでしょうか?



実際どうなのかが分からないので想像ですが、まず出発点が間違っているように思えます。
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 2008-12-08 12:51
返答ありがとうございます。

「クライアント領域および非クライアント領域」の意味はそういうこと
だったんですね。わかりました。

このことを基にアプローチを考え直してみます。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-12-08 14:13
こんにちは。

ちなみに、WM_NCCALCSIZE Notificationを処理すれば、
非クライアント領域を広げることができますが、やめといたほうが良いみたいです。
ClassLibraryが非クライアント領域(ボーダーの太さ)を変更されることを想定して作られていないため、
クライアント領域が潰れてしまいます。

枠を太くしたいのならテキストボックスを張り付けたユーザーコントロールで何とかなるのでは!?
Leo
会議室デビュー日: 2008/11/11
投稿数: 13
投稿日時: 2008-12-11 09:48
ご助言ありがとうございます。

ユーザーコントロールに貼り付けることで、簡単に対応できそうですね。
ただ、使うとき、各プロパティにアクセスするのが1階層(ユーザーコントロール分)増えてしまう…。(仕方がないですが)

WM_NCCALCSIZEの方も検討してみたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)