今天講解的是字型對話盒,這一個程式比起檔案對話盒單純很多,只要載入系統內所有的字型 名稱,依使用者的設定變更範例文字的樣式,再將使用者的設定存入變數之中就可以了,先來看程式吧
Private Sub Form_Load()
Dim dx%, dy%, rc&

'Set Form Position,Get System Font Name,Set cmbAlign Value,Check Profile's Value
'Set then Object's Value

'略
Dim i As Integer

For i% = 0 To Screen.FontCount - 1
    If Left$(Screen.Fonts(i%), 1) <> "@" Then lstFontName.AddItem Screen.Fonts(i%)
Next i%

經由Screen物件的Fonts陣列可以取得系統的字型名稱,我們把它一一取出加到ListBox裡

cmbAlign.AddItem "置於左上"
'略

If ProFile(SetProFileNo).TextSet.Size = 0 Or ProFileUpdate = True Then
   txtFontSize.Text = Trim$(Str$(FontBuffer.Size))
Else
   txtFontSize.Text = Trim$(Str$(ProFile(SetProFileNo).TextSet.Size))
End If

If ProFile(SetProFileNo).TextSet.Alignment = 0 Or ProFileUpdate = True Then
   cmbAlign.ListIndex = FontBuffer.Alignment
Else
   cmbAlign.ListIndex = ProFile(SetProFileNo).TextSet.Alignment
End If

If ProFile(SetProFileNo).TextSet.Name <> "" And ProFileUpdate = False Then
   For i% = 0 To Screen.FontCount - 1
       If lstFontName.List(i%) = ProFile(SetProFileNo).TextSet.Name Then
          lstFontName.ListIndex = i%
          Exit For
       End If
   Next i%
End If
   
If i% = Screen.FontCount Or ProFile(SetProFileNo).TextSet.Name = "" Or ProFileUpdate = True Then
   For i% = 0 To Screen.FontCount - 1
       If lstFontName.List(i%) = FontBuffer.Name Then
          lstFontName.ListIndex = i%
          Exit For
       End If
   Next i%
End If


我們根據Profile的資料來判斷要在這個From所顯式出的資料,如果有資料則從ProFile載入資料 ,否則載入FontBuffer的資料
lblSample.FontName = lstFontName.Text
lblSample.FontSize = CInt(Val(txtFontSize.Text))
If ProFile(SetProFileNo).TextSet.Color = 0 Or ProFileUpdate = True Then
   lblSample.ForeColor = FontBuffer.Color
Else
   lblSample.ForeColor = ProFile(SetProFileNo).TextSet.Color
End If
End Sub

最後將這些值代入lblSample即可
嗯....這一個部份好像沒什麼好說的,混了一點版面,好吧,那麼我們來看桌布的更換程式吧。 哇咧....程式沒寫錯,但是.....作者在設計視窗有兩個地方可以設定桌布,一個是上方的Menu, 一個是從FileList Box或 ListBox的快顯功能表指定,但...我把上方Menu的程式完全忘記了... 其實只要簡單的幾行就好了,我大多是用快顯功能表來切換桌布,根本沒有發現Menu的程式忘了 ....等一下說明完後請自行補上....
設定桌布有三種方式,但是它的步驟其實完全一樣,差別只在於最後傳給Windows決定桌布顯示 方式的參數,這裡我把它寫成Set_WallPaper這個副程式來做,這裡需要傳入一個參數, 也就是使用者決定的桌布顯示方式
Private Sub Set_WallPaper(WallPaperType As Integer)
'略

On Error GoTo SetWallPaperError
Dim X As String
Me.MousePointer = 11
chgFileName$ = winPath & "MyTheme.BMP"

因為接下來的動作,依圖檔大小,可能會暫時佔住系統,所以我們先把遊標改為忙錄中, 然後設定一個變數,存放Windows的路徑和一個MyTheme.BMP的檔名。在這裡,我是仿造AcdSee 的做法,將你指定要成為桌布的圖檔另存為Mytheme.BMP,再將桌布指定成這個檔案,為什麼要 這麼做呢?Windows98雖然可以直接指定非BMP格式的圖檔做為桌布,但是它其實是利用Active Desktop的功能來作的,實際上,Windows的桌布還是以BMP為主,而且,如果使用者用的是 Windows95的舊版,更不可能可以將非BMP格式的圖檔設為桌布了,因此我們才要將圖檔再存成 BMP的格式,這樣才能確定使用者能成功切換桌布。而將它存成同一個檔名,則是為了避免資源的 浪費,一個時間我們只能指定一張圖成為桌布,如果我們將每張指定過的圖都另存一份BMP格式的 圖,那麼磁碟機容量的消耗恐怕是很巨大的(BMP檔沒有經過壓縮,一張全彩的800*600就超過1MB 了)
If Dir(picName$) = "" Then
   Me.MousePointer = 0
   
   MsgBox "指定的圖檔不存在,請確定所指定的圖檔是正確的", 48, "系統錯誤"
   Exit Sub
End If


If imgPreView.Picture = 0 Then
   Me.MousePointer = 0

   MsgBox "沒有指定圖檔,無法更換桌布", 48, "系統錯誤"
   Exit Sub
Else
   Me.AutoRedraw = True
   DoEvents
   
   SavePicture picSource, chgFileName$
End If

Select Case WallPaperType
Case SET_WALLPAPER_CENTER
     '1.Open Registry & Get Registry Data's hkey(HKEY_CURRENT_USER\Control Panel\Desktop)
     '2.Set Values For Registry (hkey:key handle,"TitleWallpaper":valueName
     '  0:保留參數,無用處,REG_SZ :資料型別 unicode nul terminaled string
     '  Byval "0":set value(Type string),1:Len(set value)
     '3.Close Registry
     
     RegOpenKey HKEY_CURRENT_USER, "Control Panel\Desktop", hkey
     RegSetValueEx hkey, "TileWallpaper", 0, REG_SZ, ByVal "0", 1
     RegSetValueEx hkey, "WallpaperStyle", 0, REG_SZ, ByVal "0", 1

          
Case SET_WALLPAPER_TITLE

     RegOpenKey HKEY_CURRENT_USER, "Control Panel\Desktop" & Chr$(0), hkey
     RegSetValueEx hkey, "TileWallpaper", 0, REG_SZ, ByVal "1", 1
     
Case SET_WALLPAPER_FULL
     RegOpenKey HKEY_CURRENT_USER, "Control Panel\Desktop", hkey
     RegSetValueEx hkey, "TileWallpaper", 0, REG_SZ, ByVal "0", 1
     RegSetValueEx hkey, "WallpaperStyle", 0, REG_SZ, ByVal "2", 1

End Select
RegCloseKey hkey

這裡我們先用Dir及Picture的屬性來檢查要儲存的圖檔是否正確,正確的話就用SavePicture將圖 檔儲存起來,接者使用RegOpenKey等API來設定桌布的展示方式,只要分別設定其TitleWallpaper 及WallpaperStyle即可,Windows95必須有裝Plus!或IE4才有展開的效果,這一點要注意,不過 並不會因此發生程式錯誤,不用擔心。
rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, chgFileName$, SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)

Me.MousePointer = 0
MsgBox "桌布更換完畢", 64, "系統回覆"
Exit Sub

'略
   
End Sub

最後一步就簡單了,只要呼叫SystemParametersInfo這個API,就可以將桌布變更了, SystemParameter這個API的功用很多,要詳細解釋太佔篇幅了,可以自己查看MSDN。

上個禮拜比較忙一點,這個禮拜小偷懶一下,就到此為止囉!下禮拜講解我本人最討厭的圖型 特效的部份!Screen Saver Maker Ver0.91 BugFix即將放出(...大概吧?),Ver 1.0Beta 既將開始動工,會加入一些新功能喔!有興趣的大大力的期待吧(預定2000年推出?)

回到VB教學教室