![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
よろしくお願いします。
不思議な現象が起こるプログラムで悩んでいます。
『猫でもわかる第2版』を参考にして、『メモ帳』を作成しているのですが、コンパイルして作られた
メモ帳の動作を理解できません。
詳しい方、アドバイスをお願いします。
1、メニューを付けない『メモ帳』の時は、『直接入力、半角入力、全角入力』が可能、漢字変換も可能
問題点
1、メニューを付けない『メモ帳』の時、『コーディングしていないのに』右クリックでポップアップメニューが表示でき、切り取り、削除、貼り付け、その他が使える。
2,メニュー項目を付けると『直接入力が出来ない』、半角入力、全角入力は可能、但し、Enterキーを押すと、入力した文字が消えてしまう
3、コンパイルには、BCC, VC++の両方でテストしたが、結果は同じ
/*ウィンドウプロシージャ*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
RECT rc;
static HWND hEdit;
switch (msg){
case WM_CREATE:
hEdit = CreateWindow("EDIT", NULL,
WS_CHILD | WS_VISIBLE | ES_WANTRETURN |
ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL,
0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL);
strcat(szTitle, "「無題」");
SetWindowText(hWnd, szTitle);
break;
case WM_SIZE:
MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE);
break;
SetWindowText(GetParent(hEdit),
"メモ帳[無題]");
case WM_SETFOCUS:
SetFocus(hEdit);
break;
/*case WM_COMMAND:
switch (LOWORD(wp)){
case IDM_NEW:
MyNew(hEdit);
break;
}
break;*/
case WM_CLOSE:
id = MyConfirm(hEdit);
if(id == IDCANCEL)
break;
id = MessageBox(hWnd, "終了してもいいですか",
"確認", MB_YESNO | MB_ICONQUESTION);
if(id == IDYES){
DestroyWindow(hEdit);
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
/*新規作成
int MyNew(HWND hEdit)
{
int id;
id = MyConfirm(hEdit);
if(id == IDCANCEL){
return -1;
}
Edit_SetText(hEdit, "");
SetWindowText(GetParent(hEdit),
"メモ帳[無題]");
strcpy(szFile, "");
return 0;
}*/
//文書保存の確認
int MyConfirm(HWND hEdit)
{
int id;
if(SendMessage(hEdit, EM_GETMODIFY, 0, 0) == TRUE){
id = MessageBox(hEdit,
"文書が更新されています。\n変更を保存しますか?",
"メモ帳",
MB_YESNOCANCEL | MB_ICONEXCLAMATION);
if(id == IDYES){
MySaveAs(hEdit);
}else if (id == IDCANCEL){
return IDCANCEL;
}else if (id == IDNO){
return IDNO;
}
}
return 0;
}
No.1ベストアンサー
- 回答日時:
ご使用のIMEは MS-IMEでしょうか?
MS-IMEなら『互換性』タブの『詳細なテキストサービスを使用する』をオンにしてみてください
コンテキストメニューはwidnowsが標準で準備しているものだったように思います
これを抑制したいなら エディットコントロールのウィンドウプロシージャを自作してWM_RBUTTONDOWNメッセージなどを破棄しましょう
メインウィンドウのWM_CREATEでエディットコントロールを作成してから GetWindowLongでWNDPROCを取得し SetWindowLongで自作WndProcを設定します
外部変数として 元々のEditコントロールのプロシージャを覚えておく変数を宣言します
WNDPROC lpPrevProc;
新しいEditコントロールのプロシージャのプロトタイプ宣言
LRESULT CALLBACK EditProc(HWND, UINT, WPARAM,LPARAM);
新しいEditコントロールのプロシージャ
LRESULT CALLBACK EditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg ) {
case WM_RBUTTONDOWN:
break;
default:
// 元々のプロシージャを呼び出す
CallWindowProc( lpPrevProc, hWnd, uMsg, wParam, lParam );
}
return 0;
}
WM_CERATEメッセージで
// Editコントロールのプロシージャを取得
lpPrevProc = GetWindowLong( hEdit, GWL_WNDPROC );
// Editコントロールの新プロシージャを設定
SetWindowLong( hEdit, GWL_WNDPROC, (LONG)EditProc );
といった具合です
この回答への補足
詳しいアドバイス有難うございます。
先ず、IMEの設定をご指摘のように変えてテストしてみましたが、
『メニュー無し、メニュー有り』ともに変化はありませんでした。
『メニュー無し』のプログラムで右クリックが使える原因は、アドバイスにより、理解できました。
メニューを付けるのは大変そうですが、作成してみたいと思います。
御礼が遅れてすみません。
今、アドバイスを参考にしながら手直しをしているところです、まだ解決できていませんが、もう少しがんばってみたいと思います。
有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ツリーコントロールの開閉アイ...
-
return文がない場合の戻り値は...
-
Win32APIにて、ウィンドウ全体...
-
エラー Run-Time Check Failur...
-
ダイアログプログラムでEnterキ...
-
エディットボックスの背景の色...
-
なぜCreateHatchBushの設定が途...
-
LoadImageを使ったアイコンファ...
-
エクセルのクイックアクセスツ...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
信頼区間の1.96や1.65ってどこ...
-
DWORDの実際の型は何でしょうか
-
入力した文字列から母音だけを...
-
O(n log n)について2
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
C言語を実行すると-infが出てき...
-
マイナスからプラスへ転じた時...
-
fgetsなどのときのstdinのバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
エラー Run-Time Check Failur...
-
コンソールアプリケーションの...
-
MessageBoxについて
-
画像を表示したいのですが……
-
【Windowsアプリ】ファイルのド...
-
PeekMessageについて
-
キャレットの現在位置の表示 (W...
-
C言語win32api、エディットボッ...
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
音量調節
-
エディットコントロール入力時...
-
ダイアログプログラムでEnterキ...
-
不明なエラー
-
C++のcase文の書き方
-
オーバーレイみたいな処理がしたい
-
ゲームとかの解像度変更&全画...
-
WM_CREATE について
-
LoadImageとSetCursorについて
おすすめ情報