よろしくお願いします。
猫でもわかる…… を参考にしながら、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)
//--------------------------
MYBMPBITMAPDISCARDABLE"C:\My Pictures\scan1\scan5.bmp"
//--------------------------
// イメージ(ID_APP)
//--------------------------
ID_APPDISCARDABLE"icon1.ico"
//-----------------------------------------
// BCCForm Ver 2.41
// Header File for Resource Script File
// Copyright (c) February 2002 by ysama
//-----------------------------------------
//---------------------
// ダイアログリソース
//---------------------
// ダイアログ DLG_SCRNSAVECONFIGURE
#defineIDC_STATIC100
#defineIDC_EDIT1103
#defineIDC_EDIT2104
#defineIDC_EDIT3105
#defineDLG_SCRNSAVECONFIGURE 2003
//---------------------
// メニューリソース
//---------------------
//---------------------
// イメージリソース
//---------------------
//#defineMYBMP200
//#defineID_APP100
//---------------------
// ストリングテーブル
//---------------------
//--------------------
// アクセラレーター
//--------------------
//------------------
// ヴァージョン情報
//------------------
------ ビルド開始: プロジェクト: 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 スキップ ==========
No.4ベストアンサー
- 回答日時:
たぶん インクリメンタルリンクまたはインクリメンタルコンパイルが悪さをしているのでしょう
インクリメンタルリンクやインクリメンタルコンパイルは変更箇所のみに対して コンパイルやリンクを行う機能です
これにより コンパイル時間やリンク時間の短縮を図っています
しかし 何かの原因で ファイルのタイムスタンプなどが狂ってしまうとこれがうまく機能しなくなります
他から持ってきたソースの場合タイムゾーンの指定などが無いなど環境依存の設定から変な動作になる場合がありますよ
そのような場合 リビルドやクリアなどをして コンパイル・リンクを最初からやり直すとうまくいく場合があります
貴重なアドバイス有難うございます。
コンパイル一つにしても、色々なことがあるのですね。とても参考になりました。
これからは、今までのアドバイスを参考にしたいと思います。
本当に有難うございました。
これで閉め切らさせていただきます。
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の総合環境を使うときには気をつけて下さい。
貴重なアドバイス有難うございます。
コンパイル一つにも、色々なことが起こることがわかりました。
これからは、アドバイスしていただいたことを参考にして、コンパイルをしてみたいと思います。
本当に有難うございました。
これで閉め切らさせていただきます。
No.3
- 回答日時:
ダイアログつきのプロジェクト(ソリューション)を読み込み
表示 > オブジェクトブラウザ で表示されるウィンドウの
左ペインで 作成中のプロジェクトを探し クリックします
右側が変化します
これで このプロジェクトで作成されている関数や使われている変数などを表示することが出来ます
同じ要領で ダイアログなしのプロジェクトも確認します
どこかに違いがありませんか?
当然 ダイアログ関連の違いは無視するとしてですが …
御礼が遅くなってしまい、すみません。
アドバイスのとおり、関数や、変数を調べてみましたが、以上はありませんでした。そこで、最初のアドバイスを思い出し、
#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さんの回答をいただいた後に、締め切りたいと思います。
No.2
- 回答日時:
★アドバイス
・エラーメッセージの意味は scrnsave.c ソースに
(1)ScreenSaverProc
(2)ScreenSaverConfigureDialog
(3)RegisterDialogClasses
が存在しないようです。
今度はソースファイルを補足に貼り付けてみて下さい。
リソースは問題ないと思います。
・以上。補足要求です。
この回答への補足
アドバイス有難うございます。
今、エラーメッセージについて色々調べているところです、何かお気づきの所がありましたら、よろしくお願いします。
//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);
}
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);
もう少しあるのですが、貼り付けられませんでした
No.1
- 回答日時:
#include "windows.h" を #include "Resscreensav.h"の後ろに挿入してみてください
拡張Windowスタイルの定義などWindowsの定義ファイルを読み込んでいないのが原因ではないかと思います
この回答への補足
アドバイス有難うございます。
ご指摘のとおり、 #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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<math.h>があるのにsqrtが・...
-
C言語でヘッダファイルにグロー...
-
ILSpyで、デコンパイルできない。
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
スタティックライブラリファイ...
-
VBAを何回も作り直して、容量が...
-
C++Builder XE とOpenCV
-
うまくコンパイルできません
-
1 つ以上の複数回定義されてい...
-
OBJファイルが開けません
-
” OS ビルド ” の意味が分か...
-
戻り値について
-
[c++] <pthread.h>がinclude で...
-
gdbで無名名前空間の関数にブレ...
-
pyc 編集 閲覧
-
C言語でmからnまでの合計を求め...
-
VC++2005でのリソースコンパイ...
-
【VC++6.0(MFC)】警告「LINK : ...
-
windowsでLinuxで作成したソー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
Makefile作成時の拡張子.oとは?
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
ILSpyで、デコンパイルできない。
-
” OS ビルド ” の意味が分か...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
C++コンパイル時に『 C1083: in...
-
マクロ コンパイルがグレーバック
-
[c++] <pthread.h>がinclude で...
-
コンパイルエラー:ユーザ定義...
-
ビルドとリビルドの違いを教え...
-
クリティカルエラー Expressio...
-
sys/types.hの必要性について
-
【VC++6.0(MFC)】警告「LINK : ...
-
PRO*C コンパイルエラー
おすすめ情報