• ベストアンサー

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 スキップ ==========

noname#220054
noname#220054

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

たぶん インクリメンタルリンクまたはインクリメンタルコンパイルが悪さをしているのでしょう インクリメンタルリンクやインクリメンタルコンパイルは変更箇所のみに対して コンパイルやリンクを行う機能です これにより コンパイル時間やリンク時間の短縮を図っています しかし 何かの原因で ファイルのタイムスタンプなどが狂ってしまうとこれがうまく機能しなくなります 他から持ってきたソースの場合タイムゾーンの指定などが無いなど環境依存の設定から変な動作になる場合がありますよ そのような場合 リビルドやクリアなどをして コンパイル・リンクを最初からやり直すとうまくいく場合があります

noname#220054
質問者

お礼

貴重なアドバイス有難うございます。 コンパイル一つにしても、色々なことがあるのですね。とても参考になりました。 これからは、今までのアドバイスを参考にしたいと思います。 本当に有難うございました。 これで閉め切らさせていただきます。

その他の回答 (4)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★もう回答がありますね。 ・『exe』ファイルを削除しても『*.obj』ファイルやリソース『*.res』ファイルがあると  『exe』ファイルが直ぐに作られることがあります。でもリソースファイルを編集していて  IDが変わっているとこの『exe』は正しく実行もされません。そこで再コンパイルするとき  私の場合は明示的に『*.exe』『*.obj』『*.res』『BuildLog.htm』などを削除してから  コンパイルします。 ・今回はリソースファイルを編集した後にソースファイルをコンパイルしないでリンクだけ  行う処理が起こったと思います。本当ならリソースファイルのタイムスタンプを元に  ソースファイルも再コンパイルされないといけなかったのかもしれません。 ・今はVC++2005の総合環境を使っていますが、前は BCC のコンパイラをフリーソフトの  総合環境と組み合わせて使っていたのでしょうね。この場合はリソースもVC++2005に  合わせた内容に変更すべきです。変更方法はVC++2005で新規プロジェクトを作成して  新しくリソースファイルを作成させます。その後にリソースファイル『*.rc』を  エディタで開いて BCC で使っていたリソースで重要な部分をVC++2005で自動的に  作成されたリソースファイル『*.rc』に移し変えれば良いでしょう。  特に最初この質問を読んだときリソースファイルに『#include <windows.h>』がない。  だからフリーの総合環境を使って作られたリソースだと思いました。でもフリーの  総合環境は使ったことがなかったのでアドバイスしなかったのです。  その後に回答者 No.1 さんがアドバイスしてリソースはコンパイルできたようですね。  でも『*.obj』ファイルが正しくなかったのでしょうね。  リンク時に未解決エラーになったようです。 ・以上。これからVC++2005の総合環境を使うときには気をつけて下さい。

noname#220054
質問者

お礼

貴重なアドバイス有難うございます。 コンパイル一つにも、色々なことが起こることがわかりました。 これからは、アドバイスしていただいたことを参考にして、コンパイルをしてみたいと思います。 本当に有難うございました。 これで閉め切らさせていただきます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ダイアログつきのプロジェクト(ソリューション)を読み込み 表示 > オブジェクトブラウザ で表示されるウィンドウの 左ペインで 作成中のプロジェクトを探し クリックします 右側が変化します これで このプロジェクトで作成されている関数や使われている変数などを表示することが出来ます 同じ要領で ダイアログなしのプロジェクトも確認します どこかに違いがありませんか? 当然 ダイアログ関連の違いは無視するとしてですが …

noname#220054
質問者

お礼

御礼が遅くなってしまい、すみません。 アドバイスのとおり、関数や、変数を調べてみましたが、以上はありませんでした。そこで、最初のアドバイスを思い出し、 #include "Resscreensav.h" #include <windows.h> #include <scrnsave.h> #include <windowsx.h> と、追加してみました。 ビルドの結果は 『screensav - エラー 0、警告 5 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ』 で、警告が5個ありましたが、成功しました。 不思議なのですが、このとき作られた『screensav.exe』ファイルを削除した後、もう一度ビルドをしてみました。 ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リンクしています... コード生成しています。 コード生成が終了しました。 マニフェストを埋め込んでいます... ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 0、警告 0 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== 今度は、エラーも、警告もなくなってしまいました。 原因はよく分からないのですが、『BCC用のリソースエディタ』で作ったりソースを、VC++で使うと、『相性』の関係でこのようなことが起こるのかもしれないと思っています。 結果、今は正常に動いています。 アドバイス有難うございました。 それから、Oh-Orangeさんの回答をいただいた後に、締め切りたいと思います。

noname#220054
質問者

補足

度々のアドバイス有難うございます。 早速試してみたいと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・エラーメッセージの意味は scrnsave.c ソースに  (1)ScreenSaverProc  (2)ScreenSaverConfigureDialog  (3)RegisterDialogClasses  が存在しないようです。  今度はソースファイルを補足に貼り付けてみて下さい。  リソースは問題ないと思います。 ・以上。補足要求です。

noname#220054
質問者

お礼

BOOL WINAPI ScreenSaverConfigureDialog( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hSpeed, hText, hNo; char szBuf[64]; DWORD dwResult, dwType, dwSize; switch (msg){ case WM_INITDIALOG: hSpeed = GetDlgItem(hDlg, IDC_EDIT1); //設定ダイアログの初期化 hText = GetDlgItem(hDlg, IDC_EDIT2); hNo = GetDlgItem(hDlg, IDC_EDIT3); RegCreateKeyEx(HKEY_CURRENT_USER, "Control Panel\\Screen Saver.screensv02", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hMyKey, &dwResult); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "Speed", NULL, &dwType, (LPBYTE)&nSpeed, &dwSize); dwSize = (DWORD)sizeof(szText); RegQueryValueEx(hMyKey, "Text", NULL, &dwType, (LPBYTE)szText, &dwSize); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "No", NULL, &dwType, (LPBYTE)&nNo, &dwSize); Edit_SetText(hText, szText); itoa(nSpeed, szBuf, 10); Edit_SetText(hSpeed, szBuf); itoa(nNo, szBuf, 10); Edit_SetText(hNo, szBuf); if(RegCloseKey(hMyKey) != ERROR_SUCCESS) MessageBox(hDlg, "RegCloseKeyに失敗しました", "ERROR", MB_OK); break; case WM_COMMAND: switch(LOWORD(wParam)){ case IDOK: Edit_GetText( hSpeed, szBuf, (int)sizeof(szBuf) - 1); nSpeed = atoi(szBuf); Edit_GetText( hText, szText, (int)sizeof(szText) - 1); Edit_GetText( hNo, szBuf, (int)sizeof(szBuf) - 1); nNo = atoi(szBuf); もう少しあるのですが、貼り付けられませんでした

noname#220054
質問者

補足

アドバイス有難うございます。 今、エラーメッセージについて色々調べているところです、何かお気づきの所がありましたら、よろしくお願いします。 //screensav02.cpp   レジストリに設定する #include <windows.h> #include "Resscreensav.h" #include <scrnsave.h> #include <windowsx.h> #define ID_TIMER 100 HKEY hMyKey; UINT nSpeed, nNo; char szText[64]; LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc, hdc_mem; int x, y, r, g, b, w, h; int nTextw, nTexth; static n; static RECT rc; HFONT hFont; SIZE s; HBITMAP hBmp; BITMAP bmp; DWORD dwResult, dwSize, dwType; switch(msg){ case WM_CREATE: //レジストリの調査 RegCreateKeyEx(HKEY_CURRENT_USER, "Control Panel\\Screen Saver.screensv02", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, &hMyKey, &dwResult); if(dwResult == REG_CREATED_NEW_KEY){ nSpeed = 300; RegSetValueEx(hMyKey, "Speed", 0, REG_DWORD, (LPBYTE)&nSpeed, sizeof(DWORD)); strcpy(szText, "設定スクリーンセーバー"); RegSetValueEx(hMyKey, "Text", 0, REG_SZ, (LPBYTE)szText, (DWORD)strlen(szText) + 1); nNo = 20; RegSetValueEx(hMyKey, "No", 0, REG_DWORD, (LPBYTE) &nNo, (DWORD)sizeof(DWORD)); }else{ dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "Speed", NULL, &dwType, (LPBYTE)&nSpeed, &dwSize); dwSize = sizeof(szText); RegQueryValueEx(hMyKey, "Text", NULL, &dwType, (LPBYTE)szText, &dwSize); dwSize = (DWORD)sizeof(DWORD); RegQueryValueEx(hMyKey, "No", NULL, &dwType, (LPBYTE)&nNo, &dwSize); } if(RegCloseKey(hMyKey) != ERROR_SUCCESS) MessageBox(hWnd, "RegClosekeyに失敗しました", "Error", MB_OK); SetTimer(hWnd, ID_TIMER, nSpeed, NULL); GetClientRect(hWnd, &rc); break; case WM_TIMER: if(wParam != ID_TIMER) break; hdc = GetDC(hWnd); hFont = CreateFont(24, //デバイスコンテキストハンドルの取得とフォントの作成 0, //文字幅 0, //テキストの角度 0,//ベースラインとx軸の角度 FW_REGULAR,//フォントの重さ(太さ) FALSE,//イタリック体 FALSE,//アンダーライン FALSE,//打消し線 SHIFTJIS_CHARSET,//文字セット OUT_DEFAULT_PRECIS,//出力精度 CLIP_DEFAULT_PRECIS,//クリッピング精度 PROOF_QUALITY,//出力品質 FIXED_PITCH | FF_MODERN,//ピッチとファミリ "MS ゴシック"); SelectObject(hdc, hFont); GetTextExtentPoint32(hdc, szText,(int)strlen(szText), &s); nTextw = s.cx; nTexth = s.cy; hBmp = LoadBitmap(hMainInstance, "MYBMP"); // hMainInstanceこれ何? 調べる GetObject(hBmp, (int)sizeof(BITMAP), &bmp); w = bmp.bmWidth; h = bmp.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); x = (rand() % rc.right) - (nTextw + w) / 2; y = rand() % rc.bottom; r = rand() % 256; g = rand() % 256; b = rand() % 256; BitBlt(hdc, x, y, w, h, hdc_mem, 0, 0, SRCCOPY); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(r, g, b)); TextOut(hdc, x + w, y + (h - nTexth) / 2, szText, (int)strlen(szText)); n++; if(n > (int)nNo){ n = 0; PatBlt(hdc, 0, 0, rc.right, rc.bottom, WHITENESS); //BLACKNESSから変更してみた } DeleteObject(hBmp); DeleteDC(hdc_mem); DeleteObject(hFont); ReleaseDC(hWnd, hdc); break; case WM_DESTROY: KillTimer(hWnd, ID_TIMER); PostQuitMessage(0); break; default: break; } return DefScreenSaverProc(hWnd, msg, wParam, lParam); }

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

#include "windows.h" を #include "Resscreensav.h"の後ろに挿入してみてください 拡張Windowスタイルの定義などWindowsの定義ファイルを読み込んでいないのが原因ではないかと思います

noname#220054
質問者

補足

アドバイス有難うございます。 ご指摘のとおり、 #include "windows.h" を追加したところ、前回のようなエラーはでなくなったのですが、今度は次のようなエラーが出るようになりました。 #include <windows.h> 等、 色々試しているのですが今の所成功していません。 何かお気づきでしたら、アドバイスをお願いします。 ------ ビルド開始: プロジェクト: screensav, 構成: Release Win32 ------ リンクしています... ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です。 ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverConfigureDialog@16" は未解決です。 ScrnSave.Lib(scrnsave.obj) : error LNK2001: 外部シンボル "_RegisterDialogClasses@4" は未解決です。 C:\Visual Studio 2005\Projects\screensav\Release\screensav.exe : fatal error LNK1120: 外部参照 3 が未解決です。 ビルドログは "file://c:\Visual Studio 2005\Projects\screensav\screensav\Release\BuildLog.htm" に保存されました。 screensav - エラー 4、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

関連するQ&A

  • 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 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //--------------------

  • 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 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ 上記のようになってます。 どうかご教授の方、宜しくお願いします。

  • 親ウィンドウの領域外でも表示されるエディットボックスについて

    親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。

  • エディットの複数行化が反映されない

    VC++2008 MFCで開発を行っています。 ダイアログに、マルチラインでなくかつ改行を受け付けないエディットを配置しています。 このエディットのエディットスタイルを条件に合わせてマルチライン、改行受付にしたいのですが、 反映されません。実現方法のご教示をお願い致します。 現状の私は以下のコードを、OnInitDialog()内に書いています。 SetWindowLong(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), GWL_STYLE, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE); ちなみにWS_VISIBLEやWS_CHILD の有り無しは反映されます。 反映されないというのは、入力中にエンターキーを押した直後にダイアログが閉じられることから判断しています。

  • VS2008でEDIT今トーロールがつくれない

    VCを学習中です。 書籍の内容をVS2008(VC)で、EDITコントロールを実装使用しますができなくて 困っています。 内容は、 1 VS2008の機能でスケルトンを作成  (メニュー画面とaboutが表示されるものです。MFCとATLは使用していません。) 2 WM_CREATEをWndProcに作成し、CreateWindowを記述 3 実行するとEditコントロールの中にEditコントロールができて、Editコントロールとしては 機能しません。 どなたか、この謎と解決策を教えてください。 ソースの一部分を掲載します。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HWND hwndEdit; switch (message) { case WM_CREATE: hwndEdit = CreateWindow(TEXT("edit"),L"abcdefghijkl", WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL |WS_BORDER|ES_LEFT|ES_MULTILINE |ES_AUTOHSCROLL|ES_AUTOVSCROLL, 100,100,500,500, hWnd, (HMENU)ID_EDIT, ((LPCREATESTRUCT)lParam)->hInstance,NULL); return 0; case WM_SETFOCUS:

  • リソースのコントロールについて

    プログラム初心者です。 よろしくお願いします! 現在私は、visualstudio6.0のソフトで、リソース機能を持ちいてある機能の実現に向けてプログラムを書いています。 そこで質問なのですが、 たとえばリソース機能を用いてダイアログボックスにエディットボックスを20つ設けますと、それぞれIDC_EDIT1~IDC_EDIT20と計20個IDができますよね? その20個を私の書いているソースの中にそれぞれ違う値をいれたいので、 イメージでは for(i=1;i<21;i++){ IDC_EDIT[i] } というようにしたいのですが、IDC_EDIT[i]ではやはりコンパイルエラーが出てしまいます。ソースをずらずら長く書けばできないこともないのですが、大変な量になるので簡単にできないだろうかと検討中です。 この場合、ソースをコンパクトにすることは可能でしょうか?ご教授よろしくお願い致します。

  • 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 で作成しています。

  • Tabでのフォーカス(win32)

    edit = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_NUMBER | ES_LEFT , 0 , 0 , 35 , 18 , hWnd , (HMENU)1 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL ); でエディットコントロールを作成しました。 フォーカスがエディットコントロールにある時、TABキーで フォーカスをなくしたいのですが、どうしたらよいでしょうか? デバッガーで追ってみると、WM_KEYDOWNがウィンドウに送られていませんでした。

  • リッチエディットのやり方が解りません

    リッチエディットのやり方が解りません  相談するのは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をリンクしてエラーを出しておりました。

  • エディットボックス内でキー押されたときのメッセージ

    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;  } }

専門家に質問してみよう