CDialogクラスのダイアログの背景色を設定するには – プログラミング – Home

CDialogクラスのダイアログの背景...
 
通知
すべてクリア

[解決済] CDialogクラスのダイアログの背景色を設定するには


ゆあ
 ゆあ
(@ゆあ)
ゲスト
結合: 24年前
投稿: 13
Topic starter  

VC初心者です。
今CDialogクラスでダイアログを作成しているのですが,
ダイアログの背景色を設定することが出来ません。
CWinAppクラスだとSetDialogBkColorで設定できるらしいのですが,
CDialogでできる方法が有りましたらお教え下さい。


引用未解決
トピックタグ
ゆあ
 ゆあ
(@ゆあ)
ゲスト
結合: 24年前
投稿: 13
Topic starter  

VC初心者です。
今CDialogクラスでダイアログを作成しているのですが,
ダイアログの背景色を設定することが出来ません。
CWinAppクラスだとSetDialogBkColorで設定できるらしいのですが,
CDialogでできる方法が有りましたらお教え下さい。

また色の設定なんですが色を定数で設定したいのですが、
RGB指定だと赤,青,緑の三色を指定しないといけないので,
定数の数が増えてソースが見にくくなってしまいます。
3色一度で指定できる方法があれば教えて下さい。


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

> CDialogでできる方法が有りましたらお教え下さい。
CDialogクラス内で記述できればOKでしょうか?
ChogeDialogクラスでWM_PAINTをオーバーライドします。
塗りにはCDC::FillSolodRect()関数を使います。

void CDlgTest01Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

(省略)
}
else
{

// *** ここから追加

CRect rect;
GetClientRect(rect); // Dialogのクライアント領域を取得
CDC* pDC = GetDC();
pDC->FillSolidRect(rect, RGB(0, 128, 255)); // 適当な色
ReleaseDC(pDC);

// *** ここまで

CDialog::OnPaint();
}
}

> 3色一度で指定できる方法があれば教えて下さい。
マクロで定義するとか。


返信引用
ゆあ
 ゆあ
(@ゆあ)
ゲスト
結合: 24年前
投稿: 13
Topic starter  

Bunさん、有難うございました。
何とかできそうです。


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

ゆあ様

読んでもらえるかな?

さっきのコードだと、再描画の時に不具合が発生することがあります。
他のウィンドウをダイアログに重ねたり、どかしたり試すと不具合が解ります。

修正は、下記のようにコードを追加してください。
OnPaintで一度だけ処理します。処理内容はダイアログのスタイルを変更します。
ダイアログを描画する時に、「子であるコントロールの部分は描画しない」というスタイルに変更しました。

void ChogeDlg::OnPaint()
{
 static BOOL InitFlag = FALSE;
 if (InitFlag == FALSE)
 {
  HWND hWnd = this->GetSafeHwnd();
  if (hWnd != NULL)
  {
   InitFlag = TRUE;
   // ダイアログのスタイルを取得
   long lstyle = ::GetWindowLong(hWnd, GWL_STYLE);

   // 子ウィンドウは描画しないように指示
   lstyle |= WS_CLIPCHILDREN;

   // 再設定
   ::SetWindowLong(hWnd, GWL_STYLE, lstyle);

  }
 }
 if (IsIconic())
 {
  ここから先はさっき(上)の通り、そのままでOK
 ・
 ・
 ・
}


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

ブラシで書けるものならC***Dlg::OnCtlColorで
 if(nCtlColor == CTLCOLOR_DLG)
のときお望みのブラシを返してやったほうがいいですかね。


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

CdS様

> ブラシで書けるものならC***Dlg::OnCtlColorで
>  if(nCtlColor == CTLCOLOR_DLG)
> のときお望みのブラシを返してやったほうがいいですかね。

理由も書いて頂けると勉強になるのですけど?m(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました