• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C 多角形を半透明に塗る方法)

Cで多角形を半透明に塗る方法

このQ&Aのポイント
  • C言語を使用して、多角形を半透明に塗る方法について調査しています。
  • 参考にしたウェブサイトで多角形の塗りつぶし(赤)の方法を見つけましたが、半透明にする方法がわかりません。
  • 質問者は、POINTデータ型を使用して多角形を描画し、CreateSolidBrush関数を使用して半透明にする方法を知りたいと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
回答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;

usatan2
質問者

お礼

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

関連するQ&A