
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面がチカチカする
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
[VB.net] DataGridViewの列ヘッ...
-
VBAのフォント変更(エクセルか...
-
コンボボックス内の文字サイズ変更
-
ラジオボタンの初期指定
-
VB.NET2005 TextBox 高さ(Heig...
-
ActiveXコントロールを.NETにイ...
-
エクセルのコントロールツール...
-
Minecraft 統合版(PC)の描画距...
-
スピンボタンを右クリックして...
-
ExcelVBAでAPIを使って外部ウイ...
-
3次元空間上の2つの座標から...
-
MFC ダイアログ上のID取得につ...
-
プロパティシートのタブの名前...
-
エクセル - リストボックスのマ...
-
メッセージボックスの選択ボタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
メモリデバイスコンテキストを...
-
画面がチカチカする
-
Windowsプログラミング 画面描...
-
Rectangleで、リソースが解放さ...
-
ダイアログにビットマップを貼...
-
VBでデスクトップアクセサリを...
-
ちらつきについて
-
画像処理 ビットマップ ダブ...
-
C 多角形を半透明に塗る方法
-
VC++でopenGLを利用したい...。
-
ハードコピーをプログラムから...
-
WindowsAPIでの画像表示について
-
SetWindowRgn()関数について。
-
WinAPIでスクリーン画像を映し...
-
ビットマップの表示について
-
VC++のTextOutの再描画の仕方
-
ダブルバッファの作り方
-
usbデバイスとの通信
-
BitBlt関数について教えてください
おすすめ情報