この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
ダイアログボックスにリッチエディットコントロールを貼り付けて、
ダイアログボックスを生成すると何故か表示されなくなった。
普通のエディットコントロールなら問題ないのに。。
途中までは上手くいってるように見えるけど、(エラー吐かないし)
CDialogImpl::Create()が返すハンドルはNULLだから、どっかで変になってるんだろう。
しゃーないので、↓こんなテキトーなマクロ拵えてウィンドウメッセージの流れを追ってみた。
#define DEBUG_MSG_MAP(str) \ break; \ } \ _RPT4(_CRT_WARN, str ": dwMsgMapID=[%d], uMsg=[0x%04x], wp=[0x%x], lp=[0x%x]\n", \ dwMsgMapID, uMsg, wParam, lParam); \ switch(dwMsgMapID) \ { \ case 0:
↓こんな感じでメッセージマップの直後で使う。
// メッセージマップ BEGIN_MSG_MAP_EX(CMainDlg) DEBUG_MSG_MAP2("CMainDlg")
するとVCのアウトプットウィンドウにログが流れるという感じ。
で、吐かれたログを見てみるとWM_DESTROYが来てた・・・
0x0030(WM_SETFONT)
0x0002(WM_DESTROY)
0x0082(WM_NCDESTROY)
エディットコントロール から リッチエディットコントロールに変更した途端にこうなったんで、
まぁ、リッチエディットコントロールの使い方が悪いんだろうと調査したところ、
以下のサイトがヒット。
ATL/WTLによるWindowsプログラミング – リッチエディット(The So-Software Studio )
なんでも、↓こんな初期化処理が要るらしい。
#define _RICHEDIT_VER 0x0200 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/) { // リッチエディットコントロール初期化 HINSTANCE hRich = LoadLibrary(CRichEditCtrl::GetLibraryName()); if(hRich == NULL){ AtlMessageBox(NULL, _T("リッチエディットコントロール初期化失敗"), _T("エラー"), MB_OK | MB_ICONERROR); return 0; } HRESULT hRes = ::CoInitialize(NULL); ATLASSERT(SUCCEEDED(hRes)); ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_BAR_CLASSES);
早速追加してやってみたが変わらず・・・だったので、
その後、試行錯誤した結果、「vc6のリソースエディタを使って、リッチエディットコントロールを貼り付けると、バージョン1.0となる」ことが判明。
解決策としては、
- #define _RICHEDIT_VER 0x0100
にして、バージョン1.0のリッチエディットコントロールを使う - リソーススクリプト内で、"RICHEDIT"となっている箇所を RICHEDIT_CLASS に変更する。
(RICHEDIT.H をincludeする必要有り)
※ リソーススクリプトでは、カスタムコントロールとして扱われるようになる。
くらいかなぁ。ややこしい・・・。