ページ 11

GetTextExtentpoint32関数について

Posted: 2012年5月14日(月) 13:30
by でぽる
「猫でもわかるゲームプログラミング」という本に従って、windowsアプリケーションで簡易アニメーションを作っていたんですがうまくいきません
本に書いてあるとおりに打ち込んだんですが、エラーが起きます

コード:

//textanimation.cpp

#define ID_MYTIMER 100
#define IDO 10

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

char szClassName[] = "wins01";

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
	               LPSTR lpsCmdLine, int nCmdShow)
{
	MSG msg;
	BOOL bRet;

	if(!InitApp(hCurInst))
		return FALSE;
	if(!InitInstance(hCurInst, nCmdShow))
		return FALSE;
	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRet == -1) {
			break;
		} else {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}

//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;	//プロシージャ名
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;	//インスタンス
	wc.hIcon = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR, 0, 0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;		//メニュー名
	wc.lpszClassName = (LPCSTR)szClassName;
	wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);

	return (RegisterClassEx(&wc));

}

//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
	HWND hWnd;

	hWnd = CreateWindow(szClassName,
		"猫でもわかるアニメーション",
		WS_OVERLAPPEDWINDOW,		//ウィンドウの種類
		CW_USEDEFAULT,				//x座標
		CW_USEDEFAULT,				//y座標
		288,						//幅
		105,						//高さ
		NULL,						//親ウィンドウのハンドル、親を作るときはNULL
		NULL,						//メニューハンドル、クラスメニューを使うときはNULL
		hInst,						//インスタンスハンドル
		NULL);
	if(!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id;
	static int x, clw, txtw;
	HDC hdc;
	PAINTSTRUCT ps;
	static HFONT hFont;
	char *lpszTxt = "猫";
	SIZE sz;
	RECT rc;
	static int dir = 0;		//0:右へ、1:左へ

	switch(msg) {
		case WM_CREATE:
			hdc = GetDC(hWnd);
			hFont = MyCreateFont("MS ゴシック", 50);
			SelectObject(hdc, hFont);
			GetTextExtentpoint32(
				hdc, lpszTxt, (int)strlen(lpszTxt), &sz);
			txtw = sz.cx;		//文字列の幅
			SetTimer(hWnd, ID_MYTIMER, 240, NULL);	//タイマのセット
			ReleaseDC(hWnd, hdc);
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			SelectObject(hdc, hFont);
			TextOut(hdc, x, 10, lpszTxt, (int)strlen(lpszTxt));
			EndPaint(hWnd, &ps);
			break;
		case WM_TIMER:
			if (wp != ID_MYTIMER)		//タイマIDの確認
				return DefWindowProc(hWnd, msg, wp, lp);
			GetClientRect(hWnd, &rc);	//クライアント領域のサイズ
			clw = rc.right;				//クライアント領域の幅
			
			//表示する位置の変更
			if (dir == 0) {
				x += IDO;
				if (x > clw - txtw) {
					x = clw - txtw;
					dir = 1;
				}
			} else {
				x -= IDO;
				if (x < 0) {
					x = 0;
					dir = 0;
				}
			}

			//無効領域を発生させWM_PAINTを発行させる
			InvalidateRect(hWnd, NULL, TRUE);
			break;
		case WM_CLOSE:
			id = MessageBox(hWnd, "終了します",
				"終了確認", MB_YESNOCANCEL);
			if (id == IDYES) 
				DestroyWindow(hWnd);
			break;
		case WM_DESTROY:
			//タイマやGDIオブジェクトの後始末
			KillTimer(hWnd, ID_MYTIMER);
			DeleteObject(hFont);
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

HFONT MyCreateFont(LPCTSTR face, int h)
{
	HFONT = hFont;
	hFont = CreateFont(h,		//フォントの高さ
		0,						//文字幅
		0,						//テキストの角度
		0,						//ベースラインとx軸との角度
		FW_BOLD,				//フォントの重さ(太さ)
		FALSE,					//イタリック体
		FALSE,					//下線
		FALSE,					//打ち消し線
		SHIFTJIS_CHARSET,		//文字セット
		OUT_DEFAULT_PRECIS,		//出力精度
		CLIP_DEFAULT_PRECIS,	//クリッピング精度
		PROOF_QUALITY,			//出力品質
		FIXED_PITCH | FF_MODERN,//ピッチとファミリ
		face);					//フォントフェイス名
	return hFont;
}
見直してみるとGetTextExtentpoint32の部分が定義されていないと表示されます
どうしてこの関数が正常に作動しないのか調べてみましたが、原因がわかりません

どうしてこうなるのかわかる方がいたら教えて頂きたいです
環境はwindows7、コンパイラはvisual C++ 2010です

Re: GetTextExtentpoint32関数について

Posted: 2012年5月14日(月) 13:33
by box
point
ではなくて
Point
なんていうことはないですよね、きっと。
でぽる さんが書きました:見直してみるとGetTextExtentpoint32の部分が定義されていないと表示されます
エラーメッセージは、何も加工せずに全文をそのまま載せていただけると助かります。
どこで何が起きているか、回答しようとする側が正確に状況を把握できるようにするためです。
ご協力のほどお願いいたします。

Re: GetTextExtentpoint32関数について

Posted: 2012年5月14日(月) 14:00
by でぽる
>>boxさん

その通りでした
すみません自分の不注意でした

エラーメッセージの件は次回使うことがあればそのまま載せるようにします