よろしくおねがいします。
現在Win32APIを使用したペイントソフトの製作をしているのですが、
ペンやブラシで線や図形を描画する領域、キャンバスというのは
どのように作られているのでしょうか?
PictureBoxを使うのかなと思ったりもしましたが、よくわからないので
質問させていただきました。
一体何を使えばキャンバスが作れるのでしょうか、拙い文章で申し訳
ありませんが御助言をお願いします。
環境
・Win7
・VC++2010
知識
・Cの基礎はおさえています。
ペイントソフト キャンバスの作り方
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ペイントソフト キャンバスの作り方
一言で言えばMemDCです。
このヒントだけで調べられないと製作は厳しかなと思いますよ。
このヒントだけで調べられないと製作は厳しかなと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ペイントソフト キャンバスの作り方
>>softya(ソフト屋) さん
貴重なヒントをありがとうございます。
それらしきやり方を見つけました。
ただ、コード15行目のSelectObjectで、
hBitmapをhMemDCに指定しているみたいなのですが
何が起こっているのでしょう?
試しに15行目をコメントアウトしてみたら画面になにも表示されませんでした。
「CreateCompatibleDCでは1×1 のモノクロームのビットマップしか作成されない」
ので大きさを変更しようとしている、というのは分かるのですが
どうしてこれだけでできてしまうのか理解できません。
貴重なヒントをありがとうございます。
それらしきやり方を見つけました。
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));
}
}
hBitmapをhMemDCに指定しているみたいなのですが
何が起こっているのでしょう?
試しに15行目をコメントアウトしてみたら画面になにも表示されませんでした。
「CreateCompatibleDCでは1×1 のモノクロームのビットマップしか作成されない」
ので大きさを変更しようとしている、というのは分かるのですが
どうしてこれだけでできてしまうのか理解できません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ペイントソフト キャンバスの作り方
hMemDCだけだと、ちゃんとした描画領域が無いのでhBitmapを割り当てています。
15行目でhMemDCの描画領域としてhBitmapが結びつくわけです。
15行目でhMemDCの描画領域としてhBitmapが結びつくわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。