ページ 11

文字の描画

Posted: 2007年7月17日(火) 17:17
by Lbfuvab
SDKで簡単なチェスのプログラムを作ろうと思って試作品を作ったのですが文字の背景で白く消えてしまいます。
どうしたらいいのでしょう。
#include <windows.h>


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
ATOM InitApp(HINSTANCE hInst);
BOOL InitInstance(HINSTANCE hInst, int nCmdShow);
void DrawChessboard(HDC,short,short);
BOOL GetCurPos(short*,short*,LPARAM);

char szClassName[/url] = "WinChess";    //ウィンドウクラス
char *kihu[8][8]={
	{"r","p","","","","","P","R"},
	{"n","p","","","","","P","N"},
	{"b","p","","","","","P","R"},
	{"q","p","","","","","P","Q"},
	{"k","p","","","","","P","K"},
	{"b","p","","","","","P","B"},
	{"n","p","","","","","P","N"},
	{"r","p","","","","","P","R"}};
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 | CS_DBLCLKS;
	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=NULL;

	return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow){
	HWND hWnd;

	hWnd=CreateWindow(szClassName,
			"Winchess", //タイトルバーにこの名前が表示されます
			WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, 
			50,    //X座標
			50,    //Y座標
			450,    //幅
			450,    //高さ
			NULL, //親ウィンドウのハンドル、親を作るときはNULL
			NULL, //メニューハンドル、クラスメニューを使うときはNULL
			hInst, //インスタンスハンドル
			NULL);
	if (!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}
//座標特定
BOOL GetCurPos(short *x,short *y,LPARAM lp){
	POINTS point;
	int temp;

	point=MAKEPOINTS(lp);
	if(point.x<10 || point.x>410 || point.y<10 || point.y>410)return FALSE;
	temp=(point.x-10)%50;
	temp=point.x-10-temp;
	*x=temp/50;
	
	temp=(point.y-10)%50;
	temp=point.y-10-temp;
	*y=temp/50;
	return TRUE;
}
//チェス盤の描画
void DrawChessboard(HDC hdc,short x,short y){
	int i,j;
	HPEN hBoldPen,hOldPen;
	HBRUSH hOldBrush,hNullBrush,hGreenBrush;
	HFONT hFont,hOldFont;
//初期化
	hBoldPen=CreatePen(PS_SOLID,5,RGB(255,0,0));
	hNullBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
	hGreenBrush=CreateSolidBrush(RGB(0,140,20));
	hOldBrush=(HBRUSH)SelectObject(hdc,hGreenBrush);
	hFont=CreateFont(35,0,0,0
		,FW_SEMIBOLD
		,FALSE,FALSE,FALSE
		,SHIFTJIS_CHARSET
		,OUT_DEFAULT_PRECIS
		,CLIP_DEFAULT_PRECIS
		,DEFAULT_QUALITY
		,DEFAULT_PITCH | FF_DONTCARE
		,"MS ゴシック");
	hOldFont=(HFONT)SelectObject(hdc,hFont);
//初期化終了
	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			if((i+j)%2)SelectObject(hdc,hGreenBrush);
			else SelectObject(hdc,hOldBrush);
			Rectangle(hdc,10+i*50,10+j*50,60+i*50,60+j*50);
		}
	}
	hOldPen=(HPEN)SelectObject(hdc,hBoldPen);
	SelectObject(hdc,hNullBrush);
	Rectangle(hdc,10+x*50,10+y*50,60+x*50,60+y*50);
	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			
			TextOut(hdc,27+i*50,17+j*50,(LPCTSTR)kihu[j],1);
		}
	}
	//終了処理
	SelectObject(hdc,hOldPen);
	SelectObject(hdc,hOldBrush);
	SelectObject(hdc,hOldFont);
	DeleteObject(hFont);
	DeleteObject(hGreenBrush);
	DeleteObject(hBoldPen);
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
	PAINTSTRUCT ps;
	HDC hdc;
	static POINTS zahyo={0,0};

	switch (msg) {
		case WM_PAINT:
			hdc=BeginPaint(hWnd,&ps);
			DrawChessboard(hdc,zahyo.x,zahyo.y);
			EndPaint(hWnd,&ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		case WM_LBUTTONDBLCLK:
			if(GetCurPos(&zahyo.x,&zahyo.y,lp))
				InvalidateRect(hWnd,NULL,TRUE);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

Re:文字の描画

Posted: 2007年7月17日(火) 18:01
by Justy
 SetBkMode(hdc , TRANSPARENT);
 をどこかに入ればいいんじゃないかと。

背景色とモード
http://wisdom.sakura.ne.jp/system/winap ... win21.html

Re:文字の描画

Posted: 2007年7月17日(火) 22:31
by Lbfuvab
有難うございました。
SetBkMode(hdc,TRANSPARENT);を文字描画の直前に入れておきます。
返す返すも有難うございました。