• 締切済み

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は再描画されないのですが、通っているのに描画されないのはなぜでしょうか?

  • 79562
  • お礼率68% (164/239)

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.4

何を思って、BeginPath、EndPath を使おうと思ったのか、理解出来ません。 説明できるでしょうか? > もしかしてTextOut()ではできないということでしょうか? えっと。何が理解出来ていて、何が理解出来てないのか、一度整理した方が良 いのではないでしょうか。 内容を理解しないまま、なんとなく、コーディングをして、理解しないまま放 置してある、様に感じます。 質問の内容が的を得ないのも、調べ方がトンチンカンなのも、このあたりが理 由ではないかと思います。 例えば、 使用する API のリファレンスページを確認しますよね。 そこで、「リージョン」とか「パス」とか、わからない単語が見つかると、 「リージョン」、「パス」の意味を調べるはずです。まさか知らないまま放置 して、API の説明を理解できるとは考えないでしょう。 Win32 API と GDI について、お勉強できそうなサイトを見つけました。 一度、お勉強しなおしてみてはいかがでしょう。 ・標準 Windows API http://wisdom.sakura.ne.jp/system/winapi/win32/index.html

79562
質問者

お礼

回答ありがとうございます。今そのサイトでお世話になっていてその描画領域のサイズまで進めたところです。このサイトを勉強すれば出きるようになるのでしょうか?

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

> 回答有難うございます。今も調べてみているのですが、”テキスト出力する > 領域を、更新が必要な領域としてマーク”検索などをかけてはみたのですが、 > 自分では調べることができませんでした。どういうことなのかさっぱりです > ・・・何かヒントなどいただけないでしょうか? いったいどこを探しているのだろう。 APIを使うなら、まずリファレンスページは目を通す事をお勧めします。 ・BeginPaint http://msdn.microsoft.com/ja-jp/library/cc428337.aspx ・EndPaint http://msdn.microsoft.com/ja-jp/library/cc428553.aspx ・TextOut http://msdn.microsoft.com/ja-jp/library/cc428775.aspx

79562
質問者

お礼

回答ありがとうございます。 リファレンスページを参考にしたのですが、 case WM_PAINT:{ static int t; PAINTSTRUCT ps; wchar_t cbuf[100]; HDC hdc = BeginPaint( hWnd, &ps ); BeginPath(hdc); wsprintf( cbuf, _T("on WM_PAINT%d"),t); TextOut(hdc,0,100,cbuf,sizeof(cbuf)); EndPath(hdc); SetWindowText( hWnd, cbuf ); t++; EndPaint( hWnd, &ps ); break; } とやっても今度は表示自体されませんでした。 なにがいけないのでしょうか?

79562
質問者

補足

もしかしてTextOut()ではできないということでしょうか?

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

>>テキスト出力する領域を、更新が必要な領域としてマークしてみてはいかがですか。 >具体的にどうすればいいのでしょうか?よろしくお願いします。 調べれば、すぐにわかりそうな事ですが、調べてからの発言でしょうか? どのような事を調べたのかは、伝わってきませんよ。

79562
質問者

お礼

回答有難うございます。今も調べてみているのですが、”テキスト出力する領域を、更新が必要な領域としてマーク”検索などをかけてはみたのですが、自分では調べることができませんでした。どういうことなのかさっぱりです・・・何かヒントなどいただけないでしょうか?

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

BeginPaint, EndPaintで、更新リージョンのクリッピングが行われているんじゃないかな。 テキスト出力する領域を、更新が必要な領域としてマークしてみてはいかがですか。 あと、char、TCHAR、wchar_tが混合しているみたいです、調べて修正しましょう。

79562
質問者

お礼

回答ありがとうございます。 >テキスト出力する領域を、更新が必要な領域としてマークしてみてはいかがですか。 具体的にどうすればいいのでしょうか?よろしくお願いします。

関連する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: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。

  • 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); は書かなくてもいいですか?

  • 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 で作成してます。

  • WinAPIでRECT構造体の宣言について

    PAINTSTRUCT ps; HDC hdc; RECT rct={200,200,200,200}; char *szStr = "あけまして\n\tおめでとう"; switch (msg) { case WM_PAINT: GetClientRect(hWnd, &rct); hdc = BeginPaint(hWnd, &ps); DrawText(hdc, (LPCTSTR)szStr, -1, &rct, DT_CENTER | DT_WORDBREAK); EndPaint(hWnd, &ps); break; のようにしているのですが文字列が表示される場所が中央上部です。 何故なのでしょう? 自分としてはど真ん中辺りから表示されるようにしているつもりなのですが

  • 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点に関して、どなたかご教授いただけないでしょうか。よろしくお願いします。

  • 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()もつかっていないのですが。 いつシステムから送られるかご教授をお願いします。

  • ダブルバッファの作り方

    画面に描画する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;

  • ExtTextOut

    WIN32,VISUAL C++2005にて開発してます。 下記のプログラムを実行すると文字化けします。 原因と解決策を教えてください。 ウィンドウの背景色と同じ色にしようとすると文字化けします。 WIN32初心者なので出来るだけ分かりやすくお願いします。 case WM_PAINT: HDC hdc; PAINTSTRUCT paint; wchar_t *str = L"Ver***byKKK"; COLORREF sCOLOR = SetBkColor(hdc,GetBkColor(hdc)); hdc = BeginPaint(hWnd, &paint); ExtTextOut(hdc,120,225,sCOLOR,NULL,(LPCTSTR)str, wcslen(str),NULL); EndPaint(hWnd, &paint); break;

  • 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( ) の背景色を灰色にするには どう書けばいいんですか?

  • エラー 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;