今更ながらWPFに置き換えてみる(12)


時報機能

いくつかのボケ問題は未解決ですがメイン機能はほぼ形になりまして一点残るのが時報機能。指定時刻または毎正時にバルーン的なお知らせが表示される機能です。
こんなやつ↓

普通Toastとかを使うんかもしれませんがコンポーネントを知らない悲しさから、VB+FORMS版では子FORMを作成しメイン側から指定時刻に呼び出し、子FORM側に別途設定したタイマーで透明度を加算・減算してフェードIN・OUT表現と、表示時間を調整してました。VB↓

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'Timer intavalは20?位だったはず
        Me.ticks.Text = CInt(Me.ticks.Text) + 1
        Select Case CInt(Me.ticks.Text)
            Case Is <= 100 
                Me.Opacity += 0.01   '2秒かけてフェードIN
            Case 101 To 300          '4秒間通常表示
            Case 300 To 400          '2秒かけてフェードOUT
                Me.Opacity -= 0.01
            Case Is > 400            '終わったら終わる
                Me.ticks.Text = "0"
                Me.Timer1.Enabled = False
                Me.Hide()
            Case Else
        End Select
        If Me.sec.Text <> Mid(Now.ToString("yyyyMMddHHmmss"), 13, 2) Then
            Call MakeClockImage()  'お知らせ内にアナログ時計描画
            Me.sec.Text = Mid(Now.ToString("yyyyMMddHHmmss"), 13, 2)
        End If
        Me.Refresh()
    End Sub

当初NotifyIcon用にインストールしたHardcodet.NotifyIconにある機能を使おうかと考えたんですが、お知らせ画面内のアナログ時計をリアルタイムで動かしたいので、VB版と類似した方法で行くことにします。

GRIDVIEWでの残念な点

個別設定した時報情報をリスト表示する機能で、FORMS版のLISTVIEWでは普通にIMAGELISTを準備して、AddItemするといい感じでアイコンをつけて登録でき、削除するときもマウスポインタで領域選択することで一気に削除できました。

WPF版ではGridviewを利用してXAML側でアイコンをつけて表示してるんですがマウス操作するとDragMoveが生きちゃってそうした選択ができず、クリックしての選択しかできないっぽくてやや残念。

追記 プレデター文字

DrawLineでセグメント数字描画するロジック、ミスったらいきなりプレデター風味に。そういえばゲームが出るんたっけ・・。