解決済みの質問
よろしくお願いします。
windowsのプログラミングを、『猫でもわかるwindowsプログラミング弟2版』と言う本を参考にしながら、C言語で作っています。
2ヶ月ほどがんばってみたのですがどうしてもうまく行きません。
手順です、
1、空のウィンドウを作りメニューバーを作成。
2、メニューに『ファイルと、オプションタブを作る』
3、オプションタブに、ダイアログボックスを『開くと、閉じる』タブ
を作る。
4、『開く』タブをクリックすると、名前を入力するためのダイアログ ボックスを開く。
と言うプログラムなのですが、作成されたウィンドウから⇒オプションタブ⇒開くをクリックしても、ダイアログボックスが表示されません。
リソースファイルや、ヘッダファイルを開いて、参考にしている本と比べてみたのですが、ほとんど変わっていません。自分では原因が発見できないのですが、詳しい方、ご指摘をお願いします。
5、気になる所では、ソース中で、ウィンドウプロシージャの記述で、
else文に{}が無いので、そこをいじってみたのですが、うまく行きま せんでした。
case WM_PAINT: //描画処理
if(strcmp(szName, "")==0)
strcpy(szBuf, "まだ名前の入力はありません");
else
wsprintf(szBuf, "入力された名前は%sさんです",
szName);
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, szBuf, (int)strlen(szBuf));
EndPaint(hWnd, &ps);
break;
ご指導よろしくお願いします。
投稿日時 - 2007-08-13 15:38:49
★本当に文字列ですか?
・『MYDIALOG』も『MYMENU』も『MYACCEL』も記号定数ですけど。
文字列の意味が分かっていない気がします。
リソースの
>MYDIALOG DIALOG DISCARDABLE 0, 0, 270, 180
>MYMENU MENU DISCARDABLE
>MYACCEL ACCELERATORS DISCARDABLE
↑
この3つは記号定数で ID を指定しています。
もし文字列なら
"MYDIALOG" DIALOG DISCARDABLE 0, 0, 270, 180
"MYMENU" MENU DISCARDABLE
"MYACCEL" ACCELERATORS DISCARDABLE
とするか "Resmenu.h" ファイルで
#define MYDIALOG "MYDIALOG"
#define MYMENU "MYMENU"
#define MYACCEL "MYACCEL"
となっていないといけない。
でもそのような定義していない気がします。ここ確認。
・今回は ID を記号定数の MYDIALOG、MYMENU、MYACCEL で指定しています。きっと。多分。
だからソースにも記号定数で指定しないとダイアログ、メニュー、アクセラレータの全てが
正しく識別されません。→表示されない。など。
・よって次のように修正して再コンパイルして下さい。
(1)WinMain() 関数内にある
修正前⇒hAccel = LoadAccelerators( hCurInst, "MYACCEL" );
修正後⇒hAccel = LoadAccelerators( hCurInst, MAKEINTRESOURCE(MYACCEL) );
(2)InitApp() 関数内にある
修正前⇒wc.lpszMenuName = "MYMENU"; //メニュー名 ウィンドウクラスにメニュー名を登録
修正後⇒wc.lpszMenuName = MAKEINTRESOURCE(MYMENU); //メニュー名 ウィンドウクラスにメニュー名を登録
(3)WndProc() 関数内にある
修正前⇒hDlg = CreateDialog( hInst, "MYDLG", hWnd, (DLGPROC)MyDlgProc );
修正後⇒hDlg = CreateDialog( hInst, MAKEINTRESOURCE(MYDLG), hWnd, (DLGPROC)MyDlgProc );
上記の3つを修正して下さい。
・ちなみに MAKEINTRESOURCE() マクロは記号定数を文字列ポインタに変換するマクロです。
これを使って下さい。
・以上。結果報告を待っています。
投稿日時 - 2007-08-14 16:33:48
補足
結果報告が後れて済みませんでした。
ご指摘の箇所を編集しなおしてMAKEしてみたのですが、エラーが出てしまいました。
『BCCでの文字列の指定のしかた』を改めて確認したところ、ダブルクォーティーションはつけなくても良いことが確認できました。
そこで、リソースエディタでの、ダイアログの部分をよく確認した所、設定ミスがあるのを見つけることが出来ました。
いろいろとアドバイスをしていただいたおかげで、『よく確認する』と言うことが大事なことが分かりました。
(確認のポイントがまだ未熟でした。)
ただ、まだ問題が残っています。
ダイアログボックスが表示されたのはいいのですが、
1、『OK』ボタンを押しても、ダイアログボックスが閉じない。
2、『キャンセル』ボタンを押した後で、『終了』ボタンを押して終了しても、入力した文字が表示される。
3、メニューのオプションにある『ダイアログを閉じる』が、グレーダ ウンしたままで、変化しない。等が残っていますが、サンプルを確 認しながら、修正してみます。どうしても原因が分からない時は、 改めて質問しますので見かけましたら、アドバイスをお願いします。
いつも、多くのアドバイス、ご指摘有難うございます。
こちらが、MAKEINTRESOURCE() マクロを使ってMAKEした結果です。
> D:\borland\bcc55\Bin\make.exe -fRelease\menu.mak -B TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -O2 -w- -AT -pc -H- -k -b -nRelease -c D:\menu\menu\daialog.txt.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
D:\menu\menu\daialog.txt.cpp:
brc32 -r -foRelease\menu.res D:\menu\menu\menu.rc
Borland Resource Compiler Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.
Error menu.rc 11 43: Bad character in source input
** error 20018 ** deleting Release\menu.res //エラーの意味はまだ分かりません。
Make End !! (Elapsed time 0:00.797)
投稿日時 - 2007-08-15 22:34:58
お礼
たくさんのアドバイス、有難うございました。
まだ問題は残っていますが、取りあえず、ダイアログボックスが表示できるようになりました。
残っている問題点を、今までのアドバイス、ご指摘と照らし合わせてみます。
力不足のため、どうしても一人で解決できない時は、改めて質問したいと思います。
見かけましたら、アドバイス、ご指導をお願いします。
投稿日時 - 2007-08-17 20:09:18
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(7件中 6~7件目)
サイト「猫でもわかるプログラミング」のページで同じところはありますでしょうか?
http://www.kumei.ne.jp/c_lang/
質問の内容とこのサイトの内容で同じ所があれば教えてください。今の説明のままだと良く分かりません。
投稿日時 - 2007-08-13 17:00:15
補足
回答有難うございます。
『BCCでプログラムを作ろう』の第8章に、『猫でもわかるプログラミング第2版』では、第10章を少し加えてあります。
1、メニューバーに、ファイル、オプションタブ、が表示
2、オプションタブには、『ダイアログを開く、と ダイアログを閉じる』タブがあリ、それぞれにアクセラレータキー、F5と、F6がつきます。
1、ファイルを開くから、ダイアログが表示され、エディットコントロールに、名前を入力するようになっています。
2、プッシュボタンは、OK,クリア、閉じる の3つがあり、名前を入力してから、OKを押すと、『○○さんですね』と確認して終了します。
3、makeして出来たウィンドウでは、画面に『まだ名前の入力がありません』と表示されていて、ダイアログを開くタブで、ダイアログが表示されるのですが、ここの所がうまく行きません。
お手数をおかけしますが、よろしくお願いします。
投稿日時 - 2007-08-13 18:39:56
お礼
回答有難うございます。
まだ問題は残っていますが、取りあえずダイアログボックスの表示は、
できるようになりました。
残っている問題が解決できない時には、改めて質問をします、もし見かけましたらアドバイスをお願いします。
投稿日時 - 2007-08-17 19:58:36
描画処理のソースしかないですね。
ソースを見ないとなんとも言えません。
開くをクリックするとどこが呼ばれるか分かりますか?
投稿日時 - 2007-08-13 15:54:16
補足
回答有難うございます。
1、開くをクリックすると、名前を入力するためのダイアログボックスが呼ばれます。
ソースを全文記述すると、『文字数オーバー』となってしまうので、途中からの表示です。
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HMENU hMenu;
char szBuf[64];
HDC hdc;
PAINTSTRUCT ps;
switch (msg){
case WM_CREATE:
hMenu = GetMenu(hWnd); //メニューハンドルの取得
break;
case WM_INITMENU:
if(IsWindow(hDlg)){ //以下メニューの初期化
EnableMenuItem(hMenu, IDM_DLG,
MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_CLOSEDLG,
MF_BYCOMMAND | MF_ENABLED);
}else{
EnableMenuItem(hMenu, IDM_DLG,
MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_CLOSEDLG,
MF_BYCOMMAND | MF_GRAYED);
}
DrawMenuBar(hWnd);
break;
case WM_PAINT: //描画処理
if(strcmp(szName, "")==0)
strcpy(szBuf, "まだ名前の入力はありません");
else
wsprintf(szBuf, "入力された名前は%sさんです",
szName);
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, szBuf, (int)strlen(szBuf));
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wp)){
case IDM_END: //FormではEXITのため変更
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_DLG:
hDlg = CreateDialog(hInst, "MYDLG",
hWnd, (DLGPROC)MyDlgProc);
ShowWindow(hDlg, SW_NORMAL);
break;
case IDM_CLOSEDLG:
DestroyWindow(hDlg);
break;
}
break;
case WM_CLOSE:
if (IsWindow(hDlg)){
MessageBox(hWnd, "ダイアログを破棄します",
"破棄", MB_OK);
DestroyWindow(hDlg);
}
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
//ダイアログプロシージャ
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
static HWND hParent;
switch (msg){
case WM_INITDIALOG:
hParent = GetParent(hDlg); //親Windowのハンドルを取得
return TRUE;
case WM_COMMAND:
switch (LOWORD(wp)){
case IDOK:
GetDlgItemText(hDlg, IDC_EDIT1, szName,
(int)sizeof(szName)-1);
InvalidateRect(hParent, NULL, TRUE);
return TRUE;
case IDCANCEL:
SetDlgItemText(hDlg, IDC_EDIT1, "");
return TRUE;
case IDC_CLOSE:
DestroyWindow(hDlg);
return TRUE;
}
return FALSE;
}
return FALSE;
}
2、宣言の部分、ウィンドウクラスの登録、ウィンドウの生成の部分は、省いてあります。
お手数をおかけします。
投稿日時 - 2007-08-13 18:06:57
OKWaveのオススメ
おすすめリンク