• 締切済み

自分の書いたプログラムに疑問があります

よろしくお願いします。 メモ帳を作っています、作成したウィンドウに 『メニュバー』  『ツールバー』 『ポップアップメニュー』 を作り、そこにエディタを貼り付けました。 『右クリック』をすると、windows既成のポップアップメニューが表示されるため、新しいプロシージャで自分用のポップアップメニューを作ったのですが、 メモ帳に何も書かずに終了した時、終了できなかったのでこのプログラムを先頭に加えました。 if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } 疑問点  この記述は、『文書保存の確認』の所でも使っていますが、 これをつけないと終了できません。 重複しているため、すっきりしないのですが、 今は、これしか思い浮かばないのですが、もっとすっきりしたプログラムにしたいのです。 間違っている所、直したほうがいい所がありましたらアドバイスをお願いします。 //マイプロシージャの終了メッセージ処理 case WM_COMMAND: switch (LOWORD(wp)){ case IDM_END:   if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } //重複するが、ここを付けないと、何も書いていないメモ帳が閉じない } //ここから文書保存のプログラム if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hWnd, TEXT("文書が更新されています、\n変更を保存しますか?"), TEXT("メモ帳"), MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySaveAs(hWnd); }else if (id == IDCANCEL){ return IDCANCEL; } /*else if (id ==IDNO){ ここを記述すると  文書保存でキャンセルした時に、『終了しない』     また、何も書いてないと 『終了しない』  id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); //}//ここもコメントアウト } } } break;   default: return CallWindowProc(OldProc, hWnd, msg, wp, lp); } }  

noname#220054
noname#220054

みんなの回答

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

IDM_ENDと同じ動作をさせたいなら、PostMessageで飛ばせばいい。 PostMessage(WM_COMMAND, MAKELONG(IDM_END, 0), 0, 0); ってな感じでね。 私なら関数化して、両方とも同じ関数を呼ぶようにするけど。

noname#220054
質問者

お礼

御礼が遅れてすみません。 アドバイスを参考に、新しい関数を作ってテストしている所です。 まだ、思ったように行きませんが、何とかなりそうです。

  • narusuji
  • ベストアンサー率40% (4/10)
回答No.1

こんにちは。 どんな環境をお使いですか?(visual c++などでしょうか?) プログラムについては全くわかりませんが、参考までに教えて下さい。

noname#220054
質問者

お礼

>どんな環境をお使いですか? 今使っている環境は、borlandのコンパイラ、BCCデベロッパー、です。 コンパイルの結果によって(コンパイルエラーの内容によって)は、 VC++2005も使っています。

関連するQ&A

  • VC++2005での警告について教えてください

    よろしくお願いします。 vc++2005を使ってコンパイルした時、プログラムの『691行目と、689行目』の所に緑色の(∥チェック)が付いていて、次のような警告が出たのですが、 これは、『記述する場所が間違っている』と解釈して良いでしょうか? ------ ビルド開始: プロジェクト: memo, 構成: Release Win32 ------ コンパイルしています... c:\memo\memo\memo.cpp(691) : warning C4715: 'NewProc' : 値を返さないコントロール パスがあります。 コード生成が終了しました。 マニフェストを埋め込んでいます... ビルドログは "file://c:\Visual Studio 2005\Projects\memo\memo\Release\BuildLog.htm" に保存されました。 memo - エラー 0、警告 21 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== //サブクラス化後のプロシージャ LRESULT CALLBACK NewProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { POINT pt; static HMENU hMenu; static HMENU hSubMenu; int id; switch (msg){ case WM_RBUTTONDOWN: //ポップアップメニューを作る hMenu = LoadMenu(hInst, "MYMENU2"); hSubMenu = GetSubMenu(hMenu, 0); pt.x = LOWORD(lp); pt.y = HIWORD(lp); ClientToScreen(hWnd, &pt); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hWnd); break; /*case IDM_SAVE: MySave(hWnd); break;*/ case IDM_SAVEAS: MySaveAs(hWnd); break; case IDM_OPEN: MyOpen(hWnd); break; case IDM_END: if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hWnd, TEXT("文書が更新されています、\n変更を保存しますか?"), TEXT("メモ帳"), MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySave(hWnd); //MySaveAs(hWnd); }else if (id == IDCANCEL){ return IDCANCEL; }/*else if (id ==IDNO){ *///ここを記述すると //文書保存ダイアログでキャンセルした時に、『終了しない』 id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } } break; default: 689行目 return CallWindowProc(OldProc, hWnd, msg, wp, lp); } 691 行目 }

  • プロセスとか

    101 case WM_CLOSE: 102  id = MessageBox(hWnd,"終了する?","",MB_YESNO); 103  if(id == IDYES)DestroyWindow(hWnd); 104 break; 105 case WM_DESTROY: 106  PostQuitMessage(0); 107 break; 103行目が実行されたら、WM_DESTROY が発生します。 そしたらそのまま104、105、106行目が順に実行されるんですか? それとも、103が実行されたら104が実行される前に、 新しいプロセスで WM_DESTROY が入った WndProc( ) が 実行されて、それと同時に104が実行されて break で ループが終了するんですか?

  • 不思議な現象が起こるプログラムで悩んでいます。

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

  • windowsAPI 画像の表示

    画像が表示できません。   表示は   LoadBitmap() と BitBlt() だと思うんですけど。。。   何回やってもできません。   LRESULT CALLBACK WindowProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { HMENU hMenu, hSubMenu; MENUITEMINFO mii; HDC hdc,hBuffer; RECT rect; TEXTMETRIC tm; PTSTR pstr; PAINTSTRUCT ps; static HFONT hFont; static HDC hMemDC; static HBITMAP hBitmap,hPrevBitmap; static BITMAP bitmap; switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CLOSE: if(MessageBox(hWnd,TEXT("ゲームを終了しますか?"),TEXT("アスパラインフォメーション"),MB_YESNO | MB_ICONINFORMATION) == IDYES){ DestroyWindow(hWnd); } return 0; case WM_COMMAND: //有効なメニューが選択され、メニューの選択が終了した switch(LOWORD(wParam)) { case IDM_NEW: pstr = TEXT("新しくゲームを始めますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ gamesystem = 1; InvalidateRect(hWnd,NULL,TRUE); } break; case IDM_OPEN: pstr = TEXT("ゲームをロードしますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ } break; case IDM_CLOSE: pstr = TEXT("ゲームを終了しますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ DestroyWindow(hWnd); } break; default: return 0; } return 0; case WM_MENUSELECT: //メニュー項目が選択された switch (LOWORD(wParam)) { case IDM_NEW: pstr = TEXT("新しくゲームを開始します"); break; case IDM_OPEN: pstr = TEXT("ゲームをロードします"); break; case IDM_CLOSE: pstr = TEXT("ゲームを終了します"); break; default: pstr = TEXT("ポップアップメニューが選択されています"); break; } hdc = GetDC(hWnd); GetClientRect(hWnd , &rect); GetTextMetrics(hdc , &tm); Rectangle(hdc , 0 , rect.bottom - tm.tmHeight * 2, rect.right , rect.bottom); TextOut(hdc , 5 , rect.bottom - tm.tmHeight * 1.5 , pstr , lstrlen(pstr)); ReleaseDC(hWnd , hdc); return 0; case WM_CREATE: mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID; mii.fType = MFT_STRING; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); mii.dwTypeData = TEXT("ニューゲーム(&N)"); mii.wID = IDM_NEW; InsertMenuItem(hSubMenu , 0 , TRUE , &mii); mii.dwTypeData = TEXT("ロード(&O)"); mii.wID = IDM_OPEN; InsertMenuItem(hSubMenu , 1 , TRUE , &mii); mii.dwTypeData = TEXT("終了(&X)"); mii.wID = IDM_CLOSE; InsertMenuItem(hSubMenu , 2 , TRUE , &mii); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hSubMenu; mii.dwTypeData = TEXT("ファイル(&F)"); InsertMenuItem(hMenu , 0 , TRUE , &mii); SetMenu(hWnd , hMenu); hFont = CreateFont( 40,0,0,0,750, FALSE,FALSE,FALSE, SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, VARIABLE_PITCH | FF_ROMAN,NULL); hBitmap = LoadBitmap( ((LPCREATESTRUCT)lParam)->hInstance , TEXT("KYARA") ); return 0; case WM_KEYDOWN: InvalidateRect(hWnd,NULL,FALSE); gamesystem += 1; return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); hBuffer = CreateCompatibleDC(hdc); SelectObject(hBuffer , hBitmap); BitBlt(hdc , 100 , 100 , 34 , 32 , hBuffer , 70 , 80 , SRCCOPY); DeleteDC(hBuffer); if(gamesystem == 1){ ・・・・・・・・・・・・・・・・・   といった感じです。   間違えがあれば、ご指摘お願いします。   また、わかりやすいサンプルコードを載せていただけたら嬉しいです。

  • WM_CREATE について

    Windows API の勉強を始めた者です。 CreateWindow関数を使ったときに発行されるWM_CREATEについて質問させていただきます。 以下のようなプログラムを作りました。このプログラムはウインドウを作るプログラムなのですが、はじめにウインドウを作るかどうかをWindowProcの中で聞いています。 このプログラムでウインドウを作らないという選択肢をとった時が分かりません。 WindowProcでは return -1 をするのでウインドウは作られず、従ってhWndにはNULLが入ります。そして次の文で、  if (hWnd == NULL) {   MessageBox(NULL,TEXT("CreateWindow failed"),NULL,MB_OK);   return 0;  } メッセージボックスが表示されてからプログラムが終了すると思ったのですが、実際にはメッセージボックスは表示されませんでした。 なぜでしょうか。return -1 をした時点で、ウインドウが作られないのでWM_DESTROYがウインドウプロシージャにSendされるのかと考えたのですが、そうなのでしょうか。 よろしくお願いします。 /* 作ったプログラム */ #include <windows.h> LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {  int YESNO;  switch(uMsg) {  case WM_DESTROY:   PostQuitMessage(0);  return 0;  case WM_CREATE:  YESNO = MessageBox(NULL, TEXT("Create a new window?"),        ((LPCREATESTRUCT)lParam)->lpszName, MB_YESNO);  if (YESNO == IDYES)   return 0;  if (YESNO == IDNO)   return -1;  }  return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance,           HINSTANCE hPrevInstance,           PSTR lpCmdLine,            int nCmdShow) {  WNDCLASS wc;  ATOM atom;  MSG msg;  HWND hWnd;  wc.style = CS_HREDRAW| CS_VREDRAW;  wc.lpfnWndProc = WindowProc;  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.hIcon = NULL;  wc.hCursor = NULL;  wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;  wc.lpszMenuName = NULL;  wc.lpszClassName = TEXT("sample_window");  if ((atom = RegisterClass(&wc)) == 0) {   MessageBox(NULL,TEXT("RegisterClass failed"),NULL,MB_OK);   return 0;  }  hWnd = CreateWindow((LPCTSTR)atom, TEXT("Sampe window"),              WS_OVERLAPPEDWINDOW | WS_VISIBLE,              100, 100, 400, 300,              NULL, NULL, hInstance, NULL);                if (hWnd == NULL) {   MessageBox(NULL,TEXT("CreateWindow failed"),NULL,MB_OK);   return 0;  }  while (GetMessage(&msg, NULL, 0, 0) > 0) {   DispatchMessage(&msg);  }  return msg.wParam; }

  • midiの再生が思うようにできません

    ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。 環境:WindowsXP, Visual C++ 2008 Express Edition 以下がプログラムのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { FILE *fp; errno_t err; TCHAR buf[30]; TCHAR *temp; int m=0, n=0; switch(msg) { case WM_CREATE: CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL); break; case WM_COMMAND: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } for(int i=0; i<2; i++){ _fgetts(buf, 10, fp); _tcstok(buf, TEXT("\n")); } while(_fgetts(buf, 30, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ if((m>=0 && m<110)&&(n>=0 && n<200)){ if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=0 && n<200)){ if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=220 && m<330)&&(n>=0 && n<200)){ if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=330 && m<440)&&(n>=0 && n<200)){ if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=440 && m<550)&&(n>=0 && n<200)){ if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=550 && m<660)&&(n>=0 && n<200)){ if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=660 && m<770)&&(n>=0 && n<200)){ if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=200 && n<400)){ if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; 以下省略 . . . }else{ break; } } } free(temp); fclose(fp); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

  • win32apiでの動画出力

    win32apiとopenCVを使った動画出力プログラムを作りたいのですが, フリーズしてしまいます. 詳しい方,力を貸してください. 以下にプログラムを載せます. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { int x, y; int id; int c; char* szWndName = "camera capture"; CvCapture* capture; // IplImage* img; switch (msg) { case WM_CREATE: hDC = GetDC( hWnd ); return DefWindowProc(hWnd, msg, wParam, lParam); case WM_COMMAND: switch(LOWORD(wParam)){ case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0L); break; case IDM_USB: capture = cvCaptureFromCAM(0); if(capture == NULL){ MessageBox(hWnd, (LPCTSTR)TEXT("Not camera"), (LPCTSTR)TEXT("Test"), MB_OK); return -1; } while(1){ img = cvQueryFrame(capture); bmpData = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, img->width * img->height * 4); iplTobmp(img, bmpInfo, bmpData); StretchDIBits( hDC, 0, 0, img->width, img->height, 0, 0, img->width, img->height, bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY); } ReleaseDC(hWnd, hDC); cvReleaseCapture(&capture); return 0; break; } break; case WM_LBUTTONDOWN: // マウスカーソルが移動したときに送られてくる // 移動先の座標を取得 x = LOWORD( lParam ); y = HIWORD( lParam ); // 座標をテキストファイルに書き込む _ftprintf( g_fp, _T("(%d %d)\n"), x, y ); return 0; case WM_CLOSE: id = MessageBox(hWnd, TEXT("Close?"), TEXT("Close"), MB_OKCANCEL | MB_ICONQUESTION); if(id == IDOK) DestroyWindow(hWnd); return (0L); case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); }

  • | (or) を使った関数の引数の作り方

    たとえば、 MessageBoxの4つ目の引数のような感じで、 MessageBox(NULL, \"本文\",\"タイトル\", MB_YESNO|MB_ICONQUESTION); の、 4つ目の引数が|(or)で引数の指定ができますが、 こういった関数を自分で作る場合に、 どのように関数作成して、 4つ目の引数は関数内でどのように取得していけばいいのでしょうか? 基本的なことなのかとは思うのですが・・・ 良い解説のあるHPなど、 ご教授いただきたく思います。 よろしくお願いいたします。

  • | (or) を使った関数の引数の作り方

    たとえば、 MessageBoxの4つ目の引数のような感じで、 MessageBox(NULL, "本文","タイトル", MB_YESNO|MB_ICONQUESTION); の、 4つ目の引数が|(or)で引数の指定ができますが、 こういった関数を自分で作る場合に、 どのように関数作成して、 4つ目の引数は関数内でどのように取得していけばいいのでしょうか? 基本的なことなのかとは思うのですが・・・ 良い解説のあるHPなど、 ご教授いただきたく思います。 よろしくお願いいたします。

  • WINAPI editbox内の文字が文字化けする

    プログラムは、ウィンドウ内にエディットボックスを表示するだけのものです。 下のプログラムを実行すると、エディットボックス内に ”繧ィ” と表示されます。また、“エディタ“ と入力すると ”ィ」ソ” と表示されます。 GetWindowTextでテキストを取得すると、MessageBoxには何も表示 されませんでした。 使用しているパソコンはwindows10です。 どうすれば文字化けが解消されるのでしょうか。 #include <stdio.h> #include <windows.h> HINSTANCE hinstance; TCHAR tch[128]; LRESULT CALLBACK winpr(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow) { TCHAR szwinClass[]=TEXT("samp1"); TCHAR sztitle[]=TEXT("サンプル"); int width=720; int height=720; WNDCLASSEX wcx; HWND hwnd; MSG msg; hinstance=hinst; wcx.cbSize=sizeof(WNDCLASSEX); wcx.style=CS_HREDRAW | CS_VREDRAW; wcx.hbrBackground=(HBRUSH)(COLOR_WINDOWTEXT+1); wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hIcon=NULL; wcx.hIconSm=NULL; wcx.hCursor=LoadCursor(NULL,IDC_ARROW); wcx.hInstance=hinstance; wcx.lpfnWndProc=winpr; wcx.lpszClassName=szwinClass; wcx.lpszMenuName=sztitle; if(!RegisterClassEx(&wcx)){ MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OK); return 1; } hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,szwinClass,sztitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, width,height, NULL,NULL,hinstance,NULL); if (!hwnd) { MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OKCANCEL); int err=GetLastError(); return 1; } ShowWindow(hwnd,ncmdshow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)>0){ TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK winpr(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam){  HDC hdc; HWND hwndedit; int id; switch(message){ case(WM_CREATE): hwndedit= CreateWindow( TEXT("edit"), TEXT("エディタ"), WS_CHILD | WS_VISIBLE , 10, 10, 200, 30, hwnd, (HMENU)1,hinstance, NULL); return 0; case(WM_CLOSE): GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); MessageBox(hwnd,tch,TEXT("文字化け"),MB_OK); id=    MessageBox(hwnd,TEXT("閉じる"),TEXT("閉じる"),          MB_OKCANCEL); if (id==IDOK){ DestroyWindow(hwnd); } return 0; case(WM_DESTROY): PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } }