Windowsプログラミングでの質問です(2/2)

解決済みの質問

Windowsプログラミングでの質問です

よろしくお願いします。
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

QNo.3251741

困ってます

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

★本当に文字列ですか?
・『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

ANo.8

0人が「このQ&Aが役に立った」と投票しています

 |  次へ ]

ベストアンサー以外の回答(7件中 6~7件目)

ANo.2

zwi

サイト「猫でもわかるプログラミング」のページで同じところはありますでしょうか?
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

ANo.1

描画処理のソースしかないですね。
ソースを見ないとなんとも言えません。
開くをクリックするとどこが呼ばれるか分かりますか?

投稿日時 - 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

あわせてチェックしたい
  • TextOutについて ...
  • TextOut( ) を BeginPaint( ) と GetDC( ) ...
  • BeginPaintの使い方 ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら