「Windows API/図形の描画」の版間の差分
削除された内容 追加された内容
{{Nav}},s/命令/関数/ |
|||
1 行
{{Nav}}
== 塗りつぶし ==
=== 長方形を塗りつぶすには? ===
図形を塗りつぶしたい場合には、図形描画
塗りつぶし専用の
Windows API でいう「ブラシ」とは、図形の塗りつぶしの色を設定するためのツールのことです。画像作成ソフトで例えるなら、Windows API でいうブラシとは、画像作成ソフトの「バケツ」ツールに近いです。世間一般の画材でいう「ブラシ」とは、意味が違います。
16 ⟶ 17行目:
上記の2段階のブラシ作成の作業は、CreateSolidBrush はブラシの色作成のためのアドレス確保を意味し、もう片方 SelectObject は、どのウィンドウでどのブラシ色を使うかを定義するための情報を保存するアドレスの確保を意味しています。
「Rectangle」は、単に、四角形を描くための
当然、これらの
「// TODO: HDC を使用する描画コードをここに追加してください...」
のあるブロックで書く必要があります。
47 ⟶ 48行目:
図形をピンク色の長方形だけにしたい場合、ペンの色もピンク色にします。
Rectangle
<syntaxhighlight lang=c>
HPEN pen_buhin_1;
53 ⟶ 54行目:
SelectObject(hdc, pen_buhin_1);
</syntaxhighlight>
のように、ペンを指定します。 CreatePen
よって、今までの話をまとめると、
70 ⟶ 71行目:
=== 典型的な画像描画の
上記のプログラムにあるような手順の、
Create〇〇
SelectObject
実際の描画
といった順序は、長方形以外のほかの図形の描画などでも同様の手順になります。特別な理由の無いかぎり、この順序で
=== polygon関数とPOINT配列 ===
Win32 API では、polygon() という
さて、Polygon関数について説明する。
polygon
また、ブラシなどの設定や関連づけもする必要があります。
131 ⟶ 132行目:
=== 任意の図形の塗りつぶし ===
ExtFloodFill
== その他の描画 ==
137 ⟶ 138行目:
べつに塗りつぶしをせずに、単に線を描くだけの機能も存在している。
直線を描くだけなら、 MoveToEx()
なお、 MoveToEx() で起点を指定しており、引数で起点を指定する。LineTo()
そのほか、円や楕円を塗りつぶしで描くなら Ellipse()
また、この円・楕円の引数では、その円を内接円とする長方形を指定する方式で、その長方形の左上の座標と右下の座標を指定する。
このため、ナナメに傾いた楕円は書けない。(後述する SetPixel()など別の
そのほか、円弧および楕円弧を塗りつぶさずに弧だけ描くなら Arc()
そのほか、円弧および楕円を塗りつぶして描くなら Pie()
これら Arc() や Pie() もまた、内接円を囲む長方形を引数として指定する方式で、その長方形の左上の座標と右下の座標を指定する。
157 ⟶ 158行目:
=== 点を打つ ===
また、点を打つだけの
原理的には、パソコン画面に表示されるどんな画像もピクセル単位の点の集まりにすぎないので、原理的には SetPixel だけで、どんな画像も書ける。
だが、もちろん実用では、上述に紹介したように、線を描くなら線を引くための専用の
ちなみに、1文字ちがいの GetPixel()
207 ⟶ 208行目:
もし、図形が飛び飛びになってしまうと、グラフに沿って塗りつぶしをしたい場合、飛び飛びだと塗りつぶしの境界枠にできない。
なので、用途によっては SetPixel ではなく、近似的に LineTo
得られる図形の大まかな形状があらかじめ分かっているなら、LineTo()
=== 画面クリアの専用の
Windows32API には、画面を初期状態に戻すようなクリア機能の専用の関数は、無いようです。(※ 参考文献:林晴彦『明快入門 visual C++ 2010』、ソフトバンククリエイティブ(出版社)、2011年3月8日 初版 第1刷、179ページ。 )
226 ⟶ 227行目:
もし .NET Framework ならば SaveImage メソッドというのがある。しかし Win32API には、そういうのは無い。
Win32APIでも、画面の画像をキャプチャしてメモリなどに蓄える
なので、C言語のバイナリ書き込み
238 ⟶ 239行目:
<syntaxhighlight lang=c>
void kansuu(HDC hdc){
// ここに描画
}
</syntaxhighlight>
343 ⟶ 344行目:
ともかく、どんなプログラミング様式も一長一短です。
なので、簡単で短い単純なプログラムだけを書く場合には、似たような処理の繰り返しがあっても、あえて関数もfor文もif文も全く使わずに、逐次的に1行ずつ
もちろん、この逐次的な方式も、欠点があり、コードがかなり長くなるので、長くなるにつれて記述ミスをしやすくなります。
|