• ベストアンサー

1と表示させたいが12と表示される

windows XP VC++.net 2003です。 よろしくお願いします。 症状は毎回コピーアンドペーストでプログラムを書くよりも 関数化してソースをきれいにしようと思い BOOL ButtonNumber (int bNumber,HWND hWnd) { long z; char sBuff[100]; char number[100]; wsprintf(number,"%d",bNumber); z = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(z == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); return TRUE; } if(z == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } z = atol(sBuff); wsprintf(sBuff,"%d1",z); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; } という関数を作りました。 numberに1という数字が入っていてエディットボックスに1と表示されるはずなのですが12と表示されてしまいます。 ためしにnumberに12と入れてみると表示されるのが122 123と入力すると1232と表示されてしまいます。 SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); どこも間違っていないように思いますが・・なんででしょう・・ 関数化せずmainに直接書き込んでいけば正常に1と表示されます・ switch (LOWORD(wParam)) { case IDC_BUTTON1: ButtonNumber(1,hWnd); case IDC_BUTTON2: a = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(a == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),"2"); return TRUE; } if(a == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } a = atol(sBuff); wsprintf(sBuff,"%d2",a); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; この場合BUTTON1は12と意図しない表示をしますが BUTTON2はちゃんと2と表示されます。 非常に困っていますよろしくお願いします。

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

  • ベストアンサー
  • 64bit
  • ベストアンサー率51% (45/88)
回答No.3

No.2です。ちょっと端折りすぎました。 原因はButtonNumber関数ではなく、 case IDC_BUTTON1のところでbreakしていないので、そのままBUTTON2の部分も実行されて、%d2の「2」が付加されているのでは、ということです。 流し読みなので未検証ですが・・・ 何を意図して「%d1」や「%d2」としているのでしょうか? (本題からそれますが、No.1さんの言うとおりインデントを付けて欲しかったです。また、aやzといった変数名は読みにくいのでやめましょう)

mudai_yeh
質問者

お礼

まさにそのとおりでした。汗 break入ってなかったです汗 電卓プログラムなので押したボタンを後ろにつけるということで%d1などと書いています。 ほかにもスマートな書き方があるようですが・・汗

その他の回答 (2)

  • 64bit
  • ベストアンサー率51% (45/88)
回答No.2

最後の方で、 >wsprintf(sBuff,"%d2",a); この「2」ではないですか?

  • Lbfuvab
  • ベストアンサー率36% (7/19)
回答No.1

見づらいですね。。。 インデントを付けて貰えませんか?(全角空白を使うなどして

mudai_yeh
質問者

補足

インデントつけてたんですが投稿したときスペースが消えました汗。 次回は全角スペースでちゃんとつけます汗

関連するQ&A

  • 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 ) ; }

  • 解像度が変わるとEditコントロールの位置がずれる

    いつも皆様、お世話になっております。 一つ教えてください。 解像度が変わるとエディット・コントロールの位置がずれるのですが、 ずばりクリックした行にエディット・コントロールを張り付かせたいです。 EditCellShow 関数は、セルを↑↓←→で移動した場合 や リストコントロールをスクロールした時などに呼び出されます。 (最後にクリックした行、列は、正しく拾えているものとします。) (そして、workRow、workColumnに代入されます。) 例えば、1280 × 800 ピクセル (Windows Vista 32bit)では、以下のコードで正常に動作します。 1920 × 1080 ピクセル (Windows7 64bit)では、上にずれます。 もし解像度の問題でなければすみません、でも他のXPマシンや Windows7 マシンでも正常に動作しました。 void CFileListCreatorDlg::EditCellShow(int workRow,int workColumn) {   if (m_xvChkEditCellMode == TRUE){     CFileListCreatorDlg::StatusStringSet(_T("ファイル名 や 備考欄 の 編集モードになりました (セルをクリックするか、クリック後 矢印キーで素早く移動、Enterで確定)"),0,FALSE);     //StatusStringSet()関数は、ステータス文字を画面上部に表示し、警告音を鳴らすユーザー関数   }   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_HIDE);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_HIDE);//追加2011.10.08   ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),_T(""));   //m_xcListは、IDC_LISTの変数名   m_xcList.SetItemState(workRow, // フォーカス&非選択状態にしたいアイテムのインデックス   !LVIS_FOCUSED | !LVIS_SELECTED, // 状態   LVIS_FOCUSED | LVIS_SELECTED); // マスク   //UpdateWindow(); HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST); RECT rect;   int nItem;   int nSubItem;   //何回も代入していますが、特に意味はありません、参考サイトのまま ソースコードを使いたかったので、それに合わせました。 nItem = workRow; nSubItem = workColumn;   LastSelectedRow = nItem;   LastSelectedColumn = nSubItem;   ////0:ファイル重複識別ナンバー 1:通し番号 2:フルパス 3:ファイル名 4:おおよそのデータサイズ 5:データサイズ 6:修正日 7:修正時間 8:備考欄 9:書式情報   if((nSubItem == 0 || nSubItem == -1 || nItem == -1) || (nSubItem != 3 && nSubItem != 8)){ //2011.09.22変更     //ファイル名と備考欄のみ編集可能に、他のカラムがクリックされた場合は、ファイル名編集欄に移動     nSubItem = 3;     LastSelectedColumn = nSubItem;   }   CFileListCreatorDlg::m_xcList.EnsureVisible(nItem, FALSE);   CString str = m_xcList.GetItemText(nItem,nSubItem);   ListView_GetSubItemRect(hWnd1,nItem,nSubItem,LVIR_BOUNDS,&rect);   if(nItem != -1)     ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT_Item),     HWND_TOP,rect.left + (18),rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか? rect.right-rect.left - 3, rect.bottom-rect.top -1,NULL);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_SHOW);   ::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT_Item));   ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),str);   ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),//追加2011.10.08     HWND_TOP,rect.left + (18) -17 ,rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか? 17, 12 ,NULL);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_SHOW);//追加2011.10.08 } 参考サイト: http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx?display=Print (主に、項番10を参考にしました。) 画像を初めて添付しますが、文字が小さいなどの不具合があったら、すみません。 (画像は帳尻あわせをして、正常に動いている時のものです。)

  • ボタンの表示変更方法

    いつもお世話になっております。 現在VC6.0を使ってボタンにアイコンを張ろうとしています。 リソースエディタを使って、ボタン(IDC_BUTTON)とアイコン(IDI_ICON)を 準備し、ボタンのプロパティでアイコンの欄をチェックした後 switch(message) case WM_INITDIALOG: { SendDlgItemMessage(hWnd, IDC_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetDlgItem(hWnd, IDI_ICON)); } return TRUE; としているのですが、実行するとなぜかボタンを押したときの処理が 繰り返されます。 ダイアログボックスのみのプログラムを作っており、このボタンを 押したらファイル選択画面になるのですが、ずっとファイル選択画面が ループしてダイアログが表示されません。 デバッグしてみても混合モードというものに入ってよくわかりません。 どうすればボタンにアイコンを乗せる事ができるのでしょうか? 皆さんの知恵を貸してください。 開発環境 VC++6.0 OS    WindowsXP

  • エディットボックスのテキストが表示されないのはなぜですか

    VC++初心者です。 以下のソースでエディットボックスのテキストが表示されません。というか、最後のループの時のみ表示されますが、一回一回表示するにはどうしたらいいでしょうか? void CCRPTC_accessDlg::OnBnClickedOk() {  int i;  CEdit* myEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1);    ・    ・    ・  for (i=1;i<10;i++){   if (Ret != SUCCESS)   {    myEdit1->SetWindowText("NG!");   }   else   {    myEdit1->SetWindowText("OK!");   }  } }

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • 猫でも 20章

    LRESULTはlong型、DWORDはmsdnより、「32 ビットの符号なし整数、またはセグメント アドレスとそれに関連するオフセット」、SendMessageは返り値はLRESULT型。それで、猫でもわかるプログラミング20章(http://www.kumei.ne.jp/c_lang/sdk/sdk_20.htm)、の上のほうにリスト等の情報を取得するのに、 int getDlg(HWND hDlgWnd) { GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str)); ScrPos = GetScrollPos(GetDlgItem(hDlgWnd, IDC_SCROLL1), SB_CTL); ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_LIST1), LB_GETCURSEL, 0L, 0L); ComboNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_COMBO1), CB_GETCURSEL, 0L, 0L); return 0; } とあるのですが、SendMessageを(int)(DWORD)とキャストしているのはなぜなんでしょうか。(int)ではダメですか?

  • 例外処理(初回)についてのご質問

    プログラムを実行させた時、下記の様なメッセージが出力されたあとに、特定の場所でエラーが出てしまいます。 色々と試して見たのですが、解決出来ずに困っております。何方かどの辺を調べれば良いか等のアドバイスをお願い致します。 <エラーメッセージ> "例外処理 (初回) は XXXX.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。" <停止場所> CWnd* CWnd::GetDlgItem(int nID) const { ここです→ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); } <エラーが発生するプログラム> BOOL CComProgramDlg::BinarySend(BYTE SendData[], unsigned long SendLength) { int Ret; unsigned long Len; ここら辺です→CStatic* pStic1 = (CStatic*)GetDlgItem(IDC_MSG_STATIC); Ret = WriteFile(m_hComm, &SendData[0], SendLength, &Len, NULL); if(!Ret)  return(FALSE); if(SendLength > Len)  return(FALSE); pStic1 -> SetWindowText("データを送信しました。"); return(TRUE); } 上記はデータシリアル通信の送信用で10回程度、このメンバ関数を通した時に急に発生します。 よろしくお願いいたします。

  • VC++2010 GDIオブジェクトの解放方法

    現在、VC++2010 MFCでアプリケーションを作成しています。 処理している内容は、ADボードから電圧値をもらい、それをエディットボックスに表示する処理ですが、タスクマネージャなどでみるとGDIオブジェクトが増加していき、9999になるとアプリケーションがフリーズしてしまいます。調べたところ、解放するプログラムが必要みたいですが、解放方法が分かりませんでしたので質問させていただきました。最初にエディットボックスのレイアウトを変更する処理をしています。 以下が今回のプログラムとなっております。 CFont* m_pFont;  CFont* m_pFont;m_pFont = new CFont; m_pFont->CreatePointFont(200,""); ((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT3))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT4))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT5))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont); DeleteObject(m_pFont); SetTimer(1,1000,NULL); 以下が毎秒処理となっております。 void Power_Noise::OnTimer(UINT_PTR nIDEvent) { m_nRet = m_pADControl->AD_In_Out(m_AD1,m_AD2,m_AD3,m_AD4,m_AD5,m_AD6); if(m_nRet == FALSE){ MessageBox("失敗"); KillTimer(1); } UpdateData(TRUE); m_xvEditVolt[0] = m_AD1; m_xvEditVolt[1] = m_AD2; m_xvEditVolt[2] = m_AD3; m_xvEditVolt[3] = m_AD4; m_xvEditVolt[4] = m_AD5; m_xvEditVolt[5] = m_AD6; UpdateData(FALSE); }

  • 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; }

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

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

専門家に質問してみよう