新手上路 发表于 2008-11-3 23:03:33

字体删除程序,写不下去了

在网上看到一个字体删除程序:


今天试着做了一个,目前遇到一些困难,寻求帮助。


程序目的:
1/(已实现)寻找字体文件夹下所有 TTF 字体并形成树状列表;
2/(已实现)预设一些可以删除的字体,若存在,则默认选定;
3/(未实现)单击一个按钮,删除选定的字体。
现在的难题是,无法得到复选框后面的字体名,请高手帮忙完成这个代码。
GUIctrlRead 只能得到复选框的状态,而不能得到其后的文本。

#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <Array.au3>

$Debug_TV = False

Global $hItem, $hTreeView,$search
Global $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
       
FileChangeDir(@WindowsDir&"\fonts\")
dim $i=0,$size=0
_filelist("C:\Windows\Fonts\")

$main=GUICreate("Test - Newbie", 400, 300)

        $hTreeView = GUICtrlCreateTreeView(5, 20, 250, 268, $iStyle, $WS_EX_CLIENTEDGE)
        GUISetFont (9,400,1,"Tahoma")

        $label=GUICtrlCreateLabel("左边默认选定的字体都是多余的英文字体,删除他们不会对您的系统造成影响。",270,20,120,60)
        $button1=GUICtrlCreateButton("删除左边"&@CRLF&"选定的字体",270,90,100,50,$BS_MULTILINE)

        GUISetState()

$search = FileFindFirstFile("*.ttf")


For $x = 1 To $i
        $file = FileFindNextFile($search)
        If $file <> "" Then
                $filesize=Round(FileGetSize(@WindowsDir&"\fonts\"&$file)/1024,1)
                $x= GUICtrlCreateTreeViewItem($file&" ,"&$filesize&" KB",$hTreeView)
                If $file= "ANTQUAB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ANTQUABI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ANTQUAI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ARIALN.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ARIALNB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ARIALNBI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "ARIALNI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BKANT.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BOOKOS.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BOOKOSB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BOOKOSBI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BOOKOSI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "BSSYM7.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CALIBRI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CALIBRIB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CALIBRII.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CALIBRIZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CAMBRIA.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CAMBRIAB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CAMBRIAI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CAMBRIAZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CANDARA.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CANDARAB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CANDARAI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CANDARAZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CENTURY.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSOLA.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSOLAB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSOLAI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSOLAZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSTAN.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSTANB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSTANI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CONSTANZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CORBEL.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CORBELB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CORBELI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "CORBELZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GARA.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GARABD.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GARAIT.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "georgia.ttf" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "georgiab.ttf" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "georgiai.ttf" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "georgiaz.ttf" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GOTHIC.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GOTHICB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GOTHICBI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "GOTHICI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "MSMINCHO.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "MTCORSVA.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "REFSAN.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "REFSPCL.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SEGOEUI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SEGOEUIB.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SEGOEUII.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SEGOEUIZ.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SIMLI.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "SIMYOU.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "WINGDNG2.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
                If $file= "WINGDNG3.TTF" Then
                        GUICtrlSetState($x,$gui_Checked)
                EndIf
        EndIf
Next
        FileClose($search)

;WinSetOnTop($main,"",1)


While 1
        $msg = GUIGetMsg()
                Select
                        Case $msg = $GUI_EVENT_CLOSE
                                Exit
                EndSelect
WEnd

Func _filelist($searchdir)      ;统计文件个数
        $search = FileFindFirstFile($searchdir & "*.ttf")
        If $search = -1 Then return -1                   ;;;;如果找不到,返回值 -1
        While 1
                $file = FileFindNextFile($search)         ;;;查找下一个文件
                If @error Then                        ;;;如果找不到文件
                        FileClose($search)                     ;;;则关闭此句柄
                        return                              ;;返回
                EndIf
                $i=$i+1
        WEnd
EndFunc


[ 本帖最后由 新手上路 于 2008-12-13 21:20 编辑 ]

新手上路 发表于 2008-11-4 11:05:06

顶上去                                       .

netegg 发表于 2008-11-4 14:39:18

$i =1
while 1
        $font= RegEnumVal("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $i)
if @error <>0 then
   exitloop
else
$fontdocname = RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" , $font)
ConsoleWrite($fontdocname & @CRLF)
endif
$i=$i+1
wend
从注册表走一下,对比多余文件删除就行了

[ 本帖最后由 netegg 于 2008-11-4 14:41 编辑 ]

新手上路 发表于 2008-11-4 15:01:24

原帖由 netegg 于 2008-11-4 14:39 发表 http://www.autoitx.com/images/common/back.gif
$i =1
while 1
        $font= RegEnumVal("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $i)
if @error 0 then
   exitloop
else
$fontdocname = RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\Cur ...
你这个代码实际还是得到字体列表(我在前面已用不同的方法实现),不是我所要求的得到已选定的复选框后面的字体名。

[ 本帖最后由 新手上路 于 2008-11-4 15:04 编辑 ]

netegg 发表于 2008-11-4 16:06:37

#include <GuiTreeView.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
Opt("GUIOnEventMode", 1)
Global $item,$text
$msg = GUIGetMsg()
$Form3 = GUICreate("字体设置", 223, 304, 344, 197)
$hTreeview = GUICtrlCreateTreeView(9, 10, 205, 227)
GUICtrlCreateButton("显示列表", 9, 283, 205, 17, 0)
GUICtrlSetOnEvent(-1, "button1click")
GUICtrlCreateButton("选择", 9, 262, 94, 17, 0)
GUICtrlSetOnEvent(-1, "ok")
GUISetOnEvent($GUI_EVENT_CLOSE, "Form3Close")
GUISetState(@SW_SHOW)
While 1
        Sleep(100)
WEnd
Func button1click()
    $i =1
    while 1
                $key = RegEnumVal("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $i)
                $doc = RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $key)
      select
             Case @error <>0
            exitloop
         case$doc <> ""
            GUICtrlCreateTreeViewItem($doc, $hTreeview)
           EndSelect
           $i=$i+1
    wend
endfunc
Func ok()
                        $item = GUICtrlRead($hTreeview)
            $text = GUICtrlRead($item, 1)
        msgbox("","",$text)
EndFunc
Func Form3Close()
        Exit
EndFunc

[ 本帖最后由 netegg 于 2008-11-4 16:07 编辑 ]

新手上路 发表于 2008-11-4 17:00:25

楼上的兄弟辛苦了,你提供了一种思路:

        $item = GUICtrlRead($hTreeview)
        $text = GUICtrlRead($item, 1)
        MsgBox("", "", $text)

读取选中的项目文本,是基于项目被选中的情况下。而与前面的复选框无关。
我所要实现的目的是,项目前面的复选框和项目文本关联起来,通过复选框ID,就能得到后面的项目文本。

[ 本帖最后由 新手上路 于 2008-11-4 20:54 编辑 ]

liongodmien 发表于 2008-11-4 17:08:26

原帖由 新手上路 于 2008-11-4 17:00 发表 http://www.autoitx.com/images/common/back.gif
楼上的兄弟辛苦了,你提供了一种思路:

        $item = GUICtrlRead($hTreeview)
        $text = GUICtrlRead($item, 1)
        MsgBox("", "", $text)

读取选中的项目文本,是基于项目被选中的情况下。而与前面的复选框无关。 ...
那你可以GUICTRLREAD($ITEM)后再GUICTRLREAD($ITEM,1)

新手上路 发表于 2008-11-4 17:34:54

原帖由 liongodmien 于 2008-11-4 17:08 发表 http://www.autoitx.com/images/common/back.gif

那你可以GUICTRLREAD($ITEM)后再GUICTRLREAD($ITEM,1)

在我这个实例中,直接使用了数字作为 item 的变量名,因而就无法使用 GUICtrlRead($item) 啦

netegg 发表于 2008-11-4 18:18:28

treeviewitem有id吗?

netegg 发表于 2008-11-4 18:24:25

如果真要这么做,也不是不行,简单点的,你不妨另做一个附加的文本框,把选择的不要的字体文件名全都输入到文本框里,一块处理,岂不更简单,而且还可以还原,比这个更好吧

新手上路 发表于 2008-11-4 18:35:40

原帖由 netegg 于 2008-11-4 18:24 发表 http://www.autoitx.com/images/common/back.gif
如果真要这么做,也不是不行,简单点的,你不妨另做一个附加的文本框,把选择的不要的字体文件名全都输入到文本框里,一块处理,岂不更简单,而且还可以还原,比这个更好吧

我提的这个问题其实是为了讨论实现过程,而不是结果。你说的这个方法也可以,但还是没我的好。因为如果使用者没弄清楚就误删除文本框里的字体名,需要修改时只能重新加载。而我这个只需要鼠标简单的点击即可。

netegg 发表于 2008-11-4 18:52:10

明白了,取项目句柄,和后面的文本结合成一个二维变量就行了

liongodmien 发表于 2008-11-4 20:02:12

原帖由 新手上路 于 2008-11-4 17:34 发表 http://www.autoitx.com/images/common/back.gif


在我这个实例中,直接使用了数字作为 item 的变量名,因而就无法使用 GUICtrlRead($item) 啦
那个$item不过是个例子而已!实际中你可以用任意的$XXXXX

新手上路 发表于 2008-11-4 20:52:31

原帖由 liongodmien 于 2008-11-4 20:02 发表 http://www.autoitx.com/images/common/back.gif

那个$item不过是个例子而已!实际中你可以用任意的$XXXXX

我也是举例,呵呵

即即 发表于 2008-11-4 22:21:36

你的问题应该是:
项目内容 = GUICtrlRead( 项目ID, 1 )
页: [1] 2
查看完整版本: 字体删除程序,写不下去了