cfanpc 发表于 2017-8-13 19:58:30

关于自动生成按钮和按钮内容提问[已解决]

本帖最后由 cfanpc 于 2017-8-18 12:52 编辑

软件功能很简单,就是集成一个小工具箱一样的
因为有的时间变动比较大,老是要去修改源码,很麻烦,于是想到用INI文件来代替,按钮标题和要执行的代码都在INI文件里面,要维护也方便,如果弄个内网服务器,自动检测INI文件更新下载就好了。
但是现在写不下去了   没思路   深奥的也不会   求各位大神帮帮忙#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 333, 438)
;$Button1 = GUICtrlCreateButton("Button1", 40, 32, 121, 49)
;$Button2 = GUICtrlCreateButton("Button1", 183, 31, 121, 49)
Dim $anniu
Dim $two
Global $a
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i = 0 To 6
        $anniu[$i] = GUICtrlCreateButton("", 20, 20 + 55 * ($i), 121, 50, 0, $bs_bitmap)
        ;$two[$i] = GUICtrlCreateButton("", 180, 20 + 55 * ($i), 121, 50, 0, $bs_bitmap)
Next
ok()
While 1
        $nMsg = GUIGetMsg()
                        Switch $nMsg
                                Case $GUI_EVENT_CLOSE
                                        Exit
;~                                 Case $anniu[$i]
;~                                         ShellExecute($a[$i][$i])
                                        EndSwitch
WEnd


Func ok()
        Local $ini = @ScriptDir & "\file.ini"
        If FileExists($ini) = 0 Then
                MsgBox(32, "警告", "配置文件丢失或损坏,请联系管理员")
                Exit
        EndIf
       $a = IniReadSection($ini, "按钮")
        If Not @error Then
                For $i = 0 To $a
                        GUICtrlSetData($anniu[$i], $a[$i])
                       


                       
                       
                Next
        EndIf
       
EndFunc   ;==>ok


水木子 发表于 2017-8-14 11:21:08

本帖最后由 水木子 于 2017-8-14 11:22 编辑

Config.ini 文件格式如下,图标功能你可能用得上,先给你预留着。
link=www.autoitx.com
ico=

[百度]
link=www.baidu.com
ico=

[计算器]
link=calc.exe
ico=

[记事本]
link=notepad.exe
ico=示例代码如下,不过还存在问题,比如按钮数量过多,超出GUI范围,是不是要加滚动条呢!你自己研究吧!
Global $sConfig = @ScriptDir & '\Config.ini'
Global $aConfig = IniReadSectionNames($sConfig)
Global $iButtonCount = $aConfig
Global $aButton[$iButtonCount] ;按钮总数
Global $iNumber = 2 ;每行按钮数量
Global $iSpacingX = 180, $iSpacingY = 60 ;垂直、水平,间距

Opt('GUIOnEventMode', 1)

GUICreate('', 400, 400)
GUISetOnEvent(-3, '_ButtonEvents')
For $i = 0 To UBound($aButton) - 1
        $aButton[$i] = GUICtrlCreateButton($aConfig[$i + 1], $iSpacingX * Mod($i, $iNumber) + 35, $iSpacingY * Floor($i / $iNumber) + 25, 150, 50)
;~         GUICtrlSetImage(-1, "shell32.dll", 100)
        GUICtrlSetOnEvent(-1, '_ButtonEvents')
Next
GUISetState()

While 1
        Sleep(500)
WEnd

Func _ButtonEvents()
        Switch @GUI_CtrlId
                Case -3
                        Exit
                Case $aButton To $aButton
                        $sButtonText = GUICtrlRead(@GUI_CtrlId)
                        $sLink = IniRead($sConfig, $sButtonText, 'link', '')
                        ShellExecute($sLink)
        EndSwitch
EndFunc   ;==>_ButtonEvents

xyhqqaa 发表于 2017-8-14 15:09:53

学习了。。。赞赞赞

yamakawa 发表于 2017-8-14 17:37:13

回复 2# 水木子


    看了他这帖子我也写了一段code。。基本和水大神的差不多。但是我是提早全部读取到数组,免去后期执行过程还要读ini文件,感觉没什么含量就没上传

chzj589 发表于 2017-8-14 20:21:04

回复 2# 水木子

木子,请教:加滚动条后,如何用鼠标滚轮滑动

tubaba 发表于 2017-8-15 10:08:08



这种效果?

水木子 发表于 2017-8-15 10:19:48

回复 6# tubaba

嗯!这个不错。

yamakawa 发表于 2017-8-15 11:16:08

本帖最后由 yamakawa 于 2017-8-15 12:27 编辑

回复 5# chzj589

首先        GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")
然后        _GUIScrollBars_Init($hGUI);窗口句柄
最简单函数。没做判断Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local $updown = BitShift($wParam, 16)

        _GUIScrollBars_ScrollWindow($hWnd, 0, -$updown / 10)


        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOUSEWHEEL

chzj589 发表于 2017-8-15 11:42:36

回复 8# yamakawa
谢谢!但页面滚动时,而滚动条却不动?能同步吗

cfanpc 发表于 2017-8-15 11:48:09

回复 6# tubaba


    你好,能麻烦您发下源码上来给我们学习一下么

cfanpc 发表于 2017-8-15 11:55:14

回复 2# 水木子


    谢谢水木大神,我要好好消化一下

yamakawa 发表于 2017-8-15 12:21:32

回复 9# chzj589


    那就比较麻烦。。。
首先 获取_GUIScrollBars_GetScrollInfo
然后_GUIScrollBars_SetScrollInfo
修改数据结构中。npos的数据

yamakawa 发表于 2017-8-15 12:44:38

回复 9# chzj589 Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam) ;稍微修改帮助文件中的例子
        #forceref $hWnd, $iMsg, $lParam
        Local $updown = BitShift($wParam, 16)
        $updown = $updown / 120
        Local $iIndex = -1, $iCharY, $iPosY
        Local $iMin, $iMax, $iPage, $iPos, $iTrackPos

        For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
                If $__g_aSB_WindowInfo[$x] = $hWnd Then
                        $iIndex = $x
                        $iCharY = $__g_aSB_WindowInfo[$iIndex]
                        ExitLoop
                EndIf
        Next
        If $iIndex = -1 Then Return 0

        Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
        $iMin = DllStructGetData($tSCROLLINFO, "nMin")
        $iMax = DllStructGetData($tSCROLLINFO, "nMax")
        $iPage = DllStructGetData($tSCROLLINFO, "nPage")
        $iPosY = DllStructGetData($tSCROLLINFO, "nPos")
        $iPos = $iPosY

        $iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")


        DllStructSetData($tSCROLLINFO, "nPos", $iPos - $updown)

        DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
        _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        $iPos = DllStructGetData($tSCROLLINFO, "nPos")

        If ($iPos <> $iPosY) Then
                _GUIScrollBars_ScrollWindow($hWnd, 0, $iCharY * ($iPosY - $iPos))
                $iPosY = $iPos
        EndIf

        Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_MOUSEWHEEL

chzj589 发表于 2017-8-15 12:59:56

回复 13# yamakawa
谢谢!太感谢了!{:face (361):}

tubaba 发表于 2017-8-15 13:09:28

http://www.autoitx.com/thread-55890-1-1.html
页: [1] 2
查看完整版本: 关于自动生成按钮和按钮内容提问[已解决]