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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Lein
記事: 4
登録日時: 12年前

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

#1

投稿記事 by Lein » 12年前

よろしくおねがいします。
現在Win32APIを使用したペイントソフトの製作をしているのですが、
ペンやブラシで線や図形を描画する領域、キャンバスというのは
どのように作られているのでしょうか?

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

一言で言えばMemDCです。
このヒントだけで調べられないと製作は厳しかなと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lein
記事: 4
登録日時: 12年前

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

#3

投稿記事 by Lein » 12年前

>>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 のモノクロームのビットマップしか作成されない」
ので大きさを変更しようとしている、というのは分かるのですが
どうしてこれだけでできてしまうのか理解できません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

hMemDCだけだと、ちゃんとした描画領域が無いのでhBitmapを割り当てています。
15行目でhMemDCの描画領域としてhBitmapが結びつくわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Lein
記事: 4
登録日時: 12年前

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

#5

投稿記事 by Lein » 12年前

ありがとうございます!無事理解できました!

閉鎖

“C言語何でも質問掲示板” へ戻る