FillPathで、パスの中を塗りつぶす。
FillPath function (wingdi.h) - Win32 apps | Microsoft Docs
パス
WM_PAINTで、
// 画面の描画を要求された時. case WM_PAINT: // 画面の描画を要求された時.(uMsgがWM_PAINTの時.) // WM_PAINTブロック { // このブロックのローカル変数の宣言 HDC hDC; // デバイスコンテキストハンドルを格納するHDC型変数hDC. PAINTSTRUCT ps; // ペイント情報を管理するPAINTSTRUCT構造体型の変数ps. BOOL bRet; // BOOL型変数bRet. // ウィンドウの描画開始 hDC = BeginPaint(hwnd, &ps); // BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納. // 普通にテキスト描画. TextOut(hDC, 50, 50, _T("ABCDE"), _tcslen(_T("ABCDE"))); // TextOutで"ABCDE"を描画. // パスの開始. bRet = BeginPath(hDC); // BeginPathでパスの開始. if (bRet){ // 真なら成功. // パスにテキスト描画. HFONT hFont, hOldFont; // フォントハンドルhFont, hOldFont. SetBkMode(hDC, TRANSPARENT); // SetBkModeで背景を透過. hFont = CreateFont(48, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, NULL); // サイズ48のフォントを生成. hOldFont = (HFONT)SelectObject(hDC, hFont); // SelectObjectでhDCとhFontの組み合わせを選択. TextOut(hDC, 50, 100, _T("FGHIJ"), _tcslen(_T("FGHIJ"))); // TextOutで"FGHIJ"を描画. SelectObject(hDC, hOldFont); // SelectObjectで元に戻す. DeleteObject(hFont); // DeleteObjectでhFontを削除. } // パスの終了. EndPath(hDC); // EndPathでパスの終了. // パスの描画. StrokePath(hDC); // StrokePathでパスの輪郭を描画. // パスの内部を塗りつぶし. HBRUSH hBrush, hOldBrush; // ブラシハンドルhBrush, hOldBrush. hBrush = CreateSolidBrush(RGB(0xff, 0x0, 0x0)); // CreateSolidBrushで赤いブラシを作成. hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); // SelectObjectでhDCとhBrushの組み合わせを選択. FillPath(hDC); // FillPathでパスの内部を塗りつぶす. SelectObject(hDC, hOldBrush); // SelectObjectでhOldBrushに戻す. DeleteObject(hBrush); // DeleteObjectでhBrushを削除. // ウィンドウの描画終了 EndPaint(hwnd, &ps); // EndPaintでこのウィンドウの描画処理を終了する. } // 既定の処理へ向かう. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
TRANSPARENTにして背景を透過、フォントも48と大きくした。
FillPathの部分は、EndPathや、StrokePathの後ろに書いている。
赤いブラシを作って、選択して、その色で塗りつぶすのだが、
輪郭描画はあるのに、塗りつぶされない。
どうも、同時には出来ない模様。
StrokePathをコメントアウトすると、
輪郭描画はされなくなったが、赤いブラシでの塗りつぶしはされるようになった。
Sample/winapi/FillPath/FillPath/src/FillPath at master · bg1bgst333/Sample · GitHub