[VB.NET] Show Time On Tray

Standard

Hồi mới dùng cái BatteryCare, không hiểu sao nó có thể hiển thị thời gian ở dưới khay hệ thống, vì theo mình nhớ thì TrayIcon chỉ cho phép dùng hình ảnh.

Nay rảnh, chợt nghĩ đến, thấy cũng không khó, làm cái demo để lưu trữ.

Cái trong vòng tròn xanh (hiển thị giây hiện tại của hệ thống) chính là cái chúng ta cần làm.

Về mặt ý tưởng, mỗi khi cần cập nhật thời gian, ta tạo một đối tượng Graphics, vẽ lên đó, chuyển sang Icon, và set cho control trayIcon. Tuy nhiên để phần vẽ hình được đẹp, ta sẽ cần lựa chọn kích thước font chữ cũng như căn chỉnh tọa độ cho khớp với kích thước của icon dưới khay hệ thống (16×16).

Để tìm kích thước font chữ hợp lý, ta sẽ duyệt từ giá trị 8pt, tăng dần bước nhảy 0.1f cho đến khi kích thước vẽ vượt quá 16×16 thì dừng lại và lấy giá trị trước đó:

    ' Tìm size hợp lý cho font, giúp hiển thị string vừa vặn trong phạm vi icon
    Private Sub calcBestFontSize()
        Dim g As Graphics = CreateGraphics()
        Dim fFontSize As Single = 8.0F
        Dim sizeF As SizeF
        Dim fnt As Font

        ' Tăng dần kích thước font đến khi vượt quá phạm vi icon
        Do
            fFontSize += 0.1F
            fnt = New Font(m_strFontName, fFontSize)
            ' Ta sẽ chỉ sử dụng cái fixed-font, nên dùng 2 số bất kỳ là được
            sizeF = g.MeasureString("12", fnt)
        Loop Until sizeF.Width > ICON_W Or sizeF.Height > ICON_H

        ' Khôi phục về font trước đó (tức font vừa vặn nhất)
        fFontSize -= 0.1F
        m_font = New Font(m_strFontName, fFontSize)
        sizeF = g.MeasureString("12", m_font)

        ' Tính tọa độ vẽ (giúp căn chỉnh string vào giữa icon)
        m_pOrigin = New Point(Convert.ToInt16((ICON_W - sizeF.Width)) / 2, Convert.ToInt16((ICON_H - sizeF.Height)) / 2)
        m_font = New Font(m_strFontName, fFontSize)
    End Sub

Khi đã có font chữ rồi, thì ta chỉ việc tạo một Bitmap với font chữ đó…


    Private Function str2Bitmap(str As String) As Bitmap
        Dim img As Image = New Bitmap(16, 16)
        Dim g As Graphics = Graphics.FromImage(img)

        g.DrawString(str, m_font, Brushes.White, m_pOrigin)

        Return img
    End Function

…và cập nhật trayIcon:


        Dim icon As Icon = icon.FromHandle(str2Bitmap(strSecond).GetHicon)
        trayIcon.Icon = icon

Nếu muốn tối ưu hiệu năng, ta có thể lưu các icon đã tạo và sử dụng lại thay vì luôn tạo mới, tuy nhiên cũng không quan trọng lắm đối với bài viết này.

Source Code (VS2010, .Net Framework 2.0)

http://www.mediafire.com/?d1gf5g6fial1t9s

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s