リッチエディットのやり方が解らない
- リッチエディットのやり方が解らない。質問文章の内容として、Windowsプログラミングの書籍『猫でもわかるWindowsプログラミング』の第14章について不明点があります。
- エラーメッセージ「Error desktop01t.rc 52 27: Expecting control window style」と該当箇所(リソース)のコードが表示され、richedit.hを追加してもエラーが解決しないため、riched32.dllの取り込み方法がわかりません。
- リッチエディットのプログラムで必要なriched32.dllを手動でプログラムに取り込む方法がわかりません。ライブラリファイルしかリンクできないと思っていたため、riched20.libをリンクしてもエラーが出ていました。取り込み方のご教授をお願いします。
- ベストアンサー
リッチエディットのやり方が解りません
リッチエディットのやり方が解りません 相談するのは2回目です。今回は書籍『猫でもわかるWindowsプログラミング』について不明な点があるので、相談に伺いしました。当方の環境はBCC Developerなのですが、第14章のデスクトップアクセサリのプログラムをすべて打ち込んだのに実行できないのです。エラーメッセージと該当箇所は以下の通りです。 (1)エラーメッセージ Error desktop01t.rc 52 27: Expecting control window style ** error 20018 ** deleting Debug\desktop01t.res (2)該当箇所(リソース) 38|MYDLG DIALOGEX 0, 0, 131, 218 39|STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | 40| WS_POPUP | WS_CAPTION | WS_SYSMENU 41|CAPTION "予定表" 42|FONT 9, "MS ゴシック", 400, 0//, 0x80 43|BEGIN 44| EDITTEXT IDC_EDIT1,7,121,117,14,ES_AUTOHSCROLL 45| EDITTEXT IDC_EDIT2,7,135,117,14,ES_AUTOHSCROLL 46| EDITTEXT IDC_EDIT3,7,149,117,14,ES_AUTOHSCROLL 47| EDITTEXT IDC_EDIT4,7,163,117,14,ES_AUTOHSCROLL 48| EDITTEXT IDC_EDIT5,7,177,117,14,ES_AUTOHSCROLL 49| DEFPUSHBUTTON "記入",IDOK,7,197,50,14 50| PUSHBUTTON "閉じる",IDCANCEL,74,197,50,14 51| CONTROL "",IDC_MONTHCALENDER1, 52| "SysMonthCal32",MCS_NOTODAY | 53| MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 54| LTEXT "",IDC_MYSTATIC,7,103,83,11 55| PUSHBUTTON "本日",IDC_TODAY,98,100,26,19 56|END 情報を漁ってみて<a href="http://questionbox.jp.msn.com/qa5414346.html ">richedit.hを追加すべきという情報</a>を見つけたのでプログラムの方で、 #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" としたのですがエラー内容は変わりません。そもそもBCC Developerではライブラリファイルしかリンクできないので、必要とされるriched32.dllを手動で無い方法でプログラムに取り込む方法が解らないのです。手動であればサイトの方の<a href="http://www.kumei.ne.jp/c_lang/sdk2/sdk_122.htm">「猫でも」の第122章</a>が該当するようですが、riched32.dllは提供されているダイナミックリンクライブラリなので方法があると思うのです。どうか取り込み方のご教授をお願いいたします。なおライブラリファイルしかリンクできないと思ったので、当初はriched20.libをリンクしてエラーを出しておりました。
- stalin28
- お礼率8% (1/12)
- C・C++・C#
- 回答数5
- ありがとう数4
- みんなの回答 (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% (2177/4070)
リソースコンパイルの方は、試していただくとして… 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% (2177/4070)
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()の情報はすぐ後にお知らせします。
関連するQ&A
- エディット スタイル リソースファイル
開発環境: vista visual studio2010 メモ帳を用いて、リソースファイルを作っています。 ダイアログを、作成して、その中にエディットを表示させています。 このエディットのスタイルを、このようにしたいです。 (1) 書き込みが出来ないようにする →OK (2) 外枠などを外す →OK (3) 枠をオーバーする場合は、改行せず横にスクロールさせる →出来ない という状況です。 イメージ図も添付しておきます。 なぜ(3)が出来ないのか分かりません。(2)の動作をなくすと、出来るようになるのですが。 #include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN IDD_LOADING DIALOG 0, 0, 188, 169 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Dialog" FONT 10, "HGS創英角ゴシックUB" { EDITTEXT IDDE_NAME, 14, 16, 72, 19, ES_READONLY | ES_AUTOHSCROLL ~WS_BORDER }
- ベストアンサー
- C・C++・C#
- 1つのウィンドウに2つのエディット
case WM_CREATE: GetClientRect(hWnd, &rc); EditL = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , 0 , 0 , rc.right / 2 , rc.bottom , hWnd , (HMENU)1 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL); EditR = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL); return FALSE; とすると、1つのエディットしか表示されません。 また、 case WM_SIZE: GetClientRect(edit, &rc); MoveWindow(edit, rc.left, rc.top, rc.right, rc.bottom, TRUE); として、ウィンドウサイズが変更された時に どちらのエディットもクライアント領域にあわせたつもりなのですが、 サイズ変更で左側のエディットがスクロールバーの幅の分だけ 縮小されてしまいます。 どこをどのように直したらよろしいのでしょうか? 宜しくお願いします。 #Win98 & VC++6.0 & SDK で作成しています。
- ベストアンサー
- C・C++・C#
- エディットボックス内でキー押されたときのメッセージ
VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch( message ) { case WM_CREATE: //エディットボックスを作成 CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","", WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, 0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL ); break; case WM_COMMAND: //エディットボックス内の変更はEN_CHANGEで受け取れるが、 //キーコードは送られてこない break; } }
- 締切済み
- C・C++・C#
- BCC5.5とBCCFormを使用し、実行ファイルを作成したが、実行できません。
当方、只今C言語でWin32APIを呼び出し、Windowsアプリを開発中です。 そこで質問なのですが、以下の手順で作業した場合、抽出される実行ファイルが実行できません。 どなたかお分かりになる方、助言の方よろしくお願いします。 1.名前、住所をリッチテキストに入力し、OKボタンを押下後、メッセージボックス にて”○○さんの住所は○○です”と表示されるソースコードを"bcc32 -W source.cpp"でコンパイル。 2.BCCFormで作成したリソースファイルを"brc32 dialog.rc source.exe"で結合。 3.source.exeを実行するが、動作しない。 ちなみに環境はWindowsXPSP3です。 下記にまず、ソースコードを表示します。 /* ソース */ /* ファイル名 source.cpp */ #if 1 /* ダイアログボックスを出す */ #include <windows.h> #include "Resdialog.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc); return 0; } BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: switch (LOWORD(wp)){ case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: GetDlgItemText(hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1)); GetDlgItemText(hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2)); wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2); MessageBox(hDlg, szBuf, "ダイアログボックス", MB_OK); return TRUE; } return FALSE; } return FALSE; } #endif そして、リソーススクリプトです。 /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "名前", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 46, 18 CONTROL "住所", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 41, 47, 17 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 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 49, 85, 61, 18 CONTROL "Cancell", IDCANCELL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 84, 56, 18 } そして、リソースヘッダです。 /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 #define IDCANCELL 105 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ 上記のようになってます。 どうかご教授の方、宜しくお願いします。
- ベストアンサー
- C・C++・C#
- BCC5.5でコンパイル、BCCFormで作成した実行ファイルが実行できません。
当方、只今C言語でWin32APIを呼び出し、Windowsアプリを開発中です。 そこで質問なのですが、以下の手順で作業した場合、抽出される実行ファイルが実行できません。 どなたかお分かりになる方、助言の方よろしくお願いします。 1.名前、住所をリッチテキストに入力し、OKボタンを押下後、メッセージボックス にて”○○さんの住所は○○です”と表示されるソースコードを"bcc32 -W source.cpp"でコンパイル。 2.BCCFormで作成したリソースファイルを"brc32 dialog.rc source.exe"で結合。 3.source.exeを実行するが、動作しない。 ちなみに環境はWindowsXPSP3です。 下記にまず、ソースコードを表示します。 /* ソース */ /* ファイル名 source.cpp */ #if 1 /* ダイアログボックスを出す */ #include <windows.h> #include "Resdialog.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc); return 0; } BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: switch (LOWORD(wp)){ case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: GetDlgItemText(hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1)); GetDlgItemText(hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2)); wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2); MessageBox(hDlg, szBuf, "ダイアログボックス", MB_OK); return TRUE; } return FALSE; } return FALSE; } #endif そして、リソーススクリプトです。 /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "名前", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 46, 18 CONTROL "住所", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 41, 47, 17 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 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 49, 85, 61, 18 CONTROL "Cancell", IDCANCELL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 84, 56, 18 } そして、リソースヘッダです。 /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 #define IDCANCELL 105 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //--------------------
- 締切済み
- C・C++・C#
- VC++2005でのリソースコンパイルエラーについて
よろしくお願いします。 猫でもわかる…… を参考にしながら、C言語でスクリーンセイバーを作成しています。 BCCForm and Skelton で作成したリソースをVC++2005で利用してます。 『設定のためのダイアログボックスを表示しないスクリーンセイバー』 はうまく行ったのですが、 『設定用ダイアログボックスを表示させるプログラム』 ではエラーが出てしまいます。 WS_EX_DLGMODALFRAME この部分が良くないらしいのですが、コメントアウトしてみたり、 削除してみたり、記述を変えたりしたのですが、うまくコンパイルしてくれません。 詳しい方、アドバイスをお願いします。 //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resscreensav.h" //---------------------------------- // ダイアログ (DLG_SCRNSAVECONFIGURE) //---------------------------------- DLG_SCRNSAVECONFIGURE DIALOG DISCARDABLE 0, 0, 270, 180 EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_APPWINDOW STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX CAPTION "設定" FONT 8, "MS 明朝" { CONTROL "表示間隔", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 24, 18, 63, 15 CONTROL "表示文字列", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 24, 54, 63, 15 CONTROL "表示回数", IDC_STATIC, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 27, 93, 63, 15 CONTROL "", IDC_EDIT1, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 102, 18, 102, 15 CONTROL "", IDC_EDIT2, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 102, 51, 102, 15 CONTROL "", IDC_EDIT3, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT, 105, 90, 102, 15 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 18, 144, 69, 15 CONTROL "キャンセル", IDCANCEL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 144, 69, 15 } //-------------------------- // イメージ(MYBMP) //-------------------------- MYBMP BITMAP DISCARDABLE "C:\My Pictures\scan1\scan5.bmp" //-------------------------- // イメージ(ID_APP) //-------------------------- ID_APP DISCARDABLE "icon1.ico" //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ DLG_SCRNSAVECONFIGURE #define IDC_STATIC 100 #define IDC_EDIT1 103 #define IDC_EDIT2 104 #define IDC_EDIT3 105 #define DLG_SCRNSAVECONFIGURE 2003 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //#define MYBMP 200 //#define ID_APP 100 //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リソースをコンパイルしています... ..\..\..\..\Bitmap\screensav\screensav.rc(12) : error RC2104 : undefined keyword or key name: WS_EX_DLGMODALFRAME ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
- ベストアンサー
- C・C++・C#
- Win32APIでのエディットボックスの文字化け
Win32APIでウィンドウズプログラムを組んでいます。 以下のコードで、エディットボックスへの文字列表示が文字化けします。 <エディットボックスの作成> hWndEdit = CreateWindowEx( WS_EX_CLIENTEDGE, _T("EDIT"), NULL, ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD, (int)(WINDOW_W * 0.01), 30, (int)(WINDOW_W * 0.8), (clientRect.bottom-clientRect.top) - 35, hWndMain, (HMENU)IDC_EDITLOG, hInstance, NULL ); <フォントの設定> HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage( hWndEdit, WM_SETFONT, (WPARAM)hFont, TRUE ); <出力文字列の設定> std::ostringstream stream; stream << "************ Start TEST ************\n"; std::string strOut = stream.str(); <出力> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) ); デバッガでの、strOutは、文字化けせずに表示されます。(strOut[0] が、'*'となっている) どこか確認したらよい場所をアドバイスいただけますか?
- ベストアンサー
- C・C++・C#
- エディットの複数行化が反映されない
VC++2008 MFCで開発を行っています。 ダイアログに、マルチラインでなくかつ改行を受け付けないエディットを配置しています。 このエディットのエディットスタイルを条件に合わせてマルチライン、改行受付にしたいのですが、 反映されません。実現方法のご教示をお願い致します。 現状の私は以下のコードを、OnInitDialog()内に書いています。 SetWindowLong(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), GWL_STYLE, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE); ちなみにWS_VISIBLEやWS_CHILD の有り無しは反映されます。 反映されないというのは、入力中にエンターキーを押した直後にダイアログが閉じられることから判断しています。
- ベストアンサー
- C・C++・C#
- ダイアログ内の文字列取得
開発環境 Xp Home Edtion Microsoft Visual C++ 2008 Express Edition ダイアログのテキストボックスに入力された文字列を取得し、それをデバッグに表示するプログラムを作ろうとしています。 ですが、デバッグに表示されないのです。どのようにしたら良いでしょうか? リソースファイル IDM_SETTING DIALOG DISCARDABLE 0, 0, 154, 115 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 16 , "MS Shell Dlg" STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU CAPTION "設定画面" BEGIN EDITTEXT IDC_XS,35,15,40,14,ES_AUTOHSCROLL PUSHBUTTON "OK", IDOK,10,0,50,14,WS_GROUP END cppファイル HWND hnd; LPTSTR Lptdtr10; LPCSTR dsLPCSTR10; Lptdtr10 = (char*)malloc(32768); GetDlgItemText(hnd, IDC_XS , Lptdtr10, sizeof(Lptdtr10)); dsLPCSTR10 = (LPCSTR) Lptdtr10; char *ree; ree=(char*)dsLPCSTR10; String^ data=gcnew String(ree); System::Diagnostics::Debug::WriteLine(data); //ここで表示する
- ベストアンサー
- アンケート
- メインダイアログのデータをウィンドウに反映させたい
メインダイアログからウィンドウを生成しています ダイアログの値を GetDlgItemText()関数で取るまではいいのですが それから、値をウィンドウに反映できません。 メンバ値を遣うと思うのですが、どうすればいいのでしょうか? プログラムを添付します ///////////////////////////////////////////////////////// // dlg.rc #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYDLG DIALOG DISCARDABLE 0, 0, 134, 80 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ダイアログからウィンドウ" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,15,55,50,14 PUSHBUTTON "キャンセル",IDCANCEL,65,55,50,14 EDITTEXT IDC_EDIT1,15,10,100,35,ES_AUTOHSCROLL END ////////////////////////////////////////////////// // resource.h #define IDC_EDIT1 1000 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif //////////////////////////////////////////////////////// // dlg.h //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //ウィンドウ class CMyWindow : public CFrameWnd { private: CString MyMainStr; protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; //メインダイアログ class CMyDlg : public CDialog { public: CString m_MyStr; CMyDlg(CWnd *pParentWnd=NULL); CMyWindow* m_pMyWnd; protected: virtual void OnOK(); virtual void OnCancel(); }; ///////////////////////////////////////////// // DlgWnd.cpp #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/):m_pMyWnd(NULL) //イニシャライザでポインタをNULLに初期化 { Create("MYDLG"); } BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() void CMyDlg::OnOK() { GetDlgItemText(IDC_EDIT1, m_MyStr); const RECT rc = {10, 10, 320, 240}; m_pMyWnd = new CMyWindow(); m_pMyWnd->Create( NULL, "ダイアログから起動", WS_OVERLAPPEDWINDOW, rc, this,NULL); m_pMyWnd->ShowWindow(SW_SHOW); } void CMyDlg::OnCancel() { DestroyWindow(); } void CMyWindow::OnPaint() { CPaintDC dc(this); CMyDlg dlg; MyMainStr = dlg.m_MyStr; dc.TextOut(0, 0, MyMainStr); } よろしく御願いします
- ベストアンサー
- C・C++・C#
補足
Stalin28です。 FarEyesさん、今回の指摘でも状況は変わらないと#4を補足する予定だったのですが、状況が変わりました。まさに5時21分の回答で指摘してくれた、リソースファイルにインクルードしていなかったことが原因のようです。ソースファイルの物をコピペしたらコンパイルでき、実行できました。 今回の相談について、Wr5さんともどもお二人の努力には感謝するしかありません。特にエラーの可能性を次々に指摘してくれた姿勢に、結果的にほとんどが関係ないことだったとはいえ、私自身のプログラミング力を高める礎になりそうです。 今回は小分けした以外はテキスト通りに打ったことを相談する前に何度も確かめているため、お二人のご尽力がなければ問題を解決できませんでした。また「猫でも」が万能でないことも解り、教則本に対してもメディアリテラシーを発揮しなければならないと気付いた今回の出来事でした。もっとも本の方の「猫でもわかるWindows」は第14章で終わりなので、サイトの「猫でもわかる」で勉強する予定ではありますが。 最後にもう一度、Wr5さんとFarEyesさん、私の相談に解決まで導いていただき、本当に有難うございました。