- ベストアンサー
Cで多角形を半透明に塗る方法
- C言語を使用して、多角形を半透明に塗る方法について調査しています。
- 参考にしたウェブサイトで多角形の塗りつぶし(赤)の方法を見つけましたが、半透明にする方法がわかりません。
- 質問者は、POINTデータ型を使用して多角形を描画し、CreateSolidBrush関数を使用して半透明にする方法を知りたいと思っています。
- みんなの回答 (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には無いということですね。 ありがとうございました。