wsprintf関数の使い方について

このQ&Aのポイント
  • wsprintf関数を使用して数値を表示する方法について質問があります。
  • 現在の数値を変数に格納して、その後の処理で値を変化させた際に正しく表示する方法を知りたいです。
  • 具体的には、変数hpの値をwsprintf関数で文字列に変換し、TextOut関数で表示したいです。
回答を見る
  • ベストアンサー

wsprintf関数の使い方について

いつもお世話になっております。   いまいち、分からなくて質問しました。     int hp=60; としたとき、   TextOut(.............,hp,lstrlen(hp)); としようと思ってたんですけど、   文字がでないので、     wsprintf((LPWSTR)nowhp,"%d",hp); としたら、エラーがでて実行できませんでした。   TextOut関数で、60とだしたいのですが、 その後の処理で値が変わってくるので   TextOut(......................,TEXT("60")..........)   ともできず、困っています。      要は wsprintfに値を格納して その後の処理で   hp-=10   としても、 wsprintfでnowhpに値を格納し TextOutで50と表示されるようにしたいのです。     うまく説明できませんが、↑のようにする方法を   教えてください。   お願いします。

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

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

なんか怪しげなキャストが見えますが……。 wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。 int WINAPI wsprintfA (char *, const char *, ...); int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...); なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。 TCHAR nowhp[11]; wsprintf(nowhp, TEXT("%d"), hp); ただし, MSDN: wsprintf function (Windows) http://msdn.microsoft.com/es-ar/library/ms647550 には,wsprintfは使うな,と書いてありますので, TCHAR nowhp[11]; if (FAILED(StringCbPrintf(nowhp, sizeof(nowhp) / sizeof(nowhp[0]), TEXT("%d"), hp)) { // 失敗時処理 } のようにした方がよいでしょう。

crashbeen
質問者

お礼

回答ありがとうございます。   また、詳しいご説明、使用方法を書いていただいてありがとうございます。   これを参考に、やってみます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

wsprintf のプロトタイプはどうなっている?

crashbeen
質問者

お礼

プロトタイプ?   すいません、完璧な初心者なので、イマイチわかりません。   ↑の回答がわかりやすかったので、回答を締め切りました。   回答、ありがとうございました。

関連するQ&A

  • wsprintf( ポインタ , "%d" , "123" );

    char str[100]; char *ptr; wsprintf(str, "%d", "1234567"); と wsprintf(ptr, "%d", "1234567"); について、 TextOut(hDC,0,10,str,lstrlen(str)); TextOut(hDC,0,30,ptr,lstrlen(ptr)); で出力したいんだけど、str ならできたけど、 ptr の方が文字化けしていました。 lstrlen(ptr); がいけないのかと思って、 その値を調べたら 0 でした。 strlen( ) はポインタに対応していると思いました。 #include <iostream.h> main(){ char *p = "あいう"; cout << strlen(p); } で 6 だったから。 Win32 の lstrlen( ) はポインタに対応していないんですか?

  • C言語で文字列バッファを消去する方法

    今、C言語とWin32 APIを使ってプログラミングをしています。 wsprintf(str,TEXT("プレイヤーの攻撃!")); TextOut(hdc,0,520,bstr,lstrlen(str)); if(ehp <= 0) {    wsprintf(str,TEXT("敵を倒しました"));    TextOut(hdc,0,520,bstr,lstrlen(str)); } このコードを実行すると、2回目のTextOutのところで 「敵をたおしました撃!」と出てしまいます。 きっとstrに以前の文字列が残っているからだと思いますが、 この保存した文字列を消去するにはどうしたらよいのでしょうか? for文でstr[0]から'\0'までナル文字を代入し続けたり、いろいろと試したのですが駄目でした。どうかこんな自分にご助力お願いできないでしょうか? どうかお願い致します。

  • wParam

    wParamは、unsigned int型で、仮想キーコードを、格納してますよね。 wsprintf()内で(TCHAR)キャストしてますが、 これは、変数strの型がTCHAR型なので(wParamは、unsigned intなので型をあわせるために)やっているんですか? (TCHAR)キャストしないとエラーになりますか?教えてください。 HDC hdc; TCHAR str[255]; swich(umsg){   case WM_CHAR:     wsprintf( str, TEXT("%c"), (TCHAR)wPara );     hdc = GetDC(hwnd);     TextOut(hdc, 0, 0, str, lstrlen(str));     return0 }

  • (SHORT)

    ウインドウプロシージャ内ですが、(SHORT)は何のためについているんでしょうか?(どんな効果がありますか) 教えてください。 case WM_MOUSEWHEEL :     wsprintf(str,TEXT("WHEEL %s"),        ((SHORT)HIWORD(wparam))>0 ? TEXT("↑"):TEXT("↓"));     hdc=GetDC(hwnd);     TextOut(hdc,0,0,str,lstrlen(str));

  • 関数についての質問です。

    c言語を勉強しています。関数で戻り値がありますが、関数の処理の仕組みが理解できません。本等で勉強し僕の考え方が間違っていたら教えてください。 お願いいたします。 #include <stdio.h> int buy(int x,int y ) { int z; //1 printf("%d万円と%d万円の車を買いました。");//2 z=x+y; //3 return z; //4 } int main(void) { int num1,num2,num;//5 printf("いくらの車をかいますか?\n");//6 scanf("%d",&num1);//7 printf("いくらの車をかいますか?\n");//8 scanf("%d",&num2);//9 sum=buy(num1,num2);//10 printf("合計で%d万円です。\n",sum);//11 return 0;//12 } まず最初に 整数型、int num1,num2,numを読みます。 次に//7と//8で数値を入力します。 そして//10で値を格納し int buy( int x,int y)に値をわたします。 ※正確には関数buyに渡す。 そして計算をし計算結果 zをreturn で int buy(int x,int y )の buyに値を渡します。 そのあと呼び出し元の//10のbuyに値をかえします。 そしてプログラムが終了します。 間違っていたら教えてください。

  • エラー Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.

    五目並べのプログラムを作っているのですが、 下記2のサブルーチンを出る時に 下記1のようなランタイムエラーが どうしても出てしまいます。 原因が分からなく自分の力ではどうにもできないので、 どなたかアドバイスよろしくお願い致します。        記1 Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.        記2 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, x, y; static int nTe = 0; PAINTSTRUCT ps; HDC hdc; char szBuf[64], szSashite[16]; static HMENU hMenu; switch (msg) { case WM_CREATE: hMenu = GetMenu(hWnd); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); MyMakeBan(hdc); MyStoneDraw(hdc); if (bSente) strcpy_s(szSashite, "先手●"); else strcpy_s(szSashite, "後手○"); wsprintf((LPWSTR)szBuf, TEXT("差し手 = %s"), szSashite); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 30, (LPCWSTR)szBuf, strlen(szBuf)); wsprintf((LPWSTR)szBuf, TEXT("第 %02d 手終了 現在 %02d 手目待ち"), nTe, nTe + 1); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 50, (LPCWSTR)szBuf, strlen(szBuf)); EndPaint(hWnd, &ps); break;

  • 二つ以上の値を返す関数

    たとえば、a,bという値を関数に入れて、関数の中で変わったa,bを受け取るような方法はないでしょうか。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=138798 の int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x++; *y++; } を実行してみましたが、 「関数 'func' は定義されていません。int 型の値を返す外部関数と見なします。」 と出てきました。 助言をよろしくお願いします。

  • Rnd関数って

    VBのRnd関数を使って次のようにフォーム上に値を返させたときに疑問が沸いたのですが。 sub イベント() Dim Data As Single Randomize Data = Rnd() Text1.Text = Data Text2.Text = Int(Data * 100) end sub この何回かイベントを実行すると例えば text1  text2 0.367   36 0.782   78 8.591   8 の様に値が返されてきます。 ここで2つ不思議なのが HELPでRnd関数を調べると、0以上1未満の範囲の値を返します。となっているのに、なぜ8.591の様な値が出てくるのか? さらに8.591を100かけて小数点以下切り捨てると859になるはずが、なぜ8になるのか? 理由がわかる方教えてください。

  • getchar関数について

    初歩的なことなのかもしれませんが、お分かりになる方、教えてください。 getchar関数は、 int d; d = getchar(); のようにして使いますよね。 でも、 int c,d; do{  scanf("%d",&c) }while(c!= 0); d = getchar(); のように、getcharの前に繰り返し処理を置くとうまく実行できません。 なぜでしょう? ちなみにソフトはVisual C++6.0をつかってます。 よろしくお願いします。

  • TextOutについて

    ウィンドウの雛形に、 case WM_PAINT:{ static int t; PAINTSTRUCT ps; char cbuf[100]; HDC hdc = BeginPaint( hWnd, &ps ); wsprintf( cbuf, _T("on WM_PAINT%d"),t); TextOut(hdc,0,100,cbuf,sizeof(cbuf)); SetWindowText( hWnd, cbuf ); t++; EndPaint( hWnd, &ps ); break; } として実行したところ、ウィンドウを任意のところに重ねて、移動すると、SetWindowはタイトルバーにちゃんとの値が表示されるのですが、TextOutのtは再描画されないのですが、通っているのに描画されないのはなぜでしょうか?

専門家に質問してみよう