- ベストアンサー
リッチエディットのやり方が解らない
- リッチエディットのやり方が解らない。質問文章の内容として、Windowsプログラミングの書籍『猫でもわかるWindowsプログラミング』の第14章について不明点があります。
- エラーメッセージ「Error desktop01t.rc 52 27: Expecting control window style」と該当箇所(リソース)のコードが表示され、richedit.hを追加してもエラーが解決しないため、riched32.dllの取り込み方法がわかりません。
- リッチエディットのプログラムで必要なriched32.dllを手動でプログラムに取り込む方法がわかりません。ライブラリファイルしかリンクできないと思っていたため、riched20.libをリンクしてもエラーが出ていました。取り込み方のご教授をお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 #2、#4です。 > しかしエラーの場所と文言に変化はありませんでした。 エラーとは、 Error desktop01t.rc 52 27: Expecting control window style と同じ、という事でしょうか? ひとつ確認したい事があります。 #2で記述した以下の部分ですが、 > 1)リソースファイル(*.rc)へ、必要なインクルードを追加 > > ◎インクルードの例 > #include <windows.h> > #include <commctrl.h> このインクルードの追加は、プログラム本体ソース(*.cpp)への追加 という意味ではなく、あくまで、 『リソースファイル(今回は、desktop01t.rc)の先頭に追加』 という意味で記述したものです。 ※もちろん、上記のインクルードはプログラム本体ソース(*.cpp)にも 入れる必要はあります。 この点は、大丈夫でしょうか? 以下は、記述例です。 ■前提事項 ファイル構成が下記だった場合を前提とします。 プログラム本体ソース: desktop01t.cpp リソースファイル : desktop01t.rc リソース参照用ヘッダ: resource.h ■プログラム本体ソース ====================== /* メインソース */ #include <windows.h> #include <commctrl.h> #include "resource.h" : //== WinMain == int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; INITCOMMONCONTROLSEX cc; //コモンコントロールの初期化 cc.dwSize = sizeof(INITCOMMONCONTROLSEX); cc.dwICC = ICC_BAR_CLASSES | ICC_DATE_CLASSES; if (!InitCommonControlsEx(&cc)){ return 1; } : ====================== ■リソースファイル ====================== /* リソーススクリプト */ #include <windows.h> #include <commctrl.h> #include "resource.h" : //== ダイアログ == MYDLG DIALOGEX 0, 0, 131, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "予定表" FONT 9, "MS ゴシック", 400, 0//, 0x80 BEGIN EDITTEXT IDC_EDIT1,7,121,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,7,135,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,7,149,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT4,7,163,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT5,7,177,117,14,ES_AUTOHSCROLL DEFPUSHBUTTON "記入",IDOK,7,197,50,14 PUSHBUTTON "閉じる",IDCANCEL,74,197,50,14 CONTROL "",IDC_MONTHCALENDER1, "SysMonthCal32",MCS_NOTODAY | MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 LTEXT "",IDC_MYSTATIC,7,103,83,11 PUSHBUTTON "本日",IDC_TODAY,98,100,26,19 END : ====================== 以上です。
その他の回答 (4)
こんにちは。 #2です。 > と指摘してくれたので始めはbcc32.cfgと勘違いして変更してしまいました。 > : > : > ということは改めてダウンロードから始めるのが近道なようです。妥当かどうか、 > ご助言とご判定をお願いいたします。 まず、brc32(brc3.exe)というのは、リソースファイル(*.rc)用のコンパイラです。 これは、BCC 5.5(Borland C++ Compiler 5.5)のパッケージに含まれています。 ですので、既にBCC 5.5をご使用なら、改めてダウンロードする必要はないと思います。 それで、問題のインクルードパス等の環境設定の件ですが、「BCC 5.5」側の設定と、 「BCC Developer」側の設定を、今一度、見直された方が良いと思います。 当方は、「BCC 5.5」のみの環境で、「BCC Developer」は持っていなかったので、 今回ダウンロードして環境構築を行ってみました。 以下は、当方で設定した環境設定の例です。 ※BCC5.5のインストールフォルダが、C:\borland\bcc55 だった場合の設定例です。 ■BCC5.5側の環境設定の例 1)環境設定ファイル ◎C:\borland\bcc55\Bin\bcc32.cfg -I"C:\borland\bcc55\Include" -L"C:\borland\bcc55\Lib" ◎C:\borland\bcc55\Bin\ilink32.cfg -L"C:\borland\bcc55\Lib" 2)Windowsシステムの環境変数 PATH の設定 PATH=%PATH%;C:\Borland\Bcc55\bin ※こちらは、コマンドプロンプト上のコマンド操作で、直接コンパイル等を 行う場合のみ必要となります。 ※コマンドプロンプトでの操作を行わないのであれば必要ありません。 ■BCC Developer側の環境設定 1)環境設定 ◎メニュー操作 : ツール → 環境設定 ◎ダイアログ操作 [コンパイラ] タブ コンパイラのパス: C:\borland\bcc55\Bin\bcc32.exe 2)プロジェクトの設定 以下は、プロジェクト名が "desktop01t" で、ターゲットがWindowsアプリ ケーションだった場合の例です。 注)以下の設定は、Debug版とRelease版と別々な設定ができますので、 両バージョンとも作成する場合は、それぞれに設定が必要です。 ◎メニュー操作: プロジェクト → プロジェクト設定 ◎ダイアログ操作 現在のプロジェクト構成: (コンボボックスより選択) ※デフォルトは、Debug or Release [アプリケーション] タブ ターゲット: ◎ Windowsアプリケーション [コンパイル3] タブ インクルードパス: C:\borland\bcc55\Include ※こちらは、bcc32.cfg の設定パスに追加して参照されるパスだと 思われるので、同じパスは設定しなくても良いかもしれません。 [リソース] タブ リソーススクリプトファイル名: desktop01t.rc インクルードパス: C:\borland\bcc55\Include ※こちらは、リソースファイルのコンパイル時に参照されるパスです ので、bcc32.cfg とは別に、こちらにも設定が必要かもしれません。 ※今回のエラーの要因は、これが未設定だった為かもしれません。 設定は以上です。上記を元に、ご使用の環境設定を確認してみて下さい。 それと、InitCommonControlsEx関数 の件ですが、(#1、#3)さんの言われるように、 WinMain関数 の頭の方で呼ぶようにした方が良いと思います。 それと、 cc.dwICC = ICC_BAR_CLASSES; の箇所は、 cc.dwICC = ICC_DATE_CLASSES; または、 cc.dwICC = ICC_BAR_CLASSES | ICC_DATE_CLASSES; とした方が良いと思います。 ※「月間カレンダーコントロール」に相当するのは、ICC_DATE_CLASSES ですので。 以上です。
- Wr5
- ベストアンサー率53% (2173/4061)
リソースコンパイルの方は、試していただくとして… InitCommonControls()/InitCommonControlsEx()はプログラムの開始時に実行しておけばいいだけですので ウィンドウプロシージャ内ではなく、WinMain()等で実行すればよいかと。 # ウィンドウプロシージャ内だと、同じウィンドウクラスで別のウィンドウを作成したときにも実行されます。 # それほど問題にはならないとは思いますが…。 # 同じウィンドウクラスで複数のウィンドウを作る場合、プロシージャ内のstatic変数の方が問題になるでしょう。 で、ダイアログプロシージャのWM_INITDIALOGでInitCommonControlsEx()を実行するようなコードを書いた場合… WM_INITDIALOG自体が飛んでこなくなる…ということがあります。 # 卵(コントロール生成)が先か鶏(InitCommonControlsEx()実行)が先か…みたいな。 # ダイアログリソースないのコントロールの生成に失敗するのでWM_INITDIALOGも出ない。というオチになるのですが…。 ちなみに、参照されている『猫でもわかるWindowsプログラミング』は最新の第3版ではない…ということでよろしいでしょうか? 第3版だと「デスクトップマスコットを~」は第13章になっているようですので。 # で、私は書籍は持っていないので…細かくは追えない。
補足
Stalin28です。 Wr5さん、2回目のご回答、有難うございます。今回指摘してくれた、 InitCommonControls()/InitCommonControlsEx()はプログラムの開始時に実行しておけばいいだけですので というお話を読み、以下のように修正しました。 (1)プログラムリスト・その1 int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; INITCOMMONCONTROLSEX cc; cc.dwSize = sizeof(INITCOMMONCONTROLSEX); cc.dwICC = ICC_BAR_CLASSES | ICC_DATE_CLASSES; if (!InitCommonControlsEx(&cc)) return 1; しかしエラーの場所と文言に変化はありませんでした。そうはいっても乗りかかった船とはいえわざわざダウンロードしての環境構築の実地、感謝いたします。 さて「猫でもわかるWindows」の本自体の件ですが、お察しの通り私が持っているは一つ古い第2版です。でもわざわざ最新版を買う気も起きないですし。 次にFarEyesさんへの補足も書かなければならないのですが、時間が取れないので夜遅くになるかも知れません。
こんにちは。 #1さんが仰っているように、リッチエディット云々(richedit.hの追加、riched32.dllの ロード等)の話しは、今回関係ないと思われます。 ※ご提示のリソース上のダイアログ定義には、「リッチエディットコントロール」は使用 されていませんので。 問題となっている下記のエラー(リソースファイルのコンパイル時のエラー)ですが、 > Error desktop01t.rc 52 27: Expecting control window style > 52| "SysMonthCal32",MCS_NOTODAY | これは、ダイアログの定義で設定している「月間カレンダーコントロール」のスタイル 設定で参照している定義名(MCS_NOTODAY、MCS_NOTODAYCIRCLE)が未定義 (見つからない)のためのエラーのようです。 上記の定義名 は、それが定義されているインクルードファイル(commctrl.h)には、 ちゃんと定義されている(#1さんへの補足情報により)ようですので、 エラーの原因としては、おそらく、インクルード関連の設定(適切なインクルードの 追加、コンパイル環境のインクルードファイルのパス設定など)が正しく設定されて いないためだと思われます。 それと、これも#1さんがご指摘のように、Windowsのコモンコントロールを使用する 際は、それが使用できるようにプログラム内で、コモンコントロールの初期化処理 (WindowsAPIのInitCommonControls関数、または、InitCommonControlsEx関数 の使用)が必要だと思います。 対策としては、 1)リソースファイル(*.rc)へ、必要なインクルードを追加 ◎インクルードの例 #include <windows.h> #include <commctrl.h> 2)リソースファイルのコンパイル時に参照するインクルードパスの設定追加 ◎リソースファイルコンパイル時のコマンドラインオプションの指定例 brc32 -iC:\borland\bcc55\Include -x -32 -V4.0 dialog.rc source.exe 3)プログラムの初期化処理(ダイアログを生成する前)に、コモンコントロール の初期化処理を追加 ◎コモンコントロールの初期化の例 BOOL bsts; INITCOMMONCONTROLSEX initCtrls; initCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX); initCtrls.dwICC = ICC_DATE_CLASSES; bsts = InitCommonControlsEx( &initCtrls ); if(!bsts){ //初期化失敗なら終了 return 1; } などの処置が必要かと思われます。 ■参考サイト InitCommonControlsEx http://yokohama.cool.ne.jp/chokuto/urawaza/api/InitCommonControlsEx.html INITCOMMONCONTROLSEX http://yokohama.cool.ne.jp/chokuto/urawaza/struct/INITCOMMONCONTROLSEX.html 以上です。
補足
Stalin28です。 昨日続けて投稿するはずだった分は、「以下のリンクを参照してください」で済ませたいのでお願いいたします。 http://blogs.yahoo.co.jp/birst_head/59388068.html というのもどうやら解決策が見つかりそうだからです。FarEyesさんが回答してくれた、 2)リソースファイルのコンパイル時に参照するインクルードパスの設定追加 ◎リソースファイルコンパイル時のコマンドラインオプションの指定例 brc32 -iC:\borland\bcc55\Include -x -32 -V4.0 dialog.rc source.exe と指摘してくれたので始めはbcc32.cfgと勘違いして変更してしまいました。しかし考えたみればBCC DeveloperはXPから使っていたのです。つまり7になってWindows.oldのディレクトリになったのが原因ではないかと。結局は二つのcfgファイルの絶対パスを変更しても成果は得られなかったのですが、よく見たら指摘してくれたのはbrc32だったのに気づきまして。 ということは改めてダウンロードから始めるのが近道なようです。妥当かどうか、ご助言とご判定をお願いいたします。
- Wr5
- ベストアンサー率53% (2173/4061)
BCC Developerは使用していませんが… >Error desktop01t.rc 52 27: Expecting control window style >51| CONTROL "",IDC_MONTHCALENDER1, >52| "SysMonthCal32",MCS_NOTODAY | >53| MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 リッチエディットは使用していないのですから、 richedit.hの追加も、ライブラリも関係ないかと思われます。 http://blogs.yahoo.co.jp/birst_head/59377907.html でも、リッチエディットについて書かれていますが… >CONTROL "", IDC_RICHEDIT102, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 8, 159, 25 >CONTROL "", IDC_RICHEDIT103, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 40, 160, 24 が「"RICHEDIT"」だからです。 http://blogs.yahoo.co.jp/birst_head/59380908.html では >次の行で、「Expecting control window style」 >というエラーをもらってしまったから。考えられるのは「MCS_NOTODAY」の箇所ですが。 と…… Windows Platform SDKのもの(CommCtrl.h)では、 #if (_WIN32_IE >= 0x0400) #define MCS_NOTODAYCIRCLE 0x0008 #define MCS_NOTODAY 0x0010 #else #define MCS_NOTODAY 0x0008 #endif となっていますが…BCC Developerではどうなっていますか? # 上記から、 # CONTROL "",IDC_MONTHCALENDER1,"SysMonthCal32",MCS_NOTODAY |MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 # のリソースをコンパイルするには_WIN32_IEが0x0400以上に定義されている必要がありますが…。 # 0x0400未満だと「MCS_NOTODAYCIRCLE」が未定義に… 他に、コード側でInitCommonControlsEx()辺りが必要そうですが…。
補足
Stalin28です。 Wr5さん、私のブログを参照した上の早速のご回答、感謝いたします。ご指摘されたcommctrl.hの、BCC Developerでの構成についてご報告いたします。_WIN32_IEの設定は初っ端にあるのでコメント欄を含めると以下のようになっています。 (1)commctrl.hのリスト・その1 /*****************************************************************************\ * * * commctrl.h - - Interface for the Windows Common Controls * * * * Version 1.2 * * * * Copyright (c) 1991-1998, Microsoft Corp. All rights reserved. * * * \*****************************************************************************/ #ifndef _INC_COMMCTRL #pragma option push -b -a8 -pc -A- /*P_O_Push*/ #define _INC_COMMCTRL #ifndef _WINRESRC_ #ifndef _WIN32_IE #define _WIN32_IE 0x0501 #else #if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) #error _WIN32_IE setting conflicts with _WIN32_WINNT setting #endif #endif #endif なお、MCS_NOTODAY関連は以下の通りです。 (2)commctrl.hのリスト・その2 // begin_r_commctrl #define MCS_DAYSTATE 0x0001 #define MCS_MULTISELECT 0x0002 #define MCS_WEEKNUMBERS 0x0004 #if (_WIN32_IE >= 0x0400) #define MCS_NOTODAYCIRCLE 0x0008 #define MCS_NOTODAY 0x0010 #else #define MCS_NOTODAY 0x0008 #endif 字数制限がかかるのでInitCommonControlsEx()の情報はすぐ後にお知らせします。
補足
Stalin28です。 FarEyesさん、今回の指摘でも状況は変わらないと#4を補足する予定だったのですが、状況が変わりました。まさに5時21分の回答で指摘してくれた、リソースファイルにインクルードしていなかったことが原因のようです。ソースファイルの物をコピペしたらコンパイルでき、実行できました。 今回の相談について、Wr5さんともどもお二人の努力には感謝するしかありません。特にエラーの可能性を次々に指摘してくれた姿勢に、結果的にほとんどが関係ないことだったとはいえ、私自身のプログラミング力を高める礎になりそうです。 今回は小分けした以外はテキスト通りに打ったことを相談する前に何度も確かめているため、お二人のご尽力がなければ問題を解決できませんでした。また「猫でも」が万能でないことも解り、教則本に対してもメディアリテラシーを発揮しなければならないと気付いた今回の出来事でした。もっとも本の方の「猫でもわかるWindows」は第14章で終わりなので、サイトの「猫でもわかる」で勉強する予定ではありますが。 最後にもう一度、Wr5さんとFarEyesさん、私の相談に解決まで導いていただき、本当に有難うございました。