windowsAPIについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sphere

windowsAPIについて

#1

投稿記事 by sphere » 8年前

コード:

#include <Windows.h>
#include <stdio.h>

////////////////////
//                //
//   マクロ定義   //
//                //
////////////////////
#define CLASS_NAME     "サンプル"                // ウィンドウクラスの名前
#define WINDOW_NAME     "ウィンドウ"     // ウィンドウの名前
#define SCREEN_WIDTH ( 800 )                     // ウィンドウの幅
#define SCREEN_HEIGHT ( 600 )                    // ウィンドウの高さ
#define ID_EDIT_000
#define ID_EDIT_001
#define ID_BUTTON_000
#define ID_BUTTON_001

//////////////////////////
//                      //
//   プロトタイプ宣言   //
//                      //
//////////////////////////

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ); 

////////////////////
//                //
//   メイン処理   //
//                //
////////////////////

int APIENTRY WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) 
{
	UNREFERENCED_PARAMETER ( hPrevInstance );
	UNREFERENCED_PARAMETER ( lpCmdLine );

	WNDCLASSEX wcex =
	{
		sizeof ( WNDCLASSEX ) , 
		CS_CLASSDC ,                         
		WndProc ,                             
		0 ,                                  
		0 ,                                   
		hInstance ,                           
		NULL ,                               
		LoadCursor ( NULL , IDC_ARROW ) ,     
		( HBRUSH ) ( COLOR_WINDOW + 1 ) ,     
		NULL ,                                
		CLASS_NAME ,                         
		NULL                                  
	};

	// ウィンドウクラスの登録
	RegisterClassEx ( &wcex );     

    static HWND hWnd;    
	static MSG msg;

	// ウィンドウスタイル定義
	const int wstyle = WS_OVERLAPPEDWINDOW &~ WS_MINIMIZEBOX &~ WS_MAXIMIZEBOX &~ WS_THICKFRAME ;

	    // ウィンドウを作成   
	hWnd = CreateWindowEx ( 0 ,                       
		                    CLASS_NAME ,              
							WINDOW_NAME ,             
							wstyle ,                 
							wx,                       
							wy,                       
		                    ww ,                      // ウィンドウの幅
							wh ,                     
							NULL ,                   
							NULL ,                   
							hInstance ,               
							NULL                     
							);

	// ウィンドウの表示
	ShowWindow ( hWnd , nCmdShow );    
	UpdateWindow ( hWnd );              

	while ( GetMessage ( &msg , NULL , 0 , 0 ) )
	{
		
		TranslateMessage ( &msg );
		DispatchMessage ( &msg );
	}

	return ( int ) msg.wParam;     
}

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
	static HDC hDC;
	static HWND hWndEdit;
    static HWND hWndButton_1;
	static HWND hWndButton_2;
	static char x;
	static char NumLength [ 256 ];
	static char NumBox [ 256] ;

	switch ( uMsg )
	{
	    case WM_CREATE:
			           hWndEdit = CreateWindowEx ( 0 , "EDIT" , "" , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT , 300 , 200 , 200 , 50 , hWnd , 
					                               ( HMENU ) ID_EDIT_000 (201) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_1 = CreateWindowEx ( 0 , "BUTTON" , "1" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 300 , 300 , 200 , 40 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_000 (101) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_2 = CreateWindowEx ( 0 , "BUTTON" , "2" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 300 , 350 , 200 , 40 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_001 (102) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   break;

		case WM_COMMAND: 
			           if ( LOWORD ( wParam ) == ID_BUTTON_000 (101) )
					   {
						    x = GetWindowTextLength ( hWndEdit );

							if ( x == 0 )
							{
						        SetWindowText ( hWndEdit , "1" );
							}
							else if ( x > 0 )
							{
                   GetWindowText ( hWndEdit , NumLength , 250 );
								sprintf ( &NumBox[ 0 ] , "1" , &NumLength );
								SetWindowText ( hWndEdit , &NumBox[0] );
							}
					   }

					   if ( LOWORD ( wParam ) == ID_BUTTON_001 (102) )
					   {
						   x = GetWindowTextLength ( hWndEdit );

						   if ( x == 0 )
						   {
						       SetWindowText ( hWndEdit , "2" );
						   }
						   else if ( x > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 250 );
                  sprintf ( &NumBox[ 0 ] , "2" , &NumLength );
							   SetWindowText ( hWndEdit , &NumBox[0] );
						   }
					   }

			           break;
					  
		case WM_KEYDOWN:
		               if( wParam == VK_ESCAPE )
		               {
		                  UINT nID = MessageBox ( NULL , "終了しますか?" , "Message" , MB_YESNO );

		                  if ( nID == IDYES )
		                  {
		                      DestroyWindow ( hWnd );
							  PostQuitMessage ( 0 );
		                  }
		               }
		               break;

		case WM_CLOSE:
			           MessageBox ( NULL , "ウィンドウを閉じます" , "Message" , MB_OK );

    				   DestroyWindow ( hWnd );
			           PostQuitMessage ( 0 );

					   break;

	}

	return DefWindowProc ( hWnd , uMsg , wParam , lParam );     
}

///////////////   EOF   ///////////////

windowsAPIでボタンを押すと、エディットボックスにそのボタンに応じた数が入るというものを作っているのですが、「1」と表示したあとに、2のボタンを押すと「1」が上書きされて、「2」が表示されてしまいます。これを「12」のようにつなげて表示させるにはどうすればよいのでしょうか?
教えてください。お願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#2

投稿記事 by みけCAT » 8年前

せっかく今ある文字列を取得しているので、

コード:

sprintf ( &NumBox[ 0 ] , "1" , &NumLength );
のように取得した文字列と関係ない文字列を設定するのではなく、

コード:

sprintf ( &NumBox[ 0 ] , "%s1" , &NumLength[ 0 ] );
のようにして取得した文字列とつなげるようにすればいいでしょう。(2箇所)
誤った型のデータを渡すと未定義動作になるので、&NumLengthではなく、&NumLength[ 0 ]を渡すことに注意してください。NumLengthでもかまいません。
(修正前のコードは、単に余分なデータがあり、評価されて無視されるだけなので問題ありません)

環境が対応していれば、バッファオーバーランのリスクが少ないsnprintfを使うほうがいいでしょう。

コード:

snprintf ( &NumBox[ 0 ] , sizeof(NumBox), "%s1" , &NumLength[ 0 ] );
オフトピック
また、マルチバイト文字列をAPIに直接渡しているので、
GetWindowText、SetWindowText、MessageBoxなどのマクロではなく、
GetWindowTextA、SetWindowTextA、MessageBoxAなどのANSI文字列を扱う関数を明示的に使用したほうがいいかもしれません。
オフトピック
ところえ、どうして地の文全体を太字にするのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sphere

Re: windowsAPIについて

#3

投稿記事 by sphere » 8年前

太字のところは間違えてテキストにしてしまっただけです。すみません。
プログラムに関してですが、無事に文字をつなげることに成功しました。
ありがとうございます。
応用として、先のプログラムを元に電卓っぽいものを作ってみたのですが、数字の最大表示数の指定と、「C」で初期化するという2点がどうしてもうまくいきませんでした。
質問が多くて申し訳ないのですが、どなたか教えてください。
よろしくお願いします。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: windowsAPIについて

#4

投稿記事 by naohiro19 » 8年前

WM_CLOSEはウィンドウの「閉じる」をマウスでクリックして送られるメッセージなのでDestroyWindowを使い、

PostQuitMessageをWM_CLOSEで送ることは間違った使い方です。通常はWM_DESTROYを受けて送信しなければなりません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#5

投稿記事 by みけCAT » 8年前

sphere さんが書きました:応用として、先のプログラムを元に電卓っぽいものを作ってみたのですが、数字の最大表示数の指定と、「C」で初期化するという2点がどうしてもうまくいきませんでした。
最大表示数(最大保存数ではない)の指定は確かに難しそうですが、初期化は入力データを消すだけではないのですか?
何をしようとして、どういうプログラムを書いて、どううまくいかなかったのかを具体的に質問してください。

フォーラムルールより引用
質問は具体的にする
詳しくは回答者が困る質問例をご覧下さい

「うまくいきません」という質問は大抵回答に困ります。

  1. 自分は今何がしたくて

  2. どう取り組んで(作ったプログラムはどれで

  3. どのようなエラーやトラブルで困っていて

  4. 自分は何が解らないのか、知りたいのか

  5. 今のCの知識はどの程度なのか

この5点をしっかりと明記して下さい。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sphere

Re: windowsAPIについて

#6

投稿記事 by sphere » 8年前

コード:

////////////////////////
//                    //
//   ヘッダファイル   //
//                    //
////////////////////////
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

////////////////////
//                //
//   マクロ定義   //
//                //
////////////////////
#define CLASS_NAME     "サンプル"                // ウィンドウクラスの名前
#define WINDOW_NAME     "ウィンドウ表示処理"     // ウィンドウの名前
#define SCREEN_WIDTH ( 800 )                     // ウィンドウの幅
#define SCREEN_HEIGHT ( 600 )                    // ウィンドウの高さ
#define ID_EDIT_000                              // エディットボックス
#define ID_BUTTON_000                            // 0ボタン
#define ID_BUTTON_001                            // 1ボタン
#define ID_BUTTON_002                            // 2ボタン
#define ID_BUTTON_003                            // 3ボタン
#define ID_BUTTON_004                            // 4ボタン
#define ID_BUTTON_005                            // 5ボタン
#define ID_BUTTON_006                            // 6ボタン
#define ID_BUTTON_007                            // 7ボタン
#define ID_BUTTON_008                            // 8ボタン
#define ID_BUTTON_009                            // 9ボタン
#define ID_BUTTON_010                            // Cボタン
#define ID_BUTTON_011                            // +ボタン
#define ID_BUTTON_012                            // -ボタン
#define ID_BUTTON_013                            // *ボタン
#define ID_BUTTON_014                            // /ボタン
#define ID_BUTTON_015                            // =ボタン

//////////////////////////
//                      //
//   プロトタイプ宣言   //
//                      //
//////////////////////////

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam );

////////////////////
//                //
//   メイン処理   //
//                //
////////////////////

int APIENTRY WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
	UNREFERENCED_PARAMETER ( hPrevInstance );
	UNREFERENCED_PARAMETER ( lpCmdLine );

	WNDCLASSEX wcex =
	{
		sizeof ( WNDCLASSEX ) ,
		CS_CLASSDC ,
		WndProc ,
		0 ,
		0 ,
		hInstance ,
		NULL ,
		LoadCursor ( NULL , IDC_ARROW ) ,
		( HBRUSH ) ( COLOR_WINDOW + 1 ) ,
		NULL ,
		CLASS_NAME ,
		NULL
	};

	// ウィンドウクラスの登録
	RegisterClassEx ( &wcex );

    static HWND hWnd;     //  ウィンドウハンドル
	static MSG msg;

	// ウィンドウスタイル定義
	const int wstyle = WS_OVERLAPPEDWINDOW &~ WS_MINIMIZEBOX &~ WS_MAXIMIZEBOX &~ WS_THICKFRAME ;

	RECT cr = { 0 , 0 , SCREEN_WIDTH , SCREEN_HEIGHT };
    AdjustWindowRect ( &cr , wstyle , FALSE );

	int ww = cr.right - cr.left;     // 画面(ウィンドウ表示)幅
	int wh = cr.bottom - cr.top;     // 画面(ウィンドウ表示)高

	// 初期ウィンドウ位置を真ん中に設定
	RECT dr;
    GetWindowRect ( GetDesktopWindow() , &dr );

    int dw = dr.right - dr.left;
    int dh = dr.bottom - dr.top;
    int wx = ww > dw ? 0: ( dw - ww ) / 2;
    int wy = wh > dh ? 0: ( dh - wh ) / 2;

    // ウィンドウを作成
	hWnd = CreateWindowEx ( 0 ,
		                    CLASS_NAME ,
							WINDOW_NAME ,
							wstyle ,
							wx,
							wy,
		                    ww ,
							wh ,
							NULL ,
							NULL ,
							hInstance ,
							NULL
							);

	// ウィンドウの表示
	ShowWindow ( hWnd , nCmdShow );
	UpdateWindow ( hWnd );

	while ( GetMessage ( &msg , NULL , 0 , 0 ) )
	{
		TranslateMessage ( &msg );
		DispatchMessage ( &msg );
	}

	return ( int ) msg.wParam;
}

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
	static HDC hDC;
	static HWND hWndEdit;                  // エディットボックス
	static HWND hWndButton_0;              // 0ボタン
    static HWND hWndButton_1;              // 1ボタン
	static HWND hWndButton_2;              // 2ボタン
	static HWND hWndButton_3;              // 3ボタン
	static HWND hWndButton_4;              // 4ボタン
	static HWND hWndButton_5;              // 5ボタン
	static HWND hWndButton_6;              // 6ボタン
	static HWND hWndButton_7;              // 7ボタン
	static HWND hWndButton_8;              // 8ボタン
	static HWND hWndButton_9;              // 9ボタン
	static HWND hWndButton_10;             // Cボタン
	static HWND hWndButton_11;             // +ボタン
	static HWND hWndButton_12;             // -ボタン
	static HWND hWndButton_13;             // *ボタン
	static HWND hWndButton_14;             // /ボタン
	static HWND hWndButton_15;             // =ボタン
	static char EditBoxLength;             // 表示文字数カウント
	static char NumLength [ 15 ];          // 文字連結前の文字数
	static char NumBox [ 2 ][ 14 ] ;       // 文字連結後の文字数
	static int Mode = 1;                   // 符号の前後判定
	static int CalculateMark;              // 計算符号判定
	enum { Plus , Minus , Multi , Div };   // 符号の状態
	static double Ans;                     // 計算結果
	static char AnsLength [14];            // 計算結果の表示数

	switch ( uMsg )
	{
	    case WM_CREATE:
			           hWndEdit = CreateWindowEx ( 0 , "EDIT" , "" , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT | ES_READONLY , 300 , 100 , 150 , 30 , hWnd , 
					                               ( HMENU ) ID_EDIT_000 (201) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_0 = CreateWindowEx ( 0 , "BUTTON" , "0" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_000 (101) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_1 = CreateWindowEx ( 0 , "BUTTON" , "1" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_001 (102) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_2 = CreateWindowEx ( 0 , "BUTTON" , "2" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_002 (103) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_3 = CreateWindowEx ( 0 , "BUTTON" , "3" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_003 (104) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_4 = CreateWindowEx ( 0 , "BUTTON" , "4" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_004 (105) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_5 = CreateWindowEx ( 0 , "BUTTON" , "5" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_005 (106) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_6 = CreateWindowEx ( 0 , "BUTTON" , "6" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_006 (107) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_7 = CreateWindowEx ( 0 , "BUTTON" , "7" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_007 (108) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_8 = CreateWindowEx ( 0 , "BUTTON" , "8" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_008 (109) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_9 = CreateWindowEx ( 0 , "BUTTON" , "9" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_009 (110) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_10 = CreateWindowEx ( 0 , "BUTTON" , "C" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_010 (111) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_11 = CreateWindowEx ( 0 , "BUTTON" , "+" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_011 (112) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_12 = CreateWindowEx ( 0 , "BUTTON" , "-" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_012 (113) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_13 = CreateWindowEx ( 0 , "BUTTON" , "*" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_013 (114) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_14 = CreateWindowEx ( 0 , "BUTTON" , "/" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_014 (115) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_15 = CreateWindowEx ( 0 , "BUTTON" , "=" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_015 (116) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   break;

		case WM_COMMAND:
			           // 0ボタンを押したら
			           if ( LOWORD ( wParam ) == ID_BUTTON_000 (101) )
					   {
						    EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

							// Cボタンを押した後なら
							if ( NumBox [ 0 ][ 1 ]  == '\0' )
						    {
							    SetWindowText ( hWndEdit , NumBox [ Mode ] );
						    }

							// 表示文字数が0なら
							if ( EditBoxLength == 0 )
							{
						        SetWindowText ( hWndEdit , "0" );
							}
							// 表示文字数が0より大きいなら
							else if ( EditBoxLength > 0 )
							{
								GetWindowText ( hWndEdit , NumLength , 15 );
								sprintf ( NumBox [ Mode ] , "%s0" , &NumLength [ 0 ] );  // 文字列の連結
								SetWindowText ( hWndEdit , NumBox [ Mode ] );
							}
					   }

					   // 1ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_001 (102) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 1 ][ 0 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
						   
						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "1" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s1" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 2ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_002 (103) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "2" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s2" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 3ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_003 (104) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "3" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s3" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 4ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_004 (105) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "4" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s4" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 5ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_005 (106) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "5" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s5" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 6ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_006 (107) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "6" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s6" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 7ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_007 (108) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "7" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s7" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 8ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_008 (109) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "8" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s8" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 9ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_009 (110) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "9" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s9" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // Cボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_010 (111) )
					   {
						   // 表示文字列を0にする
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   SetWindowText ( hWndEdit , "0" );
					   }
					   
					   // +ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_011 (112) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Plus;
						   Mode = 2;
					   }

					   // -ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_012 (113) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Minus;
						   Mode = 2;
					   }

					   // *ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_013 (114) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Multi;
						   Mode = 2;
					   }

					   // /ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_014 (115) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Div;
						   Mode = 2;
					   }

					   // =ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_015 (116) )
					   {
						   switch ( CalculateMark )
						   {
						       case Plus:
								         Ans = atof ( NumBox [ 1 ] ) + atof ( NumBox [ 2 ] );
								         break;
							   case Minus:
								         Ans = atof ( NumBox [ 1 ] ) - atof ( NumBox [ 2 ] );
								         break;
							   case Multi:
								         Ans = atof ( NumBox [ 1 ] ) * atof ( NumBox [ 2 ] );
								         break;
							   case Div:
								         Ans = atof ( NumBox [ 1 ] ) / atof ( NumBox [ 2 ] );
								         break;
						   }

						   sprintf ( &AnsLength [ 0 ] , "%s" , Ans );

						   SetWindowText ( hWndEdit , &AnsLength [ 0 ] );

						   memset ( NumBox , '\0' , sizeof ( NumBox ) );

						   Mode = 1;
					   }
					   
			           break;
					  
		case WM_KEYDOWN:
		               if( wParam == VK_ESCAPE )
		               {
		                  UINT nID = MessageBox ( NULL , "電卓を終了しますか?" , "Message" , MB_YESNO | MB_ICONEXCLAMATION );

		                  if ( nID == IDYES )
		                  {
		                      DestroyWindow ( hWnd );
		                  }
		               }
		               break;

		case WM_CLOSE:
			           MessageBox ( NULL , "ウィンドウを閉じます" , "Message" , MB_OK | MB_ICONEXCLAMATION );

    				   DestroyWindow ( hWnd );

					   break;

		case WM_DESTROY:
			            PostQuitMessage ( 0 );
						break;

	}

	return DefWindowProc ( hWnd , uMsg , wParam , lParam );
}

///////////////   EOF   ///////////////
質問の形式が分かっておらず、申し訳ありません。
再度、質問させてもらいます。
数字の最大表示数の指定と「C」で初期化の2点は、配列とmemsetを使って何とかなりました。(プログラム上、大丈夫なのか分かりませんが・・・)
うまくいかないのが、計算結果が出力されないということです。
どなたか教えてください。よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#7

投稿記事 by みけCAT » 8年前

とりあえずぱっと見で気づくことは
  • Numbox [ 2 ] は範囲外なので、アクセス(読み書き)してはいけません。
    要素数を増やすか、Numbox [ 2 ] (2のかわりに2以上の値を持つ変数を使っている場所も含む)へのアクセスを全て削除してください。
  • 525行目の sprintf ( &AnsLength [ 0 ] , "%s" , Ans ); は、printf系の関数に誤った型のデータを渡しているので未定義動作です。
    double型のデータをprintf系の関数で処理するための書式は%fです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sphere

Re: windowsAPIについて

#8

投稿記事 by sphere » 8年前

コード:

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
	static HDC hDC;
	static HWND hWndEdit;                  // エディットボックス
	static HWND hWndButton_0;              // 0ボタン
    static HWND hWndButton_1;              // 1ボタン
	static HWND hWndButton_2;              // 2ボタン
	static HWND hWndButton_3;              // 3ボタン
	static HWND hWndButton_4;              // 4ボタン
	static HWND hWndButton_5;              // 5ボタン
	static HWND hWndButton_6;              // 6ボタン
	static HWND hWndButton_7;              // 7ボタン
	static HWND hWndButton_8;              // 8ボタン
	static HWND hWndButton_9;              // 9ボタン
	static HWND hWndButton_10;             // Cボタン
	static HWND hWndButton_11;             // +ボタン
	static HWND hWndButton_12;             // -ボタン
	static HWND hWndButton_13;             // *ボタン
	static HWND hWndButton_14;             // /ボタン
	static HWND hWndButton_15;             // =ボタン
	static char EditBoxLength;             // 表示文字数カウント
	static char NumLength [ 15 ];          // 文字連結前の文字数
	static char NumBox [ 3 ][ 14 ] ;       // 文字連結後の文字数
	static int Mode = 1;                   // 符号の前後判定
	static int CalculateMark;              // 計算符号判定
	enum { Plus , Minus , Multi , Div };   // 符号の状態
	static double Ans;                     // 計算結果
	static char AnsLength [ 14 ];          // 計算結果の表示数

	switch ( uMsg )
	{

	    case WM_CREATE:
			           hWndEdit = CreateWindowEx ( 0 , "EDIT" , "0" , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT | ES_READONLY , 300 , 100 , 150 , 30 , hWnd , 
					                               ( HMENU ) ID_EDIT_000 (201) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_0 = CreateWindowEx ( 0 , "BUTTON" , "0" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_000 (101) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_1 = CreateWindowEx ( 0 , "BUTTON" , "1" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_001 (102) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_2 = CreateWindowEx ( 0 , "BUTTON" , "2" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_002 (103) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_3 = CreateWindowEx ( 0 , "BUTTON" , "3" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_003 (104) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_4 = CreateWindowEx ( 0 , "BUTTON" , "4" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_004 (105) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_5 = CreateWindowEx ( 0 , "BUTTON" , "5" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_005 (106) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_6 = CreateWindowEx ( 0 , "BUTTON" , "6" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_006 (107) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_7 = CreateWindowEx ( 0 , "BUTTON" , "7" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_007 (108) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_8 = CreateWindowEx ( 0 , "BUTTON" , "8" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_008 (109) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_9 = CreateWindowEx ( 0 , "BUTTON" , "9" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_009 (110) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_10 = CreateWindowEx ( 0 , "BUTTON" , "C" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_010 (111) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_11 = CreateWindowEx ( 0 , "BUTTON" , "+" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_011 (112) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_12 = CreateWindowEx ( 0 , "BUTTON" , "-" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_012 (113) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_13 = CreateWindowEx ( 0 , "BUTTON" , "*" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_013 (114) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_14 = CreateWindowEx ( 0 , "BUTTON" , "/" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_014 (115) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_15 = CreateWindowEx ( 0 , "BUTTON" , "=" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_015 (116) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   break;

		case WM_COMMAND:
			           // 0ボタンを押したら
			           if ( LOWORD ( wParam ) == ID_BUTTON_000 (101) )
					   {
						    EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

							// Cボタンを押した後なら
							if ( NumBox [ 0 ][ 1 ]  == '\0' )
						    {
							    SetWindowText ( hWndEdit , NumBox [ Mode ] );
						    }

							// 表示文字数が0なら
							if ( EditBoxLength == 0 )
							{
						        SetWindowText ( hWndEdit , "0" );
							}
							// 表示文字数が0より大きいなら
							else if ( EditBoxLength > 0 )
							{
								GetWindowText ( hWndEdit , NumLength , 15 );
								sprintf ( NumBox [ Mode ] , "%s0" , &NumLength [ 0 ] );  // 文字列の連結
								SetWindowText ( hWndEdit , NumBox [ Mode ] );
							}
					   }

					   // 1ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_001 (102) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 1 ][ 0 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
						   
						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "1" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s1" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 2ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_002 (103) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "2" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s2" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 3ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_003 (104) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "3" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s3" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 4ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_004 (105) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "4" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s4" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 5ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_005 (106) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "5" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s5" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 6ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_006 (107) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "6" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s6" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 7ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_007 (108) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "7" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s7" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 8ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_008 (109) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "8" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s8" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 9ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_009 (110) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "9" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s9" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // Cボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_010 (111) )
					   {
						   // 表示文字列を0にする
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   SetWindowText ( hWndEdit , "0" );
					   }
					   
					   // +ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_011 (112) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Plus;
						   Mode = 3;
					   }

					   // -ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_012 (113) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Minus;
						   Mode = 3;
					   }

					   // *ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_013 (114) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Multi;
						   Mode = 3;
					   }

					   // /ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_014 (115) )
					   {
						   // 表示文字列をリセット
					       memset ( NumBox [ Mode ] , '\0' , sizeof ( NumBox [ Mode ] ) );
						   CalculateMark = Div;
						   Mode = 3;
					   }

					   // =ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_015 (116) )
					   {
						   switch ( CalculateMark )
						   {
						       case Plus:
								         Ans = atof ( NumBox [ 1 ] ) + atof ( NumBox [ 3 ] );
								         break;
							   case Minus:
								         Ans = atof ( NumBox [ 1 ] ) - atof ( NumBox [ 3 ] );
								         break;
							   case Multi:
								         Ans = atof ( NumBox [ 1 ] ) * atof ( NumBox [ 3 ] );
								         break;
							   case Div:
								         Ans = atof ( NumBox [ 1 ] ) / atof ( NumBox [ 3 ] );
								         break;
						   }

						   sprintf ( &AnsLength [ 0 ] , "%f" , Ans );

						   SetWindowText ( hWndEdit , &AnsLength [ 0 ] );

						   memset ( NumBox , '\0' , sizeof ( NumBox ) );

						   Mode = 1;
					   }
					   
			           break;
					  
		case WM_KEYDOWN:
		               if( wParam == VK_ESCAPE )
		               {
		                  UINT nID = MessageBox ( NULL , "電卓を終了しますか?" , "Message" , MB_YESNO | MB_ICONEXCLAMATION );

		                  if ( nID == IDYES )
		                  {
		                      DestroyWindow ( hWnd );
		                  }
		               }
		               break;

		case WM_CLOSE:
			           MessageBox ( NULL , "ウィンドウを閉じます" , "Message" , MB_OK | MB_ICONEXCLAMATION );

    				   DestroyWindow ( hWnd );

					   break;

		case WM_DESTROY:
			            PostQuitMessage ( 0 );
						break;

	}

	return DefWindowProc ( hWnd , uMsg , wParam , lParam );     // 既定(default)の処理を提供
}

///////////////   EOF   ///////////////
長いので、ウィンドウプロシージャの部分だけにします。(前半部分は変更ありません)
NumBox[2][14]をNumBox[3][14]、%sを%fに変えました。また、Mode = 2をMode = 3で処理させました。
計算後の結果は出るようになりましたが、正しい答えが出力されません。
例えば、「 9 + 5 = 5.000000 」となり、「C」を押して2回目以降の計算をすると、訳の分からない答えが出力されてしまいます。
「=」ボタンのときの処理がうまくいっていないのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#9

投稿記事 by みけCAT » 8年前

sphere さんが書きました:また、Mode = 2をMode = 3で処理させました。
どうしてわざわざそんなことをしたのですか?

配列の確保された領域の範囲外をデリファレンスしてアクセスすると未定義動作となります。
やってはいけません。
やった場合は、何が起きてもおかしくありません。


以下、N1570より引用
4. Conformance さんが書きました: 2 If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint or runtime-
constraint is violated, the behavior is undefined.
6.5.6 Additive operators さんが書きました: Semantics
(中略)
8 When an expression that has integer type is added to or subtracted from a pointer, the
result has the type of the pointer operand.
(中略)
If the result points one past the last element of the array object, it
shall not be used as the operand of a unary * operator that is evaluated.
6.5.2.1 Array subscripting さんが書きました: 2 A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sphere

Re: windowsAPIについて

#10

投稿記事 by sphere » 8年前

NumBox[2][14]をNumBox[3][14]に変えて、Mode変数を使って、NumBox[mode]~としたのですが・・・。
この表現がダメなのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#11

投稿記事 by みけCAT » 8年前

sphere さんが書きました:NumBox[2][14]をNumBox[3][14]に変えて、Mode変数を使って、NumBox[mode]~としたのですが・・・。
この表現がダメなのでしょうか?
modeはMode変数ではないので、この質問の表現はダメですね。
範囲外にアクセスしなければ、配列やMode変数を使うことは全く問題ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sphere

Re: windowsAPIについて

#12

投稿記事 by sphere » 8年前

コード:

LRESULT CALLBACK WndProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
	static HDC hDC;
	static HWND hWndEdit;                  // エディットボックス
	static HWND hWndButton_0;              // 0ボタン
    static HWND hWndButton_1;              // 1ボタン
	static HWND hWndButton_2;              // 2ボタン
	static HWND hWndButton_3;              // 3ボタン
	static HWND hWndButton_4;              // 4ボタン
	static HWND hWndButton_5;              // 5ボタン
	static HWND hWndButton_6;              // 6ボタン
	static HWND hWndButton_7;              // 7ボタン
	static HWND hWndButton_8;              // 8ボタン
	static HWND hWndButton_9;              // 9ボタン
	static HWND hWndButton_10;             // Cボタン
	static HWND hWndButton_11;             // +ボタン
	static HWND hWndButton_12;             // -ボタン
	static HWND hWndButton_13;             // *ボタン
	static HWND hWndButton_14;             // /ボタン
	static HWND hWndButton_15;             // =ボタン
	static char EditBoxLength;             // 表示文字数カウント
	static char NumLength [ 15 ];          // 文字連結前の文字数
	static char NumBox [ 3 ][ 14 ] ;       // 文字連結後の文字数
	static int Mode = 1;                   // 符号の前後判定
	static int CalculateMark;              // 計算符号判定
	enum { Plus , Minus , Multi , Div };   // 符号の状態
	static double Ans;                     // 計算結果
	static char AnsLength [ 14 ];          // 計算結果の表示数
	static bool AcFlag = 0;                // 計算結果格納済みフラグ
	
	switch ( uMsg )
	{

	    case WM_CREATE:
			           hWndEdit = CreateWindowEx ( 0 , "EDIT" , "0" , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT | ES_READONLY , 300 , 100 , 150 , 30 , hWnd , 
					                               ( HMENU ) ID_EDIT_000 (201) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_0 = CreateWindowEx ( 0 , "BUTTON" , "0" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_000 (101) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_1 = CreateWindowEx ( 0 , "BUTTON" , "1" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_001 (102) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_2 = CreateWindowEx ( 0 , "BUTTON" , "2" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_002 (103) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_3 = CreateWindowEx ( 0 , "BUTTON" , "3" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_003 (104) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_4 = CreateWindowEx ( 0 , "BUTTON" , "4" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_004 (105) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_5 = CreateWindowEx ( 0 , "BUTTON" , "5" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_005 (106) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_6 = CreateWindowEx ( 0 , "BUTTON" , "6" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_006 (107) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_7 = CreateWindowEx ( 0 , "BUTTON" , "7" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 170 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_007 (108) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_8 = CreateWindowEx ( 0 , "BUTTON" , "8" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_008 (109) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_9 = CreateWindowEx ( 0 , "BUTTON" , "9" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_009 (110) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_10 = CreateWindowEx ( 0 , "BUTTON" , "C" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 240 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_010 (111) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_11 = CreateWindowEx ( 0 , "BUTTON" , "+" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 290 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_011 (112) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_12 = CreateWindowEx ( 0 , "BUTTON" , "-" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 360 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_012 (113) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_13 = CreateWindowEx ( 0 , "BUTTON" , "*" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 430 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_013 (114) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_14 = CreateWindowEx ( 0 , "BUTTON" , "/" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 380 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_014 (115) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   hWndButton_15 = CreateWindowEx ( 0 , "BUTTON" , "=" , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 310 , 500 , 70 , 70 , hWnd , 
					                                   ( HMENU ) ID_BUTTON_015 (116) , ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ) , NULL );

					   break;

		case WM_COMMAND:
			           // 0ボタンを押したら
			           if ( LOWORD ( wParam ) == ID_BUTTON_000 (101) )
					   {
						    EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

							// Cボタンを押した後なら
							if ( NumBox [ 0 ][ 1 ]  == '\0' )
						    {
							    SetWindowText ( hWndEdit , NumBox [ Mode ] );
						    }

							// 表示文字数が0なら
							if ( EditBoxLength == 0 )
							{
						        SetWindowText ( hWndEdit , "0" );
							}
							// 表示文字数が0より大きいなら
							else if ( EditBoxLength > 0 )
							{
								GetWindowText ( hWndEdit , NumLength , 15 );
								sprintf ( NumBox [ Mode ] , "%s0" , &NumLength [ 0 ] );  // 文字列の連結
								SetWindowText ( hWndEdit , NumBox [ Mode ] );
							}
					   }

					   // 1ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_001 (102) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 1 ][ 0 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
						   
						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "1" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s1" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 2ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_002 (103) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "2" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s2" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 3ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_003 (104) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "3" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s3" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 4ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_004 (105) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "4" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s4" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 5ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_005 (106) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "5" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s5" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 6ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_006 (107) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "6" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s6" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 7ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_007 (108) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "7" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s7" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 8ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_008 (109) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "8" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s8" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // 9ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_009 (110) )
					   {
						   EditBoxLength = GetWindowTextLength ( hWndEdit );          // 表示文字数カウント

						   // Cボタンを押した後なら
						   if ( NumBox [ 0 ][ 1 ]  == '\0' )
						   {
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }

						   // 表示文字数が0なら
						   if ( EditBoxLength == 0 )
						   {
						       SetWindowText ( hWndEdit , "9" );
						   }
						   // 表示文字数が0より大きいなら
						   else if ( EditBoxLength > 0 )
						   {
							   GetWindowText ( hWndEdit , NumLength , 15 );
							   sprintf ( NumBox [ Mode ] , "%s9" , &NumLength [ 0 ] );  // 文字列の連結
							   SetWindowText ( hWndEdit , NumBox [ Mode ] );
						   }
					   }

					   // Cボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_010 (111) )
					   {
						   // 配列の初期化
					       memset ( NumBox [ 1 ] , '\0' , sizeof ( NumBox [ 1 ] ) );
						   memset ( NumBox [ 3 ] , '\0' , sizeof ( NumBox [ 3 ] ) );
						   

						   // 表示文字列を0にする
						   SetWindowText ( hWndEdit , "0" );
						  
						   memset ( &AnsLength , '\0' , sizeof ( AnsLength ) );
						  
						   // 計算結果格納済みフラグを変更
						   AcFlag = 0;

						   Mode = 1;
					   }
					   
					   // +ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_011 (112) )
					   {
						   // 計算符号の設定
						   CalculateMark = Plus;

						   // 符号の後なので格納する配列を変更
						   Mode = 3;

						   // 計算結果が格納済みなら
						   if ( AcFlag == 1 )
						   {
							   Mode = 1;
						   }
					   }

					   // -ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_012 (113) )
					   {
						   // 計算符号の設定
						   CalculateMark = Minus;

						   // 符号の後なので格納する配列を変更
						   Mode = 3;

						   // 計算結果が格納済みなら
						   if ( AcFlag == 1 )
						   {
							   Mode = 1;
						   }
					   }

					   // *ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_013 (114) )
					   {
						   // 計算符号の設定
						   CalculateMark = Multi;

						   // 符号の後なので格納する配列を変更
						   Mode = 3;

						   // 計算結果が格納済みなら
						   if ( AcFlag == 1 )
						   {
							   Mode = 1;
						   }
					   }

					   // /ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_014 (115) )
					   {
						   // 計算符号の設定
						   CalculateMark = Div;

						   // 符号の後なので格納する配列を変更
						   Mode = 3;

						   // 計算結果が格納済みなら
						   if ( AcFlag == 1 )
						   {
							   Mode = 1;
						   }
					   }

					   // =ボタンを押したら
					   if ( LOWORD ( wParam ) == ID_BUTTON_015 (116) )
					   {
						   switch ( CalculateMark )
						   {
						       case Plus:
								         if ( AcFlag == 0 )
										 {
								             Ans = atof ( NumBox [ 1 ] ) + atof ( NumBox [ 3 ] );
										 }
										 // 計算結果が格納済みなら
										 else if ( AcFlag == 1 )
										 {
											 Ans = atof ( AnsLength ) + atof ( NumBox [ 1 ] );
										 }

								         break;

							   case Minus:
								         if ( AcFlag == 0 )
										 {
								             Ans = atof ( NumBox [ 1 ] ) - atof ( NumBox [ 3 ] );
										 }
										 // 計算結果が格納済みなら
										 else if ( AcFlag == 1 )
										 {
											 Ans = atof ( AnsLength ) - atof ( NumBox [ 1 ] );
										 }

								         break;

							   case Multi:
								         if ( AcFlag == 0 )
										 {
								             Ans = atof ( NumBox [ 1 ] ) * atof ( NumBox [ 3 ] );
										 }
										 // 計算結果が格納済みなら
										 else if ( AcFlag == 1 )
										 {
											 Ans = atof ( AnsLength ) * atof ( NumBox [ 1 ] );
										 }
								         break;

							   case Div:
								         if ( AcFlag == 0 )
										 {
								             Ans = atof ( NumBox [ 1 ] ) / atof ( NumBox [ 3 ] );
										 }
										 // 計算結果が格納済みなら
										 else if ( AcFlag == 1 )
										 {
											 Ans = atof ( AnsLength ) / atof ( NumBox [ 1 ] );
										 }

										 // 0で除算をしたときのエラー処理
										 if ( NumBox [ 1 ][ 0 ]  == '0' )
										 {
											 // エラーメッセージ表示
											 MessageBox ( hWnd , "0での除算はできません" , "エラー" , NULL );

											 // 配列の初期化
											 memset ( NumBox [ 1 ] , '\0' , sizeof ( NumBox [ 1 ] ) );
						                     memset ( NumBox [ 3 ] , '\0' , sizeof ( NumBox [ 3 ] ) );

											 return 0;
										 }

										 if ( NumBox [ 3 ][ 0 ]  == '0' )
										 {
											 // エラーメッセージ表示
											 MessageBox ( hWnd , "0での除算はできません" , "エラー" , NULL );

											 // 配列の初期化
											 memset ( NumBox [ 1 ] , '\0' , sizeof ( NumBox [ 1 ] ) );
						                     memset ( NumBox [ 3 ] , '\0' , sizeof ( NumBox [ 3 ] ) );

											 return 0;
										 }

								         break;
						   }

						   sprintf ( &AnsLength [ 0 ] , "%1.0f" , Ans );

						   // 計算結果出力
						   SetWindowText ( hWndEdit , &AnsLength [ 0 ] );
						   
						   // 配列の初期化
						   memset ( NumBox [ 1 ] , '\0' , sizeof ( NumBox [ 1 ] ) );
						   memset ( NumBox [ 3 ] , '\0' , sizeof ( NumBox [ 3 ] ) );

						   // 計算結果格納済みフラグを変更
						   AcFlag = 1;

						   // 格納する配列の変更
						   Mode = 1;
					   }
					   
			           break;
					  
		case WM_KEYDOWN:
		               if( wParam == VK_ESCAPE )
		               {
		                  UINT nID = MessageBox ( NULL , "電卓を終了しますか?" , "Message" , MB_YESNO | MB_ICONEXCLAMATION );

		                  if ( nID == IDYES )
		                  {
		                      DestroyWindow ( hWnd );
		                  }
		               }
		               break;

		case WM_CLOSE:
			           MessageBox ( NULL , "ウィンドウを閉じます" , "Message" , MB_OK | MB_ICONEXCLAMATION );

    				   DestroyWindow ( hWnd );

					   break;

		case WM_DESTROY:
			            PostQuitMessage ( 0 );
						break;

	}

	return DefWindowProc ( hWnd , uMsg , wParam , lParam );
}

///////////////   EOF   ///////////////
配列の表記の仕方、勉強になりました。
電卓プログラムのほうは上記のようにしてみました。
しかし、桁数が大きいものどうしを計算すると、0が表示されます。
また、1回目の計算をして、「C」で初期化してから2回目以降の計算をすると1回目の答えが出てきます。
どこをどう直せばよいかわからないので困ってます。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsAPIについて

#13

投稿記事 by みけCAT » 8年前

とりあえず、NumBoxに十分な要素数を確保して範囲外にアクセスしないようにしていただけますか?
したくない場合、範囲外にアクセスして未定義動作を起こすのにこだわる理由を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: windowsAPIについて

#14

投稿記事 by かずま » 8年前

コード:

    static char NumBox [ 3 ][ 14 ] ;       // 文字連結後の文字数
この宣言だと、NumBox[0], NumBox[1], NumBox[2] しか使えません。
それなのに、NumBox[3] を使っているのがだめだということです。
Mode = 1; で NumBox[Mode] があるので、NumBox[1] は使っているようですが、
NumBox[0] と NumBox[2] は使っていますか?

NumBox は一つでいいような気がしたので、次のようなプログラムを書いてみました。

コード:

#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 
#define CLASS_NAME      "サンプル"  // ウィンドウクラスの名前
#define WINDOW_NAME     "ウィンドウ表示処理"    // ウィンドウの名前
#define SCREEN_WIDTH    800     // ウィンドウの幅
#define SCREEN_HEIGHT   600     // ウィンドウの高さ
#define ID_EDIT_000     'E'     // エディットボックス
#define ID_BUTTON_000   '0'     // 0ボタン
#define ID_BUTTON_001   '1'     // 1ボタン
#define ID_BUTTON_002   '2'     // 2ボタン
#define ID_BUTTON_003   '3'     // 3ボタン
#define ID_BUTTON_004   '4'     // 4ボタン
#define ID_BUTTON_005   '5'     // 5ボタン
#define ID_BUTTON_006   '6'     // 6ボタン
#define ID_BUTTON_007   '7'     // 7ボタン
#define ID_BUTTON_008   '8'     // 8ボタン
#define ID_BUTTON_009   '9'     // 9ボタン
#define ID_BUTTON_CLR   'C'     // Cボタン
#define ID_BUTTON_ADD   '+'     // +ボタン
#define ID_BUTTON_SUB   '-'     // -ボタン
#define ID_BUTTON_MUL   '*'     // *ボタン
#define ID_BUTTON_DIV   '/'     // /ボタン
#define ID_BUTTON_EQ    '='     // =ボタン

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    WNDCLASSEX wcex = {
        sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0, 0, hInstance, NULL,
        LoadCursor(NULL, IDC_ARROW), (HBRUSH) (COLOR_WINDOW + 1),
        NULL, CLASS_NAME, NULL
    };
    RegisterClassEx(&wcex);

    int wstyle = WS_OVERLAPPEDWINDOW & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME;
    RECT cr = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
    AdjustWindowRect(&cr, wstyle, FALSE);

    int ww = cr.right - cr.left;    // 画面(ウィンドウ表示)幅
    int wh = cr.bottom - cr.top;    // 画面(ウィンドウ表示)高

    // 初期ウィンドウ位置を真ん中に設定
    RECT dr;
    GetWindowRect(GetDesktopWindow(), &dr);

    int dw = dr.right - dr.left;
    int dh = dr.bottom - dr.top;
    int wx = ww > dw ? 0 : (dw - ww) / 2;
    int wy = wh > dh ? 0 : (dh - wh) / 2;

    // ウィンドウを作成
    HWND hWnd = CreateWindowEx(0, CLASS_NAME, WINDOW_NAME, wstyle,
                            wx, wy, ww, wh, NULL, NULL, hInstance, NULL);

    // ウィンドウの表示
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hWndEdit;       // エディットボックス
    static char NumBox[24];     // 入力中の文字列
    static int Mode = 0;        // 1:入力中, 0:入力完
    static int CalculateMark = ID_BUTTON_ADD;   // 演算子
    static double Ans = 0;      // 計算結果
    static double Num = 0;      // 入力値

    static struct { const char *name; int x, y, id; } d[16] = {
        {"0", 170, 500, ID_BUTTON_000}, {"1", 170, 430, ID_BUTTON_001},
        {"2", 240, 430, ID_BUTTON_002}, {"3", 310, 430, ID_BUTTON_003},
        {"4", 170, 360, ID_BUTTON_004}, {"5", 240, 360, ID_BUTTON_005},
        {"6", 310, 360, ID_BUTTON_006}, {"7", 170, 290, ID_BUTTON_007},
        {"8", 240, 290, ID_BUTTON_008}, {"9", 310, 290, ID_BUTTON_009},
        {"C", 240, 500, ID_BUTTON_CLR}, {"+", 380, 290, ID_BUTTON_ADD},
        {"-", 380, 360, ID_BUTTON_SUB}, {"*", 380, 430, ID_BUTTON_MUL},
        {"/", 380, 500, ID_BUTTON_DIV}, {"=", 310, 500, ID_BUTTON_EQ },
    };

    switch (uMsg) {
    case WM_CREATE:
        hWndEdit = CreateWindowEx (0, "EDIT", "0",
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT | ES_READONLY,
            300, 100, 150, 30, hWnd, (HMENU)ID_EDIT_000,
            (HINSTANCE ) GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
        for (int i = 0; i < 16; i++)
            CreateWindowEx(0, "BUTTON", d[i].name,WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                d[i].x, d[i].y, 64, 64, hWnd, (HMENU)d[i].id,
                (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
        break;

    case WM_COMMAND: {
        int id_button = LOWORD(wParam);
        switch (id_button) {
        case ID_BUTTON_000: case ID_BUTTON_001: case ID_BUTTON_002: case ID_BUTTON_003:
        case ID_BUTTON_004: case ID_BUTTON_005: case ID_BUTTON_006: case ID_BUTTON_007:
        case ID_BUTTON_008: case ID_BUTTON_009: {
            char NumEdit[24];
            if (Mode == 0 || Num == 0)
                NumEdit[0] = '\0';
            else
                GetWindowText(hWndEdit, NumEdit, sizeof(NumEdit));
            sprintf(NumBox, "%s%c", NumEdit, id_button);
            SetWindowText(hWndEdit, NumBox);
            Num = atof(NumBox);
            Mode = 1;
            break;
        }
        case ID_BUTTON_CLR:
            Ans = 0;
            Num = 0;
            Mode = 0;
            CalculateMark = ID_BUTTON_ADD;
            SetWindowText(hWndEdit, "0");
            break;

        case ID_BUTTON_ADD:
        case ID_BUTTON_SUB:
        case ID_BUTTON_MUL:
        case ID_BUTTON_DIV:
        case ID_BUTTON_EQ:
            if (Mode == 1 || id_button == ID_BUTTON_EQ) {
                switch (CalculateMark) {
                case ID_BUTTON_ADD: Ans += Num; break;
                case ID_BUTTON_SUB: Ans -= Num; break;
                case ID_BUTTON_MUL: Ans *= Num; break;
                case ID_BUTTON_DIV: Ans /= Num; break;
                }
            }
            sprintf(NumBox, "%.15g", Ans);
            SetWindowText(hWndEdit, NumBox);
            if (id_button != ID_BUTTON_EQ)
                CalculateMark = id_button;
            Mode = 0;
        }
        break;
    }
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE) {
            UINT nID = MessageBox(NULL, "電卓を終了しますか?", "Message",
                           MB_YESNO | MB_ICONEXCLAMATION);
            if (nID == IDYES)
                DestroyWindow(hWnd);
        }
        break;

    case WM_CLOSE:
        MessageBox(NULL, "ウィンドウを閉じます", "Message",
                   MB_OK | MB_ICONEXCLAMATION);
        DestroyWindow(hWnd);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
同じような処理は、一つにまとめたほうが見やすいと思いませんか?

かずま

Re: windowsAPIについて

#15

投稿記事 by かずま » 8年前

かずま さんが書きました:

コード:

    static char NumBox [ 3 ][ 14 ] ;       // 文字連結後の文字数
この宣言だと、NumBox[0], NumBox[1], NumBox[2] しか使えません。
それなのに、NumBox[3] を使っているのがだめだということです。
Mode = 1; で NumBox[Mode] があるので、NumBox[1] は使っているようですが、
NumBox[0] と NumBox[2] は使っていますか?
「 1 以外の数字のボタン」を押したときには NumBox[0][1] を見ていますね。
だから、NumBox[0] を使っていないとは言えませんが、NumBox[0][1] に値を
入れているところがないので、常に 0 すなわち '\0' が入っていますね。

とにかく、NumBox[3] を使わずに、NumBox[2] を使いましょう。
そのとき、NumBox の宣言を static char NumBox[2][14]; にしちゃだめですよ。
Mode は 1 か 2。

閉鎖

“C言語何でも質問掲示板” へ戻る