• 締切済み

C言語で画面がおかしくなる

最近C言語でプログラムを書き始めました。 二次関数を作るスクリプトなんですが、一定時間がたつと画面がおかしくなります。 どこが問題なのか探しても見つからないので、わかる方教えてください。 WinMainの部分は省いてます #include<windows.h> #include<stdio.h> #include <stdlib.h> #include<time.h> #define TIMER_ID 1 #define spy(num) (wy-num) int rnd(int r); void bset(HDC hdc, int x, int y); LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hDC; static int DesktopX ,DesktopY; static HDC hdc; static HDC Mhdc; static HBITMAP BMPhdc; PAINTSTRUCT paint; RECT Rect; LOGPEN lopnPen; POINT CursorP, ScreenP; char str[250]; int i; static int wx, wy ,ky; static double a ,b ,c ,x ,y ,n ,m ,s ,t; switch (msg) { case WM_DESTROY: DeleteObject( BMPhdc ); DeleteDC( Mhdc ); PostQuitMessage(0); return 0; case WM_CREATE: SetTimer(hwnd, TIMER_ID, 10, NULL); hDC = GetDC(hwnd); hdc = CreateCompatibleDC( hDC ); GetClientRect(GetDesktopWindow() ,&Rect); DesktopX = Rect.right ;DesktopY = Rect.bottom; BMPhdc = CreateCompatibleBitmap( hDC, DesktopX, DesktopY ); SelectObject( hdc, BMPhdc ); ReleaseDC( hwnd, hDC ); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); return 0; case WM_TIMER: ScreenP.x = LOWORD(lp); ScreenP.y = HIWORD(lp); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; if( ky == 1 ){ x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); } ClientToScreen(hwnd ,&ScreenP); GetCursorPos(&CursorP); s = CursorP.x-ScreenP.x; t = wy-(CursorP.y-ScreenP.y); InvalidateRect(hwnd, NULL, FALSE); return 0; case WM_RBUTTONDOWN: ky = 1; return 0; case WM_RBUTTONUP: ky = 0; return 0; case WM_PAINT: Mhdc = BeginPaint(hwnd, &paint); SelectObject(hdc , CreateSolidBrush(RGB(255,255,255))); lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , 0 , 0 , wx+1 , wy+1); SelectObject(hdc , CreateSolidBrush(RGB(255,0,0))); if ((s-n) != 0 && (n-x) != 0 && (s-x) != 0){ a = ((t-m)/(s-n) - (m-y)/(n-x)) / (s-x); b = (m-y)/(n-x) - a*(n+x); c = y - a*x*x -b*x; } bset(hdc, x,spy(y)); bset(hdc, n,spy(m)); bset(hdc, s,spy(t)); lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnColor = RGB(0,0,255); SelectObject(hdc , CreatePenIndirect(&lopnPen)); MoveToEx(hdc , -1 , spy( a + b - c) , NULL); for(i = 0 ; i <= wx ;i++){ LineTo(hdc , i , spy( a*i*i - b*i - c)); } BitBlt(Mhdc, 0, 0, DesktopX, DesktopY, hdc, 0, 0, SRCCOPY ); EndPaint(hwnd, &paint); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int rnd(int r){ static int flag; if (flag == 0) { srand((unsigned int)time(NULL)); flag = 1; } return (int)(rand()*(r+1.0)/(1.0+RAND_MAX)); } void bset(HDC hdc, int x, int y){ static LOGPEN lopnPen; lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , x-3 , y-3 , x+3 , y+3); return; }

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

普通はDeleteObjectで削除します デバイスコンテキストに選択されているのであれば選択を外してから削除するようにします http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_createpenindirect.asp 何かしらの統合環境を使っているのであれば ブレークポイントを設けて怪しそうな部分をつぶしましょう 統合環境でないのであれば 右クリックなどのメッセージでMessageBoxなどを使用するなどして変数をチェックしてみましょう

takoExA
質問者

補足

ペンなどのオブジェクトはDeleteObjectで削除しないといけなかったとは知りませんでした。 そこで、削除をしてみましたが症状は改善されませんでした。 変数の状態を調べてみても変わった様子もありません。 APIにエラーがあるのかと問題がありそうな関数の戻り値をすべて調べましたが、どれも異状なしでした。 わかったこと 自作の bset関数で設定している赤色が症状が発生したときに無視され その前の色で描画される

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのようにおかしくなるのかを具体的に説明しましょう ざっと見た感じでは CreateXXXIndirectでGDIオブジェクトを作りっぱなしな部分が多々見受けられます 使用後不要になったオブジェクトのハンドルは開放したほうがいいように思います

takoExA
質問者

補足

おかしくなるところは、一定時間が経過すると画面が真っ赤になります。 そして、普通だと青い線も描画されますが、それも出ません。 CreateXXXIndirect は SelectObject の関数の中で実行しているから、 ハンドルを開封する必要がないんじゃないでしょうか?

関連するQ&A

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • C言語についての質問です

    画面上でボールを動かすプログラムですこれの下にラケットをかきボールを打ち返して反射させたいのですがいまいちうまくいきませんどなたかご教授ください #define ID_TIMER 100 //タイマーの識別番号を100とする #include <windows.h> #include<stdlib.h> #include <string.h> #include <tchar.h> #define ELLIPSE_SIZE 40 // ボールのサイズを40画素とする LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);/*関数のプロトタイプを宣言をしよう*/ TCHAR ClassName[]=_T("Yellow Ball Animation");//ウィンドクラス TCHAR Caption[64]=_T("黄色のボールアニメーション"); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) //windowsのメインエントリ { WNDCLASSEX wcex;//ウインドウクラスの構造体 HWND hWnd;//ウインドウハンドル MSG msg;//メッセージ構造体 //ウィンドウクラス構造体を設定します。 wcex.cbSize=sizeof(WNDCLASSEX); wcex.style=CS_HREDRAW | CS_VREDRAW;// wcex.lpfnWndProc=(WNDPROC)WndProc;//ウィンドウプロージャの関数名 wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.hInstance=hInstance; wcex.hIcon=LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor=LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+3);/*背景は黒色(+1 背景白色、+2 背景灰色)*/ wcex.lpszMenuName =NULL; wcex.lpszClassName=_T("Ball-Anime"); wcex.hIconSm =LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex);//ウィンドクラスの登録 //ウインドウの作成 hWnd = CreateWindow(wcex.lpszClassName,//ウインドウクラス名 _T("ボールのアニメーション"),/*ウィンドウに表示されるタイトル 文字*/ WS_OVERLAPPEDWINDOW,//ウィンドウのスタイル CW_USEDEFAULT,//水平位置 CW_USEDEFAULT,//垂直位置 400,//ウィンドウの幅 600,//ウィンドウ高さ NULL,//親ウインドウ無し NULL,//ウインドウメニュー無し hInstance,//インスタンスハンドル NULL);//WM_CREATE情報 //ウインドウの表示 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); //メッセージループ while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;//戻り値を返します。 } LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; HBRUSH hBrush; static POINT pt;//構造体POINNT(x,y)を使う static BOOL xplus, yplus; static int id, speed=3; switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: SetTimer (hWnd, ID_TIMER,10,NULL);/*Timerを10ミリ毎秒に設定する*/ return 0; case WM_TIMER: if(xplus) pt.x+=speed; else pt.x-=speed; if(yplus)pt.y+=speed; else pt.y-=speed; GetClientRect(hWnd,&rect);/*クライアントのウィンドウサイズをシステムから得る*/ if(pt.x+ELLIPSE_SIZE > rect.right) xplus=FALSE; else if(pt.x < 0) xplus=TRUE; if(pt.y+ELLIPSE_SIZE >rect.bottom)yplus=FALSE; else if(pt.y < 0)yplus=TRUE; InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_CLOSE: id=MessageBox(hWnd,_T("終了しても良いですか"), _T("終了確認"), MB_YESNO); if(id ==IDYES) DestroyWindow(hWnd); break;//retrun 0でもOK case WM_KEYDOWN: if(wParam==VK_UP){ speed++; if(speed>15) speed=15; } if(wParam==VK_DOWN){ speed--; if(speed<1) speed =1; } wsprintf(Caption, _T("ボールの速度= %d"), speed); SetWindowText(hWnd,Caption); break;//retrun 0でもOK case WM_PAINT: hdc=BeginPaint(hWnd,&ps); hBrush=CreateSolidBrush(RGB(255,255,0));/*黄色のブラシを作成する*/ SelectObject(hdc,hBrush);/*作成した黄色ブラシを使用する*/ Ellipse(hdc,pt.x,pt.y, pt.x+ELLIPSE_SIZE, pt.y+ELLIPSE_SIZE); DeleteObject(hBrush); EndPaint(hWnd,&ps); return 0; } return DefWindowProc(hWnd,msg,wParam,lParam); }

  • 色描画

    以下は、ウインドウプロシージャ内でのプログラムです。 RGB( )ですが、0xFFは、255の事ですよね? x*0xFF/rect.rightこの計算式は、何を求めているんですか? 教えてください。 HDC         hdc; PAINTSTRUCT  ps; COLORREF    color; LONG        x,y; RECT        rect; switch(umsg){   case  WM_PAINT:       hdc =BeginPaint(hwnd,&ps);       GetClientRect(hwnd,&rect);       for(y=0;y<rect.bottom;y++){          for(x=0;x<rect.right;x++){            color=RGB(x*0xFF/rect.right,0,0);            SetPixel(hdc,x,y,color);          }       }

  • ファイルを開く。(API・C言語)

    case WM_RBUTTONUP: GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); return 0; ↑のソースは、ウィンドウを右クリックした後、ファイル名をタイトルバーに表示させるものなのですが、この、strFileを、ウィンドウの画面上に表示させるのに、 SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); TextOut(hdc , 40, 10, strFile, lstrlen(strFile)); で表示させてみようとしたところ、エラーが発生し、できませんでした。どうやるのでしょうか。ちなみに、strFileはstatic TCHAR型です。 また、ウィンドウから読み込んだテキストファイルを、ある文字列がどれだけあるか、などを数え、その後、その数を表示させたりもさせるプログラムを作っています。それで分からなかったのが、読み込んだファイルはTCHAR型ですよね。それをどうやってchar型に直すかです。 宜しくお願い致します。

  • DeleteObjectについて(初心者です)

    今こちらのサイトを参考に、APIを学んでいるものです。 http://wisdom.sakura.ne.jp/system/winapi/win32/win26.html 質問させて頂きますのはここの部分です。 LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; static LOGPEN lopnPen; PAINTSTRUCT ps; switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnWidth.x = 5; lopnPen.lopnColor = 0XFF; return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); SelectObject(hdc , CreatePenIndirect(&lopnPen)); Ellipse(hdc , 10 , 10 , 200 , 50); DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } 一度yahoo知恵袋にて質問したのですが、別の面で少し疑問が残ったのでここでもう一度質問させて頂きます。 SelectObjectは引数で渡されたオブジェクトを選択中にし、返り値として以前に選択していたオブジェクトを返すという回答がありましたが、それならば DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); のGetStockObjectの引数WHITE_BRUSHを別のもの(例えばBLACK_PEN)に置き換えても、返り値は以前選択していたオブジェクトのままなので何も相違ないはずですよね? 当方理解もままならない初心者ですから盛大な勘違いをしているかもしれません。 分かる方、どうかご教授お願いします。

  • なぜCreateHatchBushの設定が途中で喪失するのか

    いつもお世話になります。 縦縞の四角形を表示するプログラムですが、ある一定の四角形を描画すると四角形の中の縦縞がなくなり、白色になります。 原因が分かりません。アドバイスをお願い致します。 (四角形をマウスドラッグ中に小さくすると黒い線がたくさんでてきますが、これはアプリケーションの仕様です) プロシージャソースは以下の通り。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; static POINT start, end; static bool push; switch(msg) { case WM_CREATE: push = false; break; case WM_LBUTTONDOWN: start.x = LOWORD(lParam); start.y = HIWORD(lParam); push = true; break; case WM_MOUSEMOVE: if(push){ end.x = LOWORD(lParam); end.y = HIWORD(lParam); InvalidateRect(hWnd, NULL, FALSE); } break; case WM_LBUTTONUP: end.x = LOWORD(lParam); end.y = HIWORD(lParam); push = false; InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: HBRUSH hBrush; hDC = BeginPaint(hWnd, &ps); hBrush = CreateHatchBrush(HS_VERTICAL, RGB(255, 0, 0)); SelectObject(hDC, hBrush); Rectangle(hDC, start.x, start.y, end.x, end.y); DeleteObject(hBrush); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } よろしくお願い致します。

  • WinAPIで画像を更新し続けるには

    本を見ながら、WindowsSDKを使ってビットマップを描画する 所まではできたのですが、動かそうとすると上手くいきません。 ソースを簡略かして載せますと、以下のようにしています。 case WM_KEYDOWN: x++; // static MyDrawBitMap( hWnd, x, 10 ); ------------------------------------------------ void MyDrawBitMap( HWND hWnd, int x, int y ) { hdc = BeginPaint(hWnd, &ps); BitBlt( hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hMemDC, 0, 0, SRCCOPY); EndPaint(hWnd, &ps); このように書いてますが、ボタンを押しても画面に変化が出ません。 PAINTSTRUCTは再描画が必要な情報に関する構造体だとは解っていま すが、特に変更の必要の無い画像も再描画したい場合の処理はどうす れば良いのでしょうか?よろしくお願いします。

  • windowsAPI 画像の表示

    画像が表示できません。   表示は   LoadBitmap() と BitBlt() だと思うんですけど。。。   何回やってもできません。   LRESULT CALLBACK WindowProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { HMENU hMenu, hSubMenu; MENUITEMINFO mii; HDC hdc,hBuffer; RECT rect; TEXTMETRIC tm; PTSTR pstr; PAINTSTRUCT ps; static HFONT hFont; static HDC hMemDC; static HBITMAP hBitmap,hPrevBitmap; static BITMAP bitmap; switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CLOSE: if(MessageBox(hWnd,TEXT("ゲームを終了しますか?"),TEXT("アスパラインフォメーション"),MB_YESNO | MB_ICONINFORMATION) == IDYES){ DestroyWindow(hWnd); } return 0; case WM_COMMAND: //有効なメニューが選択され、メニューの選択が終了した switch(LOWORD(wParam)) { case IDM_NEW: pstr = TEXT("新しくゲームを始めますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ gamesystem = 1; InvalidateRect(hWnd,NULL,TRUE); } break; case IDM_OPEN: pstr = TEXT("ゲームをロードしますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ } break; case IDM_CLOSE: pstr = TEXT("ゲームを終了しますか?"); if(MessageBox(hWnd , pstr , TEXT("アスパラインフォメーション") , MB_YESNO | MB_ICONINFORMATION) == IDYES){ DestroyWindow(hWnd); } break; default: return 0; } return 0; case WM_MENUSELECT: //メニュー項目が選択された switch (LOWORD(wParam)) { case IDM_NEW: pstr = TEXT("新しくゲームを開始します"); break; case IDM_OPEN: pstr = TEXT("ゲームをロードします"); break; case IDM_CLOSE: pstr = TEXT("ゲームを終了します"); break; default: pstr = TEXT("ポップアップメニューが選択されています"); break; } hdc = GetDC(hWnd); GetClientRect(hWnd , &rect); GetTextMetrics(hdc , &tm); Rectangle(hdc , 0 , rect.bottom - tm.tmHeight * 2, rect.right , rect.bottom); TextOut(hdc , 5 , rect.bottom - tm.tmHeight * 1.5 , pstr , lstrlen(pstr)); ReleaseDC(hWnd , hdc); return 0; case WM_CREATE: mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID; mii.fType = MFT_STRING; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); mii.dwTypeData = TEXT("ニューゲーム(&N)"); mii.wID = IDM_NEW; InsertMenuItem(hSubMenu , 0 , TRUE , &mii); mii.dwTypeData = TEXT("ロード(&O)"); mii.wID = IDM_OPEN; InsertMenuItem(hSubMenu , 1 , TRUE , &mii); mii.dwTypeData = TEXT("終了(&X)"); mii.wID = IDM_CLOSE; InsertMenuItem(hSubMenu , 2 , TRUE , &mii); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.hSubMenu = hSubMenu; mii.dwTypeData = TEXT("ファイル(&F)"); InsertMenuItem(hMenu , 0 , TRUE , &mii); SetMenu(hWnd , hMenu); hFont = CreateFont( 40,0,0,0,750, FALSE,FALSE,FALSE, SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, VARIABLE_PITCH | FF_ROMAN,NULL); hBitmap = LoadBitmap( ((LPCREATESTRUCT)lParam)->hInstance , TEXT("KYARA") ); return 0; case WM_KEYDOWN: InvalidateRect(hWnd,NULL,FALSE); gamesystem += 1; return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); hBuffer = CreateCompatibleDC(hdc); SelectObject(hBuffer , hBitmap); BitBlt(hdc , 100 , 100 , 34 , 32 , hBuffer , 70 , 80 , SRCCOPY); DeleteDC(hBuffer); if(gamesystem == 1){ ・・・・・・・・・・・・・・・・・   といった感じです。   間違えがあれば、ご指摘お願いします。   また、わかりやすいサンプルコードを載せていただけたら嬉しいです。

  • VC++でシューティングゲームを作っているのですが・・・

    下のコードをビルドすると、 自分の意図としては、ウィンドウの左上に自機ビットマップが表示されてほしいのですが、 真っ黒な画面になってしまいます。 正確に言うと、背景が黒、自機ビットマップの画像が真っ黒、自機ビットマップの領域にあたる四角が白くなります。 症状に見当がつかないので、手を貸して頂きたいです。 よろしくお願いします。 ちなみに、wc.hdrBackgroundは(HBRUSH)(COLOR_WINDOW+1)となっています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; static RECT sizeWnd; static HDC hDC; PAINTSTRUCT ps; static HDC hMemDC; static HBITMAP hMemBmp; static HDC hMjDC; static HBITMAP hMjBmp; static BITMAP infoMjBmp; static POINT posMj; static int flagMjShot; static POINT posMjShot; switch (message) { case WM_CREATE: GetClientRect(hWnd, &sizeWnd); // クライアント領域の大きさをsizeWndに格納 // フロントバッファの初期処理 hDC = GetDC(hWnd); // バックバッファの初期処理 hMemDC = CreateCompatibleDC(hDC); // hDCと互換性をとるメモリデバイスコンテキストhMemDCを構築 hMemBmp = CreateCompatibleBitmap(hMemDC, sizeWnd.right, sizeWnd.bottom); // hMemDCと互換性のあるビットマップhMemBmpをsizeWndの大きさで生成 SelectObject(hMemDC, hMemBmp); // 自機ビットマップの初期処理 hMjDC = CreateCompatibleDC(hMemDC); // hMemDCと互換性をとるメモリデバイスコンテキストhMjDCを構築 hMjBmp = (HBITMAP)LoadImage( // ビットマップイメージMYJET(リソース)をhMjBmpに設定 (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDB_MYJET), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR ); SelectObject(hMjDC, hMjBmp); // hMjDCにhMjBmpを設定 GetObject(hMjBmp, sizeof(BITMAP), &infoMjBmp); // hMjBmpのビットマップ情報をBITMAP構造体infoMjBmpに格納 SetTimer(hWnd, 1, 10, NULL); // 100分の1秒毎にWM_TIMERメッセージを送るタイマー1をセット break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); // hDCにディスプレイのデバイスコンテキストのハンドルを格納 BitBlt( // hDCにバックバッファhMemDCを転送 hDC, 0, 0, sizeWnd.right, sizeWnd.bottom, hMemDC, 0, 0, SRCCOPY ); EndPaint(hWnd, &ps); break; case WM_TIMER: // 一定時間毎の処理 // 自機ビットマップをバックバッファhMemDCに描画 StretchBlt( // hMjDCを、posMjを左上の座標として縦横を3倍に引き伸ばしてhMemDCに転送 hMemDC, posMj.x, posMj.y, infoMjBmp.bmWidth * 3, infoMjBmp.bmHeight * 3, hMjDC, 0, 0, infoMjBmp.bmWidth, infoMjBmp.bmHeight, SRCCOPY ); InvalidateRect(hWnd, NULL, FALSE); break;

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

専門家に質問してみよう