Visual Studio 2008 SP1とMFC(feature pack相当)を使ってアプリを書いていたのですが、

↑こんな感じでメニューの文字が小さくなってしまいました(Dominoのメニューフォントサイズが、設定してあるフォントサイズ)。

一応回避方法があったので載せておきます。

CMainFrame::OnCreateの上の方で

LOGFONT lf;
SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0);
CMFCMenuBar::SetMenuFont(&lf);
m_fontGUI.CreateFontIndirect(&lf);

を実行すれば良さそうです。

これどっかに連絡すればsp2で治してくれるのかな?
MSのサポートって有料なのでこういう不具合を見つけてもいまいち報告する気にならないのですが。

—–
(コード修正しました)
なにやらSPI_GETNONCLIENTMETRICSでフォントを取得する方法は
開発環境によってはXPでうまく動作しないようなので、
SPI_GETICONTITLELOGFONTを使う方式に変更しました。
参考:http://d.hatena.ne.jp/NyaRuRu/20080303/p1

2009
3月
01

半年ぐらい前にVisual Studio 2008にFeature PackというMFCのコンポーネントが追加されまして(VS2008 SP1に含まれています)、 Office等で使われているリボンコントロール類がわりと簡単に使えるようになったわけなんですが、ようやく最近になって実際に触ってみる機会がありましたので、ちょこっとご報告。
VS2008 SP1からは、Officeのようなインターフェースが手軽に使えるだけでなく、Office2003のツールバーやメニュー等のカスタマイズ機能(もちろん環境の保存・復元機能も)、ドッキングウィンドウ機能などが標準で付いているのが凄いと思いました。

EDGE2を作ろうとした頃、タブブラウザで有名なsleipnir 1.66を使っていまして(今は2を使っています)、 sleipnirはわりとカスタマイズ性を売りにしているところがあって、どうやってカスタマイズ機能などを実現しているのかちょこっと調べてみた事があるのですが、どうやらBCGSoftというメーカーが出しているBCGControlBarという商用ライブラリを使っていたようなんですね。

それで初めてBCGControlBarというライブラリの存在を知って、当時買おうかちょっと迷ったんです。こうした機能を独自で実装するとなると、なかなか手間が掛かりまして、面倒くさいんですよね。当時の私はまだ学生だったという事もありまして(バイトもあまりやっていなかったので)結局自前でなんとかしたわけなんですが、それがVS2008 SP1からは新規作成した所で全部備わっちゃってるわけですから凄いものです。

で、どうもこのBCGControlBarの一部の機能がVS2008 SP1にそのまま入ってるみたいなんです。ただ、一部と書いたとおり、すべての機能が入ってるわけではなくて、商品のBCGControlBar Pro版には、更にグリッドコントロールや高機能エディターなどが付いているようです。
(VS2008 SP1との機能比較が個人的には欲しかったです^^;)

そうしてVS2008 SP1持っているけどそれでは足りない人向けにBCGSuiteという商品があるっぽいです。
(Pro版からSP1を引いた程度の内容になっている感じです。)

ちなみに製品の紹介はこちらが参考になるかと。
http://www.bcgsoft.com/featuretour/bcgcontrolbar-tour.htm
(グリッドコントロール標準で欲しいですわorz)

VS2008 SP1、実際に使ってみると、結構クラス設計とか綺麗に作られている印象を受けました。
BCGSoftさんやり手ですね。

ただ、デフォルトでカスタマイズ機能の保存先がレジストリになっている点が、一部のユーザーに反感を買いそうな感じではあります(^^;
一応頑張ればiniファイルとかバイナリに保存できるようになっているようですが、最初っからレジストリに当たり前のように書くのはちょっと勘弁して欲しいですね。

他にもツールバーの登録がツールバーリソース経由しかなさそう(?)なのが個人的にはちょっと痛いところ。
VS2008のツールバーエディタで16色のツールバー画像を作成し、その後で自動作成されたbmpをフルカラー画像に置き換えるか(置き換えるとVS2008上で開けなくなりますが)、もしくは別リソースとしてフルカラー画像リソースを用意してCMFCToolBar::LoadBitmap(だったっけ)しないといけません。
どちらにしてもあとで手を入れるときに二度手間な時があってあんまり好きじゃありません。

そういえば、マニュアルには載ってませんが、ソースを追っていたら、CMFCToolBar::LoadBitmapだったかは、 PNG形式のリソース画像も読めるっぽいです(試していませんが)。
そこはマニュアルに書いておくべきかと(^^;
なので、16色のツールバーリソース+PNGフルカラー画像リソースという組み合わせが現状ではベストかと思われます。
(フルカラーBITMAPリソースはEXEがメタボになるのであんまりリソースとして持ちたくないんですよね)

何かSP1MFCの詳しい書籍が出てくれると良いんですが。
インプレスさん、Visual Studio 2008 SP1 MFCパワフルテクニック大全集とか出してくれませんかね?

需要ないかな・・・

《参考資料》
CodeZineさんの記事→http://codezine.jp/article/detail/2516
BCGSoft→http://www.bcgsoft.com/
MSDNのチュートリアルとか→http://msdn.microsoft.com/ja-jp/library/bb982451.aspx

少し忙しくなりそうな予感なのでドミノ更新しておきます。
更新内容はダウンロードページの下にありますので、そちらをどうぞ。

ダウンロードなどはこちらから

昼休みゲオにダッシュで行ったんですが、スマブラ売り切れでした。

(´・ω・`)ショボーン
(´・ω・,';,';,’,
(´・ω,';,';,’,
(´,';,';,’,
(,';,';,
‘;,,(‘

世の中のお父さんはすごいね!

ところで仕事でもVisual Studio 2005(MFC)を使っているのですが、印刷周りでいくつかバグを見つけましたので、情報として出しておきます。

《その1》
例えば印刷可能範囲が1~10だとして、印刷画面で2~3ページを印刷しようとした場合、実際には2~10ページが印刷されてしまう。

→回避策:http://codezine.jp/forum/message.aspx?thid=472

海外のサイトではOnPrint内で印刷範囲を書き換えて回避するコードもありました。

《その2》
リリースでMFCをスタティックリンクすると、印刷プレビュー画面の上のボタン類が英語になる。

これは、リソースファイルのインクルードで
#include “afxprint.rc” // 印刷/印刷プレビュー リソース
となっている所を
#include “l.jpn/afxprint.rc”
にすればOK。

ちなみに、字が小さいのをなんとかしたい場合は、この「l.jpn/afxprint.rc」を開いてプロジェクトフォルダに別名保存し、中のリソースの文字サイズを変え、#include “l.jpn/afxprint.rc”の代わりに別名保存したファイルをインクルードすればOKです。

《その3》
A4縦用紙の印刷プレビュー画面にて、一段階拡大したときに、マウスカーソル(ルーペ)と用紙の当たり判定がおかしい(紙の右側をクリックしても、もう一段階拡大しない)

こちらは検索しても回避策が出てきませんでしたので自前でなんとかしました。
CPreviewViewの派生クラスを作成して、マウスカーソルの当たり判定部分を修正すればOKです。

.NETもいいですがVS2005でせっかくMFCもバージョンアップするなら、こういう初歩的なバグは直してからリリースしてほしいです(というか未チェックなんじゃ・・・)。
あと、クラスウィザードは復活させてほしいです(イベントハンドラの追加が面倒)。
あと、ラジオボタンかなんかの変数を追加したときにBOOL型にしようとするのは止めてほしいです。
あと、インテリセンスの更新をVC6並にちょっぱやにしてほしいです。
あと、CFile系の処理でブレークポイント貼ると落ちることがあるのをなんとかしてほしいです。
あと、「CHogeHoge* pHoge」の「CHogeHoge*」だけをCtrl+左ドラッグで選択出来るようにしてほしいです(VC6ではできた)

そんな事を挙げていくとキリがないですが・・・。
コンパイラはVC6よりも2005の方が良いと思うのですが、IDEは使いづらいところが目立ちます(´・ω・`)ショボーン
何か、改善策などをご存じの方がいらっしゃいましたら、こっそり教えてくださると助かります。

仕事でも趣味でもだんだん使うようになってきたVisual Studio 2005なんですが、便利になった部分、すごく使いづらくなった部分、いろいろ変わったなーという感じです。

MFCに関してはバグもいくつか確認していますが(印刷のページ範囲がバグるとか、MFCをスタティックリンクするとシステムの文章がデフォルトで英語になってるとかw)そんなことよりも未だに慣れないのがイベントハンドラの追加周り。

例えばメニューコマンドのイベントハンドラを作成する場合、VC6だったらクラスウィザードを表示させて各コマンドのUPDATE_COMMAND_UIとCOMMANDハンドラを一気に追加する事が出来たんですが、 VS2005だとクラスビューを右クリックしてプロパティ選んで、プロパティペインから対象のコマンドを探してUPDATE_COMMAND_UIを追加したら、ソースが切り替わってプロパティペインの内容が変わっちゃうもんだから、次COMMANDハンドラを追加したいときはまたクラスビューからクラスを探して右クリックして・・・・まだ一つのコマンドなら良いんですがそれが「切り取り」「コピー」「貼り付け」「削除」・・・と複数追加したい時に、毎回この作業しなくちゃならなくて、やってるウチにムキィーーーっとなるわけです。

各言語間で操作を統一する事は否定しませんが、今までより効率が下がるのは勘弁してほしいなと思います。

インテリセンスにしても、たしかにVC6より性能が上がったとは思うのですが、さっき追加したばかりのメンバ関数が候補になかなか出てこない、というのが気になる所です。VC6の時はすぐに反映されたのですが・・・。インテリセンス情報が更新されるまでネットサーフィンしてやろうかと思うこともしばしば(笑)

たぶん、どこかいじればこの辺の問題も解決できると思いこんでるのですが、何かそのあたりの情報をご存知の方はこっそり教えていただけると嬉しいです!

ダウンロードなどはこちらから

MFCのCRectクラスは初期化を忘れてもデバッグビルドではそれなりに動作するのですが、リリースビルドだとうまく動かないため、開発時に検出しづらいです_| ̄|○

CStringクラスは初期化しなくとも(?)データが無い状態となりますが、それと同じような感覚でCRectなんかを使うと痛い目にあいますので開発者の方はご注意を。
(普通こんなミスしないか)

記事検索

アーカイブ