PictureBox に描画した文字の文字色を反転する方法


nasiga  2004-07-30 14:14:49  No: 115232  IP: [192.*.*.*]

いつもお世話になっております。

開発環境:
WinXP Pro
VB.NET 2003(.NET Framework 1.1)

PictureBox に文字を描画し、さらにその上に塗りつぶされた四角形を
描画した際に四角形と文字が重なった部分の文字色を反転させたいと
思っています。とりあえず、文字色を反転させることはできたのですが、
問題が2つほどあります。

1)別ウィンドウの背面に隠し、再度表示するなどの再描画を行うと
  塗りつぶされた四角形が消えてしまう。

2)塗りつぶし四角形は、ControlPaint.FillReversibleRectangle を
  使用しているが、意図する色に塗りつぶされない。
  背景色灰色と塗りつぶしの青色の反転色が出ている模様(?)

---------- ソースコード ここから
Public Sub Draw()

Dim strNumber As String         ' 一時的に文字列を保持する
Dim CurrentX As Long            ' 値文字列書込み位置X座標
Dim CurrentY As Long            ' 値文字列書込み位置Y座標
Dim g As Graphics               ' 描画グラフィック
Dim lngValue As Long = 50       ' 表示値
Dim lngMaxValue As Long = 100   ' 表示最大値
Dim intTargetWidth As Integer   ' ターゲットの幅
Dim intTargetHeight As Integer  ' ターゲットの高さ
Dim lngDrawValue As Long        ' 四角形描画幅
Dim ptScreenPosition As Point   ' スクリーン座標
Dim ptsClientPosition As Point  ' クライアント座標
Dim fntFont As Font = New Font("MS ゴシック", 9)  ' フォント作成


With PictureBox1

    ' ターゲットの PictureBox の幅/高さを格納
    intTargetWidth = .ClientRectangle.Width
    intTargetHeight = .ClientRectangle.Height

    .Image = New Bitmap(.Width, .Height)
    ' ターゲットの PictureBox の内容を消去(背景を灰色)
    g = Graphics.FromImage(.Image)
    g.Clear(Color.LightGray)

    ' プログレスバーの文字色設定
    ' 基本的にバー色と同一色を使用する
    ' (表示する値によって、色を反転させる必要があるため)
    .ForeColor = Color.Black

    ' パーセント表示
    strNumber = CStr(lngValue) & "%"

    ' 四角形描画幅設定
    lngDrawValue = lngValue / lngMaxValue * intTargetWidth

    ' 値の表示位置を PictureBox 中央に設定
    CurrentX = (intTargetWidth - _
                g.MeasureString(strNumber, fntFont).Width) / 2
    CurrentY = (intTargetHeight - _
                g.MeasureString(strNumber, fntFont).Height) / 2

    ' 文字列印字(ターゲットの PictureBox に表示する)
    g.DrawString(strNumber, fntFont, Brushes.Blue, _
                 CurrentX, CurrentY)

    ' 強制的に再描画
    .Refresh()

    ' クライアント座標格納
    ptsClientPosition.X = .ClientRectangle.Left
    ptsClientPosition.Y = .ClientRectangle.Top
    ' スクリーン座標へ変換
    ptScreenPosition = .PointToScreen(ptsClientPosition)
    ' 画面上の塗りつぶされた反転できる四角形を描画
    ControlPaint.FillReversibleRectangle( _
        New Rectangle(ptScreenPosition.X, ptScreenPosition.Y, _
        lngDrawValue, intTargetHeight), Color.Blue)

    ' リソースの解放
    fntFont.Dispose()
    g.Dispose()
End With

End Sub


Private Sub Form1_DoubleClick( _
    ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.DoubleClick

Draw()

End Sub
---------- ソースコード ここまで

解決策、ご指摘部分がありましたら、
ご教授の願えますでしょうか?

よろしくお願いします。

編集 削除
nasiga  2004-07-30 15:10:25  No: 115233  IP: [192.*.*.*]

自己レスです。

2)については、とりあえず解決しました。
まず、バー幅分の下地用の四角形を白色で描画(FillRectangle)します。
次に FillReversibleRectangle に渡す Color を下記のように反転させて
渡すと、バー色を青色(意図する色)で描画することができました。
----- 色の反転
colReverseColor = Color.FromArgb(Color.Blue.ToArgb() Xor &HFFFFFF)
-----

残るは、1)の再描画しても塗りつぶし四角形が消えない方法です。

いろいろ調査しておりますが、ご存知の方がおりましたら
よろしくお願いします。

編集 削除