「スタティックライブラリでMFCを使用する」+「CMFCButton::SetImage()」で終了時にエラー

[戻る]
はげ 2016/09/18(日) 13:49:33
お世話になります。
以下の条件で作成したアプリケーションを実行すると、
アプリケーション終了時にエラーが発生します。

@VisualStudio Community 2013、Windows7
AMFC、ダイアログベース
Bプロジェクトの構成プロパティで「スタティックライブラリでMFCを使用する」を選択
CリソースエディタでMFCButtonを作成
DCのボタンにコントロール変数を追加する
 (#include "afxbutton.h"が組み込まれる)
ECのボタンにSetImage()で画像リソースをセット


新規プロジェクトで「MFCアプリケーション」(ダイアログベース)を作成し、
上記のようにMFCボタンを1つ追加するだけで現象が再現します。


MFCボタンを追加しただけでは問題は発生せず、
SetImage()を追加して画像を貼り付けると終了時に問題が発生するようになります。

終了時のリソース解放かなにかが関係しているような気がしますが、
当方にデバッグスキルがなく、
これ以上の切り分けや問題の核心へ迫ることができません。

原因/解決法についてお知恵をお借りできますと大変助かります。

よろしくお願いいたします。

K 2016/09/20(火) 10:27:46
エラーが出るなら出るで、
何というエラーがどこで出るのか?ぐらいは示した方がいいと思います。

はげ 2016/09/21(水) 05:11:50
K様
ご連絡ありがとうございます。
エラーの内容を詳しくお伝えしておりませんでした。大変失礼いたしました。

具体的には、アプリケーション終了時(×ボタンでウィンドウを閉じたとき)、
メインダイアログが消えると同時に「***は動作を停止しました」というエラーダイアログが表示されるというものです。
(OS側で呼び出しているエラーダイアログと思われます)
「スタティックライブラリでMFCを使用する」を選択せず、動的リンクでビルドすれば発生しません。


その後の試行錯誤でわかったことがあります。
SetImage()で貼り付けている画像は、
リソースエディタでアルファチャネル付きの透過PNGを内部リソースに登録したうえで使用しています。
ボタンへの貼り付け操作は
m_MFCButton_Hoge.SetImage(IDB_PNG_HOGE);
としています。
アプリケーション動作時にきれいに透過表示され、動的リンクビルド時には終了時のエラーも発生しません。
静的リンクに変更すると終了時に上記のエラーが発生します。

内部リソースの割り当てをPNGではなくアイコンファイル(*.ico)に変更し、
以下のようにしてボタンへの貼り付け操作を行うようにすると、上記のエラーが発生しなくなりました。

ICON hIcon;
hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICO_HOGE), IMAGE_ICON, 32, 32, 0);
m_MFCButton_Hoge.SetImage(hIcon, TRUE, NULL, NULL, TRUE);

透過画像作成はPNGの方が慣れていることもありPNGの使用を考えていましたが、
ICOで扱えば問題が発生しないことがわかりましたので現在はこちらの方法に切り替えました。
解決といえば解決なのかもしれませんが、
なぜ当初の記述ではエラーが発生するのか、直接の原因まで理解できておりません。

よろしくお願いいたします。

ITO 2016/09/21(水) 09:43:49
VisualStudio2013は初めてですか?
前のバージョンは20??ですか?
201X以降からリソースの関連もかなり変わっているみたいです。
もう一度、MSDNを見直した方がいいと思います。

はげ 2016/09/21(水) 18:23:20
[[解決]]
ITOさん
お世話になります。

はい。201Xは初めてです。
(20年ほど前にVC6で多少コーディングしていた程度です)

(私の理解が正しいかどうかという疑問もありますが)
MSDNを参照してCMFCButtonクラスのパブリックメソッドを見ますと、
リソースIDからSetImage()できるのはあくまでもビットマップであると理解しました。

*.bmpであればSetImage()にて問題なく動作&正常終了できることも確認できました。
(この場合透過ブレンディングはできない)

透過させたい場合にはアイコンファイルを貼り付けるようにするということで、
この件はクローズとさせていただきます。

みなさま、どうもありがとうございました。

古いスレッドには追加発言できません。