dポイントプレゼントキャンペーン実施中!

よろしくお願いします。
不思議な現象が起こるプログラムで悩んでいます。
『猫でもわかる第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;

}

A 回答 (2件)

ご使用の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の設定をご指摘のように変えてテストしてみましたが、
『メニュー無し、メニュー有り』ともに変化はありませんでした。
『メニュー無し』のプログラムで右クリックが使える原因は、アドバイスにより、理解できました。
メニューを付けるのは大変そうですが、作成してみたいと思います。

補足日時:2007/12/27 22:34
    • good
    • 0
この回答へのお礼

御礼が遅れてすみません。
今、アドバイスを参考にしながら手直しをしているところです、まだ解決できていませんが、もう少しがんばってみたいと思います。
有難うございました。

お礼日時:2007/12/31 21:10

今の時代になぜWindowsAPIでプログラムするのかがわからん(ーー;)



C++の勉強をしたいのであれば、VC++/CLIから入って楽しさを学んで、MFCで本格的にプログラミングすることをお勧めします。
    • good
    • 0
この回答へのお礼

回答有難うございます。
>今の時代になぜWindowsAPIでプログラムするのかがわからん(ーー;)
最初に入手した参考書が、C言語のものだったのです。
C++は、これから順に学習賞とは思っています。

お礼日時:2007/12/29 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!