アプリ版:「スタンプのみでお礼する」機能のリリースについて

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)));

A 回答 (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;
    • good
    • 0
この回答へのお礼

回答、そしてプログラムの提示、ありがとうございます。

>win32gdiにアルファ合成という考えがないので、そのままでは無理でしょう。
なるほど、半透明のブラシが設定そのものがWin32gdiには無いということですね。
ありがとうございました。

お礼日時:2011/03/02 22:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!