C++のwindowsアプリケーションで数字を表示させる方法
- C++のwindowsアプリケーションで数字を表示させる方法を解説します。
- アプリケーションの描画コードに数値を表示させる方法をご紹介します。
- 具体的なコードを使用して、数字を表示させる手順を説明します。
- ベストアンサー
C++のwindowsアプリケーションについて
windowsアプリケーションで 数字を表示させたいのですができません。 文字列に置き換えないといけないみたいなのですが。なかなかうまくいきませんでした。 :上省略: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 描画コードをここに追加してください... int a; a=10; char buf[10]; sprintf(buf,"%d",a); TextOut(hdc,100,20,L"Hello Window!",13); TextOut(hdc,100,50,L"buf",10); としたのですが Hello Window!は表示されるのですが そのしたに10と表示させるにはどうしたらよいでしょうか?? #include <stdio.h>は上に書いてあります。 詳しい解説よろしくお願いします。
- yuyakun
- お礼率14% (7/50)
- C・C++・C#
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
char buf[10]; sprintf(buf,"%d",a); TextOut(hdc,100,50,buf,strlen(buf); じゃないんですかね? ユニコード文字セットを~とかの場合は必要に応じて読み替えて下さい。
関連するQ&A
- TextOut( ) が動かない
LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN: if( wParam == VK_ESCAPE ){ hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); } break; case WM_PAINT: break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN: if( wParam == VK_ESCAPE ){ hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。
- ベストアンサー
- C・C++・C#
- TextOut( ) を BeginPaint( ) と GetDC( )
LRESULT CALLBACK の case WM_PAINT: で、 hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); ↑問題無し。↓文字がちらつく。 hdc = GetDC(hWnd); TextOut(hdc,0,0,str,strlen(str)); ReleaseDC(hWnd,hdc); ちらつきの原因は、高速で TextOut( ) が繰り返されるから だと思いました。 どうして TextOut( ) が繰り返されるんですか? 上の方法の場合は、 ReleaseDC(hWnd,hdc); は書かなくてもいいですか?
- ベストアンサー
- C・C++・C#
- 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は再描画されないのですが、通っているのに描画されないのはなぜでしょうか?
- 締切済み
- C・C++・C#
- BeginPaintの使い方
現在windowsプログラミングを勉強しています。 まだまだはじめたばかりでwindowsプログラミングの把握できていない部分が多々あるので、何か使い方が根本的に間違えているところがあるかもしれませんが、ご容赦ください。 case WM_PAINT: hdc=BeginPaint(hdc,&ps);/*rc,hdc等は宣言済み*/ TextOut(hdc,0,0,szStr,(int)strlen(szStr));/*szStr="文字列"代入済み*/ EndPaint(hWnd,&ps);/*hWnd等は宣言済み*/ break; において、 1.ダブルクリックしたら表示させよう!と思いまして、 WM_PAINT→WM_RBUTTONDBLCLKSと変更したところ表示されなくなりました。 しかし、hdc取得をGetDCで行うとうまくいきました。この違いがよくわかりません。 2.次はダブルクリックすると文字を右に動かそう!と思いまして、 TextOut(hdc,i,0,・・・・)などといたしましてiを増やしたところ更新前の画像が残りました。そこでInvalidateRectによって背景消去しようとおもいまして、TextOutの前に挿入しましたがこれによっても初めから、クリック後も何も表示されなくなりました。 1と2の2点に関して、どなたかご教授いただけないでしょうか。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- WM_PAINT
WM_PAINT について教えてほしいのですが、 WM_PAINTがシステムから発行されるタイミングとして、 クライアント領域に無効領域がある時 UpdateWindow()を呼び出した時 InvalidateRect()を呼び出した時があると思いますが 例えば LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) { LPCTSTR Str = TEXT("Kitty"); switch (msg) { case WM_CREATE: hdc = GetDC(hwnd); SetTextColor(hdc , RGB(255, 0 , 0)); ReleaseDC(hwnd , hdc); return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); TextOut(hdc, 10 , 10 , Str, lstrlen(Str)); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } の場合, WM_PAINTはどのタイミングでシステムから呼び出されるんですか? WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。 いつシステムから送られるかご教授をお願いします。
- ベストアンサー
- C・C++・C#
- SDKでウィンドウの中央に文字列を表示させる方法
ウィンドウの中央に文字列sを表示させる方法を教えて下さい。 /********************************** WM_PAINTで TCHAR s[80]; HDC hDC; PAINTSTRUCT ps; RECT rc; GetClientRect(hWnd, &rc); hDC = BeginPaint(hWnd, &ps); TextOut(hDC, rc.right / 2, rc.bottom / 2, tcDayTime, lstrlen(s)); EndPaint(hWnd, &ps); return FALSE; ***********************************/ GetClientRect(hWnd, &rc);でウィンドウのサイズを取得し、 TextOutの第2、第3引数で ウィンドウ幅/2、ウィンドウ高さ/2 としていますが、これだと中央から表示されてしまいます。 できれば、ウィンドウのサイズを変更してもウィンドウの中央に表示させたいです。 #VC ++ 6.0 & Win98 & SDK で作成してます。
- ベストアンサー
- C・C++・C#
- VOID型をSTRUCTのように
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; static void *v = "abcdefg"; switch(msg){ case WM_PAINT: hDC = GetDC(hWnd); TextOut(hDC, 0, 0, (char*)v, strlen((char *)v)); ReleaseDC(hWnd, hDC); ValidateRect(hWnd, NULL); break; これで abcdefg が表示されるけど、defg を表示される方法が 分かりません。 abcdefg の文字列の長さは不明です。 char buf[1000]; のように大きく確保すればいいんだけど、そういうのをせず、 動的にやろうと考えています。 TextOut(hDC, 0, 0, &(((char*)v)+3), strlen((char *)v)-3); だと、メモリ上に配置されなければならない というエラーになります。 よい方法があったら教えてください。
- ベストアンサー
- C・C++・C#
- SetBkMode( ) (HBRUSH)GetStockObject( )
case WM_PAINT: hDC = BeginPaint(hWnd, &ps); SetBkMode(hDC, LTGRAY_BRUSH); TextOut(hDC,0,0,szHello,strlen(szHello)); EndPaint(hWnd, &ps); break; これは、int WINAPI WinMain( ) で wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); としてないと、SetBkMode( ) が無効になりました。 GetStockObject( ) の意味を知らないけど、これによって LTGRAY という色が特別なものになるんだと思いました。 窓の背景色を wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); で黒にした場合に、TextOut( ) の背景色を灰色にするには どう書けばいいんですか?
- ベストアンサー
- C・C++・C#
- 別関数に渡す変数のポインタが難しい
構造体初心者で、ポインタもよく分かっていません。 12, 8 と表示するつもりのソースだけど、実行結果は違っていました。 直してください。 ソースは長いけど、スケルトンに構造体とTextOutを付けたぐらいのものです。 #include <windows.h> struct MYOBJ { int a; int b; }; LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { MSG msg; WNDCLASS wc; 投稿できなかったからここを消しました。 wc.lpszClassName = "x"; if(RegisterClass(&wc) == 0)return 0; HWND hWnd = CreateWindow("x","",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,320,240,NULL,NULL,hInst,NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void myfunc(struct MYOBJ *obj)//ここが違うかもしれません。 { obj->a += 2; obj->b -= 2; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; char buf[30]; switch(uMsg) { case WM_CREATE: struct MYOBJ myobj; myobj.a = 10; myobj.b = 10; myfunc(&myobj);//ここが違うかもしれません。 return 0; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); wsprintf(buf, "%d, %d", myobj.a, myobj.b); TextOut(hDC, 0, 0, buf, strlen(buf)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
- ベストアンサー
- C・C++・C#
- ダブルバッファの作り方
画面に描画するBCC5.5 のCプログラムがあります。画面がちらつくので、ダブルバッファにしたいのですが、具体的に、どの関数を呼んで実装したらよいのかわかりません。WEB検索をしますと結構情報がヒットしますが、解決に至ってませんので、よろしくお願いします。 具体的にやったことは、現在動いているプログラムの case WM_PAINT: hdc=BeginPaint(hWnd,&ps); paint(hdc); // 自作の描画プログラム本体 ReleaseDC(hWnd,hdc); EndPaint(hWnd,&ps); break; の部分を、「画面サイズのビットマップイメージhBitmapをつくり、そこにpaint関数で描き込み、最終画面を一気に出力する」というつもりで以下のプログラムに書き換えたのですが、表示すらしなくなってしまいました。何が悪いのかお教えください。 case WM_PAINT: GetClientRect(hWnd,&rt); h = (int)rt.bottom; w = (int)rt.right; hBuffer = CreateCompatibleDC(NULL); hBitmap = CreateCompatibleBitmap(hBuffer, w, h); SelectObject(hBuffer, hBitmap); paint(hBuffer); hdc=BeginPaint(hWnd,&ps); BitBlt(hdc, 0,0,w,h, hBuffer,0,0, SRCCOPY); ReleaseDC(hWnd,hdc); EndPaint(hWnd,&ps); DeleteDC(hBuffer); DeleteObject(hBitmap); break;
- ベストアンサー
- C・C++・C#
お礼
ごめんない。入力を間違えていました。 できました。 ありがとうございました。
補足
マルチバイト文字セットに直して実行してみましたが。 bufと表示されてそれ以降文字化けしてします。