この記事は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する必要有り)
※ リソーススクリプトでは、カスタムコントロールとして扱われるようになる。
くらいかなぁ。ややこしい・・・。