Version 7.05
ブラシとリソース
「今回は前回の続き。前回は GDI のひとつ、ペンについて見てみました」
『交換したりして面倒なんだよね』
「交換関係はもうどうしようもないかな。今回最初は、まずもうひとつの
GDI 、【ブラシ】について」
『ブラシって毛玉とか取るあれ?』
「んー、それよりエアブラシとか」
『ああ、そっちのね』
「同じなんだけどね。 brush っていうのは〈はけ〉って意味で、ペンキと
か塗る時の、幅広の刷毛を思い出してくれるといいかな」
『看板とか描きそうなヤツね』
「簡単に言えば、輪郭を描くためのがペン、塗り潰すためのがブラシ。前回
楕円を描いた時に、中は白のままだったでしょ」
『ってことは、その色を変えるのがブラシなんだ』
「そゆこと。まずは例から」
void CAnimeDlg::OnBDraw()
{
HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
HPEN hPen = ::CreatePen( PS_SOLID, 10, RGB( 255, 0, 0 ) );
HPEN hOldPen = (HPEN)::SelectObject( hCanvasDC, hPen );
HBRUSH hBrush = CreateSolidBrush( RGB( 0, 0, 255 ) );
HBRUSH hOldBrush = (HBRUSH)::SelectObject( hCanvasDC, hBrush );
::Ellipse( hCanvasDC, 10, 10, 80, 50 );
::SelectObject( hCanvasDC, hOldBrush );
::DeleteObject( hBrush );
::SelectObject( hCanvasDC, hOldPen );
::DeleteObject( hPen );
}
『うお、長い! あ、でも新しいのは CreateSolidBrush() とかくらいだ
ね』
「そだね。 CreateSolidBrush() でブラシを作って、あとはデバイスコンテ
キストでの交換とかは同じ」
『ブラシも、ペンみたくひとつしか持てないのね』
「そういうこと。 GDI にはペンやブラシも含めて7種類あって、ひとつの
デバイスコンテキストが持てるのはその7種類でそれぞれひとつずつ」
『ペンで塗り潰したりはできない?』
「できません。塗り潰しにはブラシ、って決まってるから」
『なんか融通きかないのね……』
「あと、 CreateSolidBrush() はベタの塗り潰し用のブラシ。たとえば」
HBRUSH hBrush = CreateHatchBrush( HS_CROSS, RGB( 0, 0, 255 ) );
「ってすると」
『網目模様になった!』
「こういうのは、簡単な図形を描くのに便利かな」
『でも、これって結構テキトーだよね』
「それはしょうがないかな。凝ったのを描くとなると大変になるからねー」
『ま、こういうの使えば少しはバリエーション出てくるんだ』
「だね。実際、僕の方で全部紹介しきれないし、いっぺんに憶えきれないか
ら、自分で暇を見つけて色々試してもらうしかないかな」
『つまりどんなことができるかちゃんと調べとけってことね』
「そういうこと。ま、主なものはちゃんと紹介するけどね」
『主なものねー』
「さて、今回はまた違ったことについて紹介します」
『あら、スペースが余ったと思ったら』
「今回教えるのは【リソース】について」
『へ? リソースなんてもう知ってるよ。ダイアログとかバージョン情報と
かのことでしょ』
「そこが難しいところ。今から教えるリソースは、それと同じとも言える
し、違うとも言えるし」
『なんか微妙な言い回し……』
「このリソースは、簡単に言えば〈ハンドルが指し示す実体が置かれてる場
所〉のこと」
『???』
「ウィンドウとかデバイスコンテキストとかペンとか、ウィンドウズシステ
ムの中に作られるでしょ。その作られる領域とか、そこに置かれてるものが
【リソース】なんです」
『ようするに、ハンドル関係のものってことでいい?』
「うん、それでだいたい合ってるかも。っていうか、この辺はあいまいで
ねー」
『なのねー』
「一応、ウィンドウとかデバイスコンテキストとかペンとかそのものをリ
ソースって思った方がいいけど」
『けど?』
「〈リソースの枯渇〉って言って、こういったウィンドウとかを作りすぎる
ともう他に作れなくなることがあるんだよね」
『前に、リソースって【資源】って意味だって言ってたよね』
「だね。ハンドルはポインタって言ったよね」
『うん、前回』
「ウィンドウズシステムの中に、ウィンドウとかを作るためのメモリ領域が
あって、ウィンドウを作るときとかは、そのメモリ領域を必要なだけ確保し
て使うってイメージ」
『そのアドレスがハンドルってこと?』
「そういうこと。このメモリ領域の場所そのものがリソース、って考えると
いいかなぁ」
『ってことは、もう空き場所がなくなった状態が〈リソースの枯渇〉ってこ
とになるの?』
「そういうことだね。ま、この辺は口で言っても分かりにくいから、見てみ
ましょう。まずスタートメニューの【アクセサリ】−【システムツール】か
ら【リソースメーター】を実行して」
『ほい。タスクバーの端にアイコンが出たけど』
「それをダブルクリック」
『ダイアログが出たよ。システムリソース : 残り 44% とか』
「このゲージが、リソースの全容量ってとこかな」
『ってことは、ウィンドウとか作ると減ってく?』
「減ってきます。というわけで試してみましょう」
void CAnimeDlg::OnBDraw()
{
for( int iF1 = 0; iF1 < 350; iF1++ )
{
::CreatePen( PS_DOT, 1, RGB( 255, 0, 0 ) );
}
}
『うわー、ペンを350個も作るの?』
「そ。このくらい作らないと見た目的に分からないからね」
『そんじゃ実行っと。うわ、激減!』
「もっとよく見て?」
『えっと、システムリソースと GDI リソースが減って、 User リソースは
減ってないね』
「リソースには3種類あって、全体の管理をするシステムリソース、ウィン
ドウとかを置く User リソース、 GDI を置く GDI リソースの3つがありま
す」
『システムリソースって他のも含むってこと?』
「そうだね、 GDI リソースを減らすものを作ったらシステムリソースも減
るし、同じように User リソースを減らすものを作っても」
『システムリソースが減るってわけね』
「でも、システムリソースだけ減るのもあるから」
『たとえば?』
「 Ver 5.15 ( No.080 ) でやった、ファイルを開くときの」
『 CreateFile() で開いて、 HANDLE で受け取るんだよね。そっか、これも
ハンドルだから、リソースになるんだ』
「こういうのはシステムリソースだけ減るから」
『それにしても、こうやって目に見えて減るのって不安ね……』
「もっと減らしてみて」
『げ! なんか不安なことさせるわねー』
「あと数回なら大丈夫だから」
『ほいほい。ぽち、ぽち……あ、ダイアログ出た!』
90%以上のシステムリソースが使用されています。
使用していないプログラムを終了し、システムリソースを解放しないと、
コンピュータが応答しなくなる可能性があります。
『げげ! こういうのって不安……』
「これは実際ぎりぎり。これ以上使うと」
『リソースが枯渇しちゃうわけね。あれ? このマシンってメモリいくつ
入ってるの?』
「2枚」
『そうじゃなくってー』
「1Gは入ってるよ」
『なのにこんなに簡単に枯渇しちゃうんだ』
「そこがポイント。メモリに置いてあるって言っても、最初にウィンドウズ
システムが確保してる領域が小さいから」
『メモリいくら増やしてもダメ?』
「そういうことなんだよねー。これは結構ネック」
『それより、この危なっかしい状況をなんとかして〜』
「アプリ終了すれば大丈夫だよ」
『ほい。あ、ゲージが元に戻った』
「アプリを終了すれば、たいがいのリソースは解放されるから」
『……解放されないのもある?』
「アプリが使うんじゃなくて、ウィンドウズ全体で使うのとかはね」
『もしそういうのを、こういう感じに作りまくったら……』
「落ちるね、ウィンドウズが」
『そんな簡単に……』
「それに、終了するかしないかは」
『ユーザーしだい! そっか、前回言ってた〈削除しなきゃ〉っていうのは
こういう理由なんだね』
「そういうこと。もし削除しなかったらリソースを使いまくちゃってやばい
ことになるから」
『だから、ちゃんとまめに削除しなきゃいけないわけねー』
「最後に、今回教える前までのリソースと、今回のリソースの関係」
『今の所は全然関係ないよね』
「そうだねー。今回より前のリソースは、 MSDN の Resources ってページ
に書いてある、ダイアログとかバージョン情報とかの」
『うん、これはおなじみのだね』
「で、今回教えたのは MSDN の Handles and Objects ってページの」
『っつーかどっちも英語で難しい……』
「こういうふうに分けられて書かれてるから、実際には別物って考えた方が
いいかも」
『別物ねー』
「でも」
『でもぉ?』
「 Resources の方、全部 Create なんたらでウィンドウズシステム内に
作って、ハンドルとして操作するんだよね」
『そっか、そう考えれば Handles and Objects の方とも言えるんだ。こっ
ちのに含まれてるしねー』
「実際、この辺は難しいところかもね。暇があったら英文を読み下してみ
て」
『これって結構大変なんじゃ……』
/*
Preview Next Story!
*/
『水希ちゃんって英語すらすら?』
「全然、全然」
『のわりには MSDN すらすら読んでるじゃない』
「英語は分からなくても、プログラミング用語は分かるし」
『そういう方面から攻めるってこと?』
「自分の得意分野からっていうのが憶えやすいかな」
『そういうコツも必要なのね』
「というわけで次回」
< Version 7.06 四角な構造体 >
『につづく!』
「ま、一番読みやすいのはソースコードそのものだけどね」
『……それは笑うとこ? それとも引くとこ?』