ページ 11

ペイントソフト キャンバスの作り方

Posted: 2014年4月05日(土) 12:43
by Lein
よろしくおねがいします。
現在Win32APIを使用したペイントソフトの製作をしているのですが、
ペンやブラシで線や図形を描画する領域、キャンバスというのは
どのように作られているのでしょうか?

PictureBoxを使うのかなと思ったりもしましたが、よくわからないので
質問させていただきました。

一体何を使えばキャンバスが作れるのでしょうか、拙い文章で申し訳
ありませんが御助言をお願いします。

環境
 ・Win7
 ・VC++2010
知識
 ・Cの基礎はおさえています。

Re: ペイントソフト キャンバスの作り方

Posted: 2014年4月05日(土) 13:03
by softya(ソフト屋)
一言で言えばMemDCです。
このヒントだけで調べられないと製作は厳しかなと思いますよ。

Re: ペイントソフト キャンバスの作り方

Posted: 2014年4月05日(土) 14:21
by Lein
>>softya(ソフト屋) さん
貴重なヒントをありがとうございます。
それらしきやり方を見つけました。

コード:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,WPARAM wp,LPARAM lp)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HBITMAP hBitmap;
	static HDC hMemDC;
	switch(msg)	
	{
	case WM_CREATE:
		//MemDC作成
		hdc=GetDC(hWnd);
		hMemDC=CreateCompatibleDC(hdc);
		hBitmap=CreateCompatibleBitmap(hdc,WIDTH,HEIGHT);
		ReleaseDC(hWnd,hdc);
		SelectObject(hMemDC,hBitmap);
		//MemDCに描写
		SelectObject(hMemDC,GetStockObject(GRAY_BRUSH));
		Rectangle(hMemDC,25,25,50,50);//グレーの矩形
		break;
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
		//表画面へ転送
		BitBlt(hdc,0,0,WIDTH,HEIGHT,hMemDC,0,0,SRCCOPY);	
		EndPaint(hWnd,&ps);
		break;
	case WM_DESTROY:
		DeleteDC(hMemDC);//開放
		PostQuitMessage(0);
		break;
	default:
		return (DefWindowProc(hWnd,msg,wp,lp));
	}
}
ただ、コード15行目のSelectObjectで、
hBitmapをhMemDCに指定しているみたいなのですが
何が起こっているのでしょう?
試しに15行目をコメントアウトしてみたら画面になにも表示されませんでした。

「CreateCompatibleDCでは1×1 のモノクロームのビットマップしか作成されない」
ので大きさを変更しようとしている、というのは分かるのですが
どうしてこれだけでできてしまうのか理解できません。

Re: ペイントソフト キャンバスの作り方

Posted: 2014年4月05日(土) 18:18
by softya(ソフト屋)
hMemDCだけだと、ちゃんとした描画領域が無いのでhBitmapを割り当てています。
15行目でhMemDCの描画領域としてhBitmapが結びつくわけです。

Re: ペイントソフト キャンバスの作り方

Posted: 2014年4月05日(土) 23:26
by Lein
ありがとうございます!無事理解できました!