リッチエディットコントロールでハマる

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。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);

早速追加してやってみたが変わらず・・・だったので、

その後、試行錯誤した結果、「のリソースエディタを使って、リッチエディットコントロールを貼り付けると、バージョン1.0となる」ことが判明。

解決策としては、

  1. #define _RICHEDIT_VER 0x0100

    にして、バージョン1.0のリッチエディットコントロールを使う
  2. リソーススクリプト内で、"RICHEDIT"となっている箇所を RICHEDIT_CLASS に変更する。

    (RICHEDIT.H をincludeする必要有り)

    ※ リソーススクリプトでは、カスタムコントロールとして扱われるようになる。

くらいかなぁ。ややこしい・・・。

カテゴリー: ソフトウェア タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です