antenn-a
company profile

MFC航海日記 四十八日(コモンダイアログ)

とりあえず前回のインタフェースで開発をしていくわけだが、インタフェース周りでのコーディングはほとんど無いに等しい。
インタフェース周りのコーディングはフォント設定の画面と、プレビューぐらいだろうか。
プレビュー画面はフォント設定画面のコーディングが終わらないと出来ないので、とりあえずフォント設定画面のコーディングを始めてみたいと思う。


prev


フォント設定画面では、
@ 各文字列のフォント選択
A 色選択
B 背景画像選択
となっていて、分かる人はすぐ分かると思うがコモンダイアログで解決可能である。

さて、このコモンダイアログとは何かと言うと、Windows側がよく使う処理に対して共通のインタフェースを用意していて、この共通のインタフェースの中でダイアログで表現されている物を一般的に「コモンダイアログ」と呼んでいる。

今回使用したコモンダイアログは、
@ フォント選択ダイアログ(CFontDialog)
A 色選択ダイアログ(CColorDialog)
B ファイル呼出しダイアログ(CFileDialog)
の3つである。


prev


では、まずフォント選択ダイアログについてだがこれに付いては35日目に勉強しているのでほとんど書く事は無い。
35日目で言い忘れた事として、フォントの太字処理についてぐらいであろうか。

フォント選択ダイアログに色々データを渡す分けなんだが、このデータはLOGFONTという構造体に入れて渡す事になっている。
LOGFONT構造体には色々メンバーがあるのだが、BYTE型のlfItalicという変数があるくせにlfBoldという変数が無いのである。
イタリック体を指定したい場合はlfItalicをTRUEにすれば良いが、ボールド体にしたい場合はどうしたら良いか分からない(笑)

そして、ヘルプを見てみると・・・「その項目に対するドキュメントがインストールされていません」

・・・・・(怒)

ヘルプを普通に全部インストールしたはずなのに、入っていない。
引けないヘルプ程役に立たない物はない。
頭に来たので、BC(Borland C++)のヘルプで見てみると、すぐに分かった

「フォントの太さ (ウェイト) を、 0から1000までの値で指定します (たとえば、 標準の太さでは400、 太字では700になります)。lfWeightが0の場合は、 デフォルトの太さが使われます。」
なんて分かりやすい説明だ(笑)

確か、Visual C++のLOGFONTのヘルプは全部英語だった気がする。
それを思うと、やっぱりBC++4.5Jは偉大だ・・・

と、いうわけで、フォントを太字にしたい場合はLOGFONT構造体のlfWeightを700にセットする事で実現できる。
と、いうか、普通にBOOL型で表現できるようにもしたら?>MS


prev


次に色選択ダイアログだが、これもフォント選択と大差は無い。
基本的にCColorDialogのオブジェクトを作って、DoModalするだけである。

そして、ファイル選択ダイアログも同じである・・・
いかん、内容が無いぞ・・・

と、書いてからなんだが、CFileDialogも一緒である(笑)

コモンダイアログってこんなに書く事無かったっけ・・・

・・・・あまりに内容が無いので、少し追加。
47日目で見せたサンプル画面の色選択ボタンの隣は選択した色を出すようにしている。
ここもからくりは非常に単純で、一枚Windowを貼り付けて色を塗っているだけである。
こんな簡単にこういうインタフェースが作れるんです。
これだけでも、結構使いやすくなると思うので、皆さんも活用してみてはいかがでしょうか?

貼り付けるWindowはCWndを継承して作ったEColorWindowで、メンバーはCOLORREF型のColorRefOwnのみ。
EColorWindowのOnPaint()をオーバーライドして、
void EColorWindow::OnPaint() 
{
    CPaintDC	dc(this); // 描画用のデバイス コンテキスト
    CRect		rct;
    CBrush		brush( ColorRefOwn );

    GetClientRect( &rct );
    dc.FillRect( &rct, &brush );	
    // 描画用メッセージとして CWnd::OnPaint() を呼び出してはいけません
}
これだけ。

呼出し側は、

BOOL EStyleDialog::OnInitDialog()
{
    //m_StcDispcolorSidecase は、側面のラベルの色選択ボタンの
    //隣のスタティックWindowのオブジェクト
    m_StcDispcolorSidecase.GetWindowRect( rct );
    ScreenToClient( rct );
    ColorWindowSidecase.Create( NULL, 
                                "", 
                                WS_VISIBLE | WS_CHILD, 
                                rct, 
                                this, 
                                0 
                              );
}
という具合ですね。
これで実装完了です。


prev


今回はあんまり内容の無い物でしたが、なんかの参考になれば幸いです。
まぁ、聞くより見た方が早いので、今出来ている所までのソースコードをサンプルとしてダウンロードできるようにします。
汚いソースですが、見たい方はここからどうぞ


antenn-a

prev next


antenn-a