• ベストアンサー
  • すぐに回答を!

c++ 電卓制作

今使ったのはMicrosoft Visual Studio 2010のアプリ 以下のプログラムはダイアログボックス表示で0から9のボタン入れでます、普通の電卓作りたいです、計算のプログラムわからないので、どうすればいいですか? #include <windows.h> #include "resource.h" #include <tchar.h> // プロトタイプ宣言 BOOL CALLBACK DlgWndProc ( HWND , UINT , WPARAM , LPARAM ) ; void sub( int no , HWND hWnd ) ; static int cnt ; int a , b ; static int c ; // エントリポイント int APIENTRY WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { DialogBox(hInstance , MAKEINTRESOURCE(IDD_DIALOG1) , NULL , (DLGPROC) DlgWndProc ) ; return 0 ; } /* ------ ダイアログボックスウインドウプロシージャ ----- */ BOOL CALLBACK DlgWndProc ( HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam ) { TCHAR s[80] ; switch( message ) { case WM_INITDIALOG : cnt = 0 ; return TRUE ; case WM_COMMAND : switch ( LOWORD(wParam) ) { case IDC_1 : sub ( 1 , hWnd ) ; return TRUE ; case IDC_2 : sub ( 2 , hWnd ) ; return TRUE ; case IDC_3 : sub ( 3 , hWnd ) ; return TRUE ; case IDC_4 : sub ( 4 , hWnd ) ; return TRUE ; case IDC_5 : sub ( 5 , hWnd ) ; return TRUE ; case IDC_6 : sub ( 6 , hWnd ) ; return TRUE ; case IDC_7 : sub ( 7 , hWnd ) ; return TRUE ; case IDC_8 : sub ( 8 , hWnd ) ; return TRUE ; case IDC_9 : sub ( 9 , hWnd ) ; return TRUE ; case IDC_0 : sub ( 0 , hWnd ) ; return TRUE ; case IDC_CLOSE : EndDialog( hWnd , 0 ) ; return TRUE ; default : return FALSE ; } default : return FALSE ; } } /* ------------------------------------- */ /*表示 */ /* ------------------------------------- */ void sub( int no , HWND hWnd ) { TCHAR s[20] ; cnt *= 10 ; cnt += no ; wsprintf( s , TEXT("%d") , cnt ) ; SetWindowText( GetDlgItem(hWnd , IDC_EDIT1) , s ) ; }

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数562
  • ありがとう数8

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

  • ベストアンサー
  • 回答No.1

「わかりません」の一言では何が/どうわからんのかが伝ってこないので答えようがない。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • DialogBox

    こんばんは 最近Windowsプログラムでツールを作ることになりまして 久しぶりにダイアログボックスを作成しようとして、いきなり躓きました;; DialogBox関数でダイアログを表示できないのですが、何か特別な処理って必要でしたっけ? 以下ソースコードです #include <windows.h> #include "resource.h" BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, MAKEINTRESOURCE("IDD_DIALOG"), NULL, (DLGPROC)DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: // ダイアログボックスが作成されたとき return TRUE; case WM_CLOSE: EndDialog(hWnd, IDOK); return TRUE; } return FALSE; } よろしくお願いします

  • ダイアログ表示後に1回だけ実行

    ダイアログベースのプログラムで、ダイアログを表示後にメッセージボックスを表示しようとして、下のプログラムのようにしたのですがダイアログが表示される前にメッセージボックスが表示されてしまいます。 ダイアログが表示された直後に1回だけ表示されるようにするにはどうすればいいですか? #include<Windows.h> #include "resource.h" HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlgmain"),NULL,dlgproc); } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { TCHAR moji[]=TEXT("ダイアログ表示"); switch(msg) { case WM_INITDIALOG: MessageBox(hwnd,moji,TEXT(""),MB_OK); return(INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; } return(INT_PTR)FALSE; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • 子ウインドウの作成と破棄について

    CALLBACK のみを書きました。 メインウインドウを破棄したら 子ウインドウも破棄したいのですが、 うまく出来ません。 どうすればよろしいでしょうか? よろしくお願いします。 #include<windows.h> #include"ChildWindow.h" char MainWindowClassName[]="mainwindow"; LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND childWnd; switch(message) { case WM_ACTIVATEAPP: childWnd=Child_CreateWindow(hWnd,message,wParam,lParam); break; case WM_DESTROY: DestroyWindow(childWnd); PostQuitMessage(0); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ///////////////////////////////////////////// #include<windows.h> char ChildWindowClassName[]="childwindow"; LRESULT CALLBACK ChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(NULL,"","",MB_OK); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ATOM Child_RegistWindow(HINSTANCE hInstance){} HWND Child_InitInstance(HWND hParentWnd,HINSTANCE hInst,int CmdShow){} HWND Child_CreateWindow(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { int CmdShow=1; Child_RegistWindow(NULL); HWND ChildWnd=Child_InitInstance(hWnd,NULL,CmdShow); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return ChildWnd; }

  • 何もしないメッセージだけ表示するウィンドウ

    ゲーム用に何もしないメッセージだけ表示するウィンドウを作りたいのですが、 猫でもわかるゲームプログラミングのコードが間違っているのか、 機能しません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg){ } return 0; } このように、打ち込んだのですが、どこが間違っているのか解りません。 回答お願いいたします。

  • プロトタイプが必要な場合

    WndProc関数の前にFunc関数を書いているから、WndProc関数の ソースがコンパイルされる時はFunc関数は既に読み込み済みで Func関数のプロトタイプは必要無いと思ったんだけど、必要なんですか? #include <windows.h> int Func(HWND); ←これは必要ですか? LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpstr, int n) {  … } int Func(HWND hWnd) {  … } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {  static int i;  switch(uMsg){  case WM_CREATE:   i = Func(hWnd);   break;  … }

  • wsprintf( ) でポインタに代入

    wsprintf(p, "%d" , i); を書いたせいで、i の値が変わります。 wsprintf(p, "%d" , i); によってどんなことが起こっているのか詳しく知りたいです。 ポインタのことがまだよく分かってないんです。 #include <windows.h> LPCSTR szStr = "\n char c[255];\n char *p = \"\\0\";\n int i = 12345;\n\n switch (msg){\n case WM_LBUTTONDOWN:\n  wsprintf(c, \"%d\" , i);\n  wsprintf(p, \"%d\" , i);\n  MessageBox(hWnd , c , \"\" , MB_OK);\n break;"; LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM); int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int){ 省略 return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; RECT rt; char c[255]; char *p = "\0"; int i = 12345; switch (msg){ case WM_LBUTTONDOWN: wsprintf(c, "%d" , i); wsprintf(p, "%d" , i); MessageBox(hWnd , c , "" , MB_OK); break; case WM_PAINT: GetClientRect(hWnd, &rt); hDC = BeginPaint(hWnd, &ps); DrawText(hDC, szStr, lstrlen(szStr), &rt, DT_WORDBREAK); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); }

  • DragQueryFile()でエラー

    現在、VC++2005SP1でダイアログベースのアプリを書いていますが、エディットコントールでのドラッグアンドドロップの実装で躓いています。なぜかDragQueryFile()で-1が返って来て直後にGetlastError()を呼ぶと6(無効なハンドル)が返って来ます。 現象の再現を確認しながらコードを以下のレベルまで簡略にしました。 どこかまずいところがあればご教示頂きたく思います。 #include "stdafx.h" #include <stdio.h> #include <locale.h> #include <shellapi.h> #include "Resource.h" TCHAR input_file[MAX_PATH]; void InitDialog( HWND hWnd ); LRESULT CALLBACK MyDragDropProc( HWND, unsigned, WORD, LONG ); WNDPROC lpfnOldEditProc; LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nCmdShow ) {   _tsetlocale(LC_ALL, _T(""));   INT_PTR dret = DialogBox(hInst, MAKEINTRESOURCE( IDD_DIALOG ), NULL, (DLGPROC)DlgProc );   return 0; } LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {   switch (msg) {   case WM_INITDIALOG: InitDialog( hWnd ); return TRUE;   case WM_COMMAND:     switch (LOWORD(wp)) {     case IDOK: EndDialog(hWnd, IDOK); return TRUE;     case IDCANCEL: EndDialog(hWnd, IDCANCEL); return TRUE;     }   }   return FALSE; } void InitDialog( HWND hWnd ) {   DragAcceptFiles( GetDlgItem( hWnd, IDC_EDIT_INPUT_FILE ), TRUE );   lpfnOldEditProc = (WNDPROC)SetWindowLong( GetDlgItem( hWnd, IDC_EDIT_INPUT_FILE ), GWL_WNDPROC, (LONG)MyDragDropProc ); } LRESULT CALLBACK MyDragDropProc( HWND hWnd, unsigned msg, WORD wp, LONG lp ) {   UINT wFilesDropped;   HDROP hDrop = (HDROP)wp;   TCHAR buff[256];   int err;   switch ( msg ) {   case WM_DROPFILES:     wFilesDropped = DragQueryFile( hDrop, (UINT)-1, NULL, 0 );     err = GetLastError();     _itot_s( err, buff, 256, 10 );     MessageBox( NULL, buff, NULL, MB_OK );     wFilesDropped = DragQueryFile( (HDROP)wp, 0, input_file, MAX_PATH );     MessageBox( hWnd, input_file, NULL, MB_OK );     DragFinish( hDrop );     break;   default:     return CallWindowProc( (WNDPROC)lpfnOldEditProc, hWnd, msg, wp, lp );   }   return 0; }

  • msgが定義されていない

    Visual Studio2019でwindowsアプリケーションでゲームを作っているんですが、 どうやってもmsgが定義されていないが直りません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); //WinMain関数 int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { //ウィンドウクラスの登録 //メインウィンドウの生成 //メッセージループ return (int)msg.wParam; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { //メッセージごとにやりたいことを記述する } return 0; } ご教示お願いします。

  • C++ WIN32 ウィドウの表示

    プログラミング初心者です。 WIN32APIの勉強を始めたばかりの状態です。 本を見ながら、ウィンドウを表示させるだけのプログラムを書いてみたのですが、エラーになってしまいます。 #include <windows.h> //ウィンドウ・クラス名 #define MYWNDCLSNAME "MyWindowClass" LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wndcls; HWND hWnd; MSG msg; //ウィンドウ・クラスを登録 ZeroMemory(&wndcls, sizeof(wndcls)); wndcls.lpfnWndProc = WndProc; wndcls.hInstance = hInst; wndcls.hIcon = LoadIcon(0, IDI_APPLICATION); wndcls.hCursor = LoadCursor(0, IDC_ARROW); wndcls.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wndcls.lpszClassName = MYWNDCLSNAME; if(RegisterClass(&wndcls) == 0) return -1; //メイン・ウィンドウを作成 hWnd = CreateWindow(MYWNDCLSNAME, "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, NULL); if(hWnd == 0) return -2; //ウィンドウの表示状態を指定する ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); //メッセージループ while(GetMessage(&msg, 0, 0, 0)){ DispatchMessage(&msg); } //WM_QUITメッセージのwParamを終了コードにする return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; } //自分で処理しないメッセージはWindowsに任せる return DefWindowProc(hWnd, uMsg, wParam, lParam); } 本を読み直しても原因がよくわかりません。 どこがいけないのかご指摘いただけるとうれしいです。お願いします。 エラーの内容は error C2440: '=' : 'const char [14]' から 'LPCWSTR' に変換できません。 error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [14]' から 'LPCWSTR' に変換できません。 です。

  • 自作関数の使い方

    ウインドウの左上に1を表示させたいのに デスクトップの左上に1が表示される。 ソースを直してください。 #include <windows.h> HWND hWnd; void f(); LRESULT CALLBACK WndProc(HWND ,UINT ,WPARAM ,LPARAM); int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE ,LPSTR , int){  HWND hWnd;  MSG msg;  WNDCLASS wc;  wc.style = CS_HREDRAW | CS_VREDRAW;  wc.lpfnWndProc = WndProc;  wc.cbClsExtra = wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.lpszMenuName = NULL;  wc.lpszClassName = "CNAME";  wc.hIcon = LoadIcon(NULL , IDI_APPLICATION);  wc.hCursor = LoadCursor(NULL , IDC_ARROW);  wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);  if (!RegisterClass(&wc))return 0;  hWnd = CreateWindow(wc.lpszClassName , "EXE" ,   WS_OVERLAPPEDWINDOW | WS_VISIBLE ,   CW_USEDEFAULT , CW_USEDEFAULT , 200 , 150,   NULL , NULL , hInstance , NULL);  while(GetMessage(&msg , NULL , 0 , 0)){   TranslateMessage(&msg);   DispatchMessage(&msg);  }  return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd ,UINT msg ,WPARAM wParam ,LPARAM lParam){  HDC hDC;  switch (msg){  case WM_LBUTTONDOWN:   f();  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return(DefWindowProc(hWnd , msg , wParam , lParam));  }  return (0L); } void f(){  HDC hDC;  hDC = GetDC(hWnd);  TextOut(hDC,0,0,"1",1);  ReleaseDC(hWnd, hDC); }