MyDraw識別子とは?
- 猫でもわかるゲームプログラミングで勉強しているんですが、プログラミング初心者です。Visual C++2008ExpressEditionを使っています。
- 3章のpolyline01という複数の連続直線を描くプログラムなんですが、またコンパイルできず困っています。作者にも出版社にも連絡中ですですが返事来るか不安です。
- お分かりになる方、どうか教えてくださいm(_ _)m 先のプログラムはもっと多くのエラーでコンパイルできないようでした。・・・
- ベストアンサー
MyDraw識別子とは?
猫でもわかるゲームプログラミングで勉強しているんですが、プログラミング初心者です。 Visual C++2008ExpressEditionを使っています。 3章のpolyline01という複数の連続直線を描くプログラムなんですが、 またコンパイルできず困っています。作者にも出版社にも連絡中ですですが返事来るか不安です。 switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = 0; i < 25; i++) { MyDraw(hdc, 10 * i,10 * i,500 - 20 * i);←94行目 } EndPaint(hWnd, &ps); break; 結果>\visual studio 2008\projects\polyline01\polyline01\polyline01.cpp(94) : error C3861: 'MyDraw': 識別子が見つかりませんでした お分かりになる方、どうか教えてくださいm(_ _)m 先のプログラムはもっと多くのエラーでコンパイルできないようでした。・・・
- REINBOW01
- お礼率87% (7/8)
- C・C++・C#
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
コンパイラの気持ち 「"MyDraw" って出てきたけど,そんなの知らないよ・・・」 おそらく,別の場所で MyDraw 関数が定義されているはずですが, 使っている場所より前に宣言がないとコンパイラには分かりません。 プロトタイプ宣言をしてコンパイラに教えてあげましょう。 http://www.pc.uec.ac.jp/sp/hshrkw/edu/program/b1/Ex5-1.htm あと, 『猫でも~』のソースコードはダウンロードできます。 http://homepage2.nifty.com/c_lang/index.html
関連する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#
- ダブルバッファの作り方
画面に描画する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#
- 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#
- メモリデバイスコンテキストを用いた描画処理
お世話になります。 Borland C++ 5.5.1 for Win32で簡易な画像ビュアーを開発しています。 基本的な動作は完成したのですが、ある条件下で発生する問題を回避するために、メモリデバイスコンテキストを用いようと考えています。 ところが、後述のように変更したところ、画像がまったく表示されなくなりました。(ウィンドウ背景色で塗りつぶされたままです。一瞬たりとも表示されません。) Windowsプログラムに慣れていないため解決に難儀しています。 どなたか原因と対策をご教示くださいますようよろしくお願いします。 ////////////////////////// //変更前 画像表示される// ////////////////////////// case WM_PAINT: hdc = BeginPaint(hWnd, &ps); /* ~省略(画像処理)~ */ StretchDIBits(hdc,~,SRCCOPY);//処理した画像をウィンドウへ EndPaint(hWnd, &ps); break; //////////////////////////// //変更後 画像表示されない// //////////////////////////// case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hmemdc = CreateCompatibleDC(hdc); /* ~省略(画像処理)~ */ StretchDIBits(hdc,~,SRCCOPY);//処理した画像をMemoryDCへ BitBlt(hdc, 0, 0, rc.right, rc.bottom, hmemdc, 0, 0, SRCCOPY);//MemoryDCからウィンドウへ(rcはクライアント領域) DeleteDC(hmemdc); EndPaint(hWnd, &ps); break;
- ベストアンサー
- 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#
- 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;
- ベストアンサー
- C・C++・C#
- LPTSTR型の変数に文字を格納
LPTSTR型の変数に文字を格納 現在C言語でWindowsプログラミングを学習しています。 LPTSTR 型の変数にキーボードから入力されて1文字づつ格納したいのですが、 下記のコードであればうまくいきません。 自分がTCHARやLPTSTRのことを根本から理解できていないのが原因だと思うのですが。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { static LPTSTR buffer; HDC hdc; PAINTSTRUCT ps; switch(msg){ case WM_CHRAR: *buffer++=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_PRINT: hdc=BeginPaint(hWnd,&ps); DrawText(hdc,buffer,-1,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・
- ベストアンサー
- C・C++・C#
- 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; のようにしているのですが文字列が表示される場所が中央上部です。 何故なのでしょう? 自分としてはど真ん中辺りから表示されるようにしているつもりなのですが
- ベストアンサー
- C・C++・C#
- VCの描画について
今回は、円についてお聞きしたいです。 VCのAPI32が前提(MSNは使用しない)です。 円は、 WM_PAINT hDC=BeginPaint(hWnd,&ps); Ellipse(hDC,100,100,400,400); Endpaint(hWnd,&ps);で書いています。 問題点は、例えば、iの値が、2のときのみ実行したいという場合どうしたらいいですか? ifの位置を、hDCの前でいれると、ダイアログボックスが開きません Ellipseの一行でかますと、変な円になってしまいます。 どうしたらいいんでしょう(;;) あと、野菜50%・肉30%・魚20%という円グラフにしたい場合、 ラジアンで分割したあと、どういうふうに、円分割したらいいでしょうか? できればアドバイスおねがいします><
- ベストアンサー
- C・C++・C#
- Rectangleで、リソースが解放されない
只今 Borland C コンパイラ 5.5.1 においてプログラムを書いているのですが、(C言語) 仕様なのかどうなのか、ある処理でウィンドウのサイズを ぐりぐり動かしつづけるとリソースが減っていって フリーズしていしまいます。使用しているWindowsは98SEです。 そのプログラムは、ウィンドウプロシージャにおいて、 case WM_PAINT: hdc = BeginPaint(hWnd,&ps); hPen = CreatePen(PS_SOLID, 0, RGB(255,0,0)); hOldPen = (HPEN)SelectObject(hdc, hPen); hBrush = CreateSolidBrush(RGB(0,255,0)); Rectangle(hdc, 10,10,100,100); DeleteObject(hPen); SelectObject(hdc, hOldPen); DeleteObject(hBrush); DeleteObject(hOldPen); EndPaint(hWnd,&ps); break; という風に、Rectangle関数で画面に四角形を描画しているのですが、どうも上記の処理を何度も行うことにより リソースが解放されずに大量に消費されてしまいます。 C言語においてはまだ少しわかるほどのレベルで、 殆どの関数の意味を今だに理解していなくプログラムの 文法になにかしらの間違いがあるかもしれませんが、 ご指摘いただければ幸いです。
- ベストアンサー
- C・C++・C#
お礼
最後のブロックでMyDrawが出てきますが、URLの通りのプロトタイプ宣言、そこに最後のブロックと同じ int MyDraw(HDC hdc, int x, int y, int inc) + ; をコピペしたらなんとかコンパイルできました! どうもありがとうございます。