C#の、多角形を半透明に塗るプログラムがあります。
Point[] pa;
SolidBrush brush1 = new SolidBrush(Color.FromArgb(128,Color.Black));
g.FillPolygon(brush1, pa);
これと同じことをCで記載したいので
http://www.geocities.jp/ky_webid/win32c/010.html
や
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
を参考にして、やっと多角形の塗りつぶし(赤)まではできました。
が、半透明にする方法がわかりません。
よろしくお願いします。
POINT pa[];
SelectObject(hdc , CreateSolidBrush(0xFF));
SetPolyFillMode(hdc , WINDING);
Polygon(hdc , pa , n);
DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
No.1ベストアンサー
- 回答日時:
こんにちは。
少なくとも当方が知る限りでは、win32gdiにアルファ合成という考えがないので、そのままでは無理でしょう。
バックバッファのメモリデバイスコンテキストに向かって多角形を描いた後、AlphaBlend()APIを使用して、バックバッファをウィンドウに向かって半透明描写する位しか思いつきません。
C#で記載されている、
SolidBrush brush1 = new SolidBrush(Color.FromArgb(128,Color.Black));
g.FillPolygon(brush1, pa);
と言うのは、.NetFramework用にラップされたGDI+の筈です。C++用のGDI+を使用すれば、簡単に出来るでしょう。
以下はwin32apiだけで何とかしていますが、時間が無いので、アラもあります。参考程度で。
//コレをリンクしないと駄目
#pragma comment(lib, "msimg32.lib")
//プロシージャの中
case WM_CREATE:
{
po[0].x = 10;po[0].y = 50;
po[1].x = 150;po[1].y = 50;
po[2].x = 150;po[2].y = 150;
po[3].x = 50;po[3].y = 150;
po[4].x = 50;po[4].y = 10;
po[5].x = 200;po[5].y = 10;
po[6].x = 200;po[6].y = 125;
po[7].x = 10;po[7].y = 125;
}
break;
case WM_PAINT:
{
RECT rc;
::GetClientRect(hWnd, &rc);
HDC hDCHwnd = ::GetDC(hWnd);
//バックバッファの作成
HBITMAP hBackBuf = ::CreateCompatibleBitmap(hDCHwnd, rc.right, rc.bottom);
HDC hDCMem = ::CreateCompatibleDC(hDCHwnd);
::ReleaseDC(hWnd, hDCHwnd);
HBITMAP hBmpOrg = (HBITMAP)::SelectObject(hDCMem, hBackBuf);
//バックバッファをウィンドウと同じ色にする
::FillRect(hDCMem, &rc, (HBRUSH)::GetClassLong(hWnd, GCL_HBRBACKGROUND));
HBRUSH hBrush = ::CreateSolidBrush(0xFF);
HBRUSH hBrushOrg = (HBRUSH)::SelectObject(hDCMem, hBrush);
//多角形を描く
::SetPolyFillMode(hDCMem, WINDING);
::Polygon(hDCMem, po, 8);
//再描画
PAINTSTRUCT ps;
HDC hDCPaint = ::BeginPaint(hWnd, &ps);
BLENDFUNCTION ftn = {0};
ftn.BlendOp = AC_SRC_OVER;
ftn.AlphaFormat = 0;
ftn.SourceConstantAlpha = 127;
::AlphaBlend(hDCPaint, 0, 0, rc.right, rc.bottom, hDCMem, 0, 0, rc.right, rc.bottom, ftn);
::EndPaint(hWnd, &ps);
//後始末
::SelectObject(hDCMem, hBrushOrg);
::SelectObject(hDCMem, hBmpOrg);
::DeleteDC(hDCMem);
::DeleteObject(hBrush);
::DeleteObject(hBackBuf);
}
break;
回答、そしてプログラムの提示、ありがとうございます。
>win32gdiにアルファ合成という考えがないので、そのままでは無理でしょう。
なるほど、半透明のブラシが設定そのものがWin32gdiには無いということですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS html cssのmargin 5 2022/12/03 11:04
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- HTML・CSS HTMLソースの質問 3 2022/07/28 13:29
- 医療・安全 電気ショック 4 2022/09/26 11:39
- ノートパソコン Open Office.orgのDrawで描いた図形の塗りつぶしをしたい 1 2022/03/22 19:24
- 数学 『弧は弦より長し』 8 2022/04/18 10:23
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- HTML・CSS htmltとcssのコードで 1 2022/11/26 13:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Rectangleで、リソースが解放さ...
-
GetDC()とCreateCompatibleDC()
-
コンテキスト依存とは?
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コンボボックス内の文字サイズ変更
-
エクセルで作った新しいウイン...
-
ゲームでは結局どっちが良いの?
-
フォントの大きさ
-
PCで「使用可能な場合はグラフ...
-
コントロールの書式設定で、“コ...
-
UWSCで特定のChromeのタブをア...
-
C++6.0でのresource.hについて
-
勝手にウィンドウが開いて止ま...
-
c言語でキーボードから2点の座...
-
VBAのフォント変更(エクセルか...
-
Msgboxで使用するフォントの指...
-
交差する2線分の交点座標の求め方
-
デスクトップ上のアイコンの位...
-
NVIDIAのシェーダーキャッシュ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
Win32APIにて、アイコンの情報...
-
PlgBltでの透過
-
画面がチカチカする
-
GetDC()とCreateCompatibleDC()
-
VBでFD、USBの有効・無効...
-
VC++でBitmapとText文字を表示...
-
コントロール内の文字の背景色
-
画像処理 ビットマップ ダブ...
-
BitBlt関数について教えてください
-
メモリデバイスコンテキスト&...
-
Rectangleで、リソースが解放さ...
-
画面のちらつきについて
-
Windowsプログラミング 画面描...
-
ビットマップ(表示速度とサイズ)
-
メモリデバイスコンテキストを...
-
ダブルバッファの作り方
-
TextOutについて
-
SetWindowRgn()関数について。
-
領域を塗りつぶしたい
おすすめ情報