找回密码
 加入
搜索
查看: 14301|回复: 27

[AU3基础] 如何实现按钮下拉菜单?(已解决)

 火... [复制链接]
发表于 2011-5-20 18:45:29 | 显示全部楼层 |阅读模式
本帖最后由 xiezhang6263 于 2011-5-20 21:51 编辑

我想通过button点击实现下拉菜单的目的。
这个不是我想要的目的,我想保证前面的按钮的样式和这个按钮下拉菜单的按钮统一的样式。麻烦知道的朋友帮忙下,谢谢。
#include <GuiToolbar.au3>
#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $hGUI
Local $hToolbar
Local Enum $idNew = 1000, $idOpen
$hGUI = GUICreate("Toolbar", 200,100)
$hToolbar = _GUICtrlToolbar_Create($hGUI)
_GUICtrlToolbar_SetExtendedStyle($hToolbar, $TBSTYLE_EX_DRAWDDARROWS)
GUISetState()
_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_SMALL_COLOR)
_GUICtrlToolbar_AddButton($hToolbar, $idNew, $STD_FILENEW, 0, $BTNS_DROPDOWN)
_GUICtrlToolbar_AddButton($hToolbar, $idOpen, $STD_FILEOPEN)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $iCode, $hMenu
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $iCode = DllStructGetData($tNMHDR, "Code")
    If $iCode = $TBN_DROPDOWN Then
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单1")
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单2")
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单3")
        _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)
        _GUICtrlMenu_DestroyMenu($hMenu)
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
发表于 2011-5-20 19:07:27 | 显示全部楼层
我真的没有看明白楼主想干什么
 楼主| 发表于 2011-5-20 19:13:37 | 显示全部楼层
回复 2# haijie1223
如上图,就是想把前面的图标变成按钮,然后点击按钮会出来像菜单1,菜单2这样的选项,然后对菜单1菜单2进行相应的func。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-5-20 19:19:34 | 显示全部楼层
这个应该好实现,不过我得回家了。晚上回去研究一下。
 楼主| 发表于 2011-5-20 19:27:57 | 显示全部楼层
回复 4# haijie1223

谢谢,辛苦了,我在论坛里搜索了好久都没没找到需要的。
发表于 2011-5-20 20:41:37 | 显示全部楼层
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>

Opt("GUICoordMode", 1)
$hGUI = GUICreate("Menu", 400, 300)
Global Const $idButton = GUICtrlCreateButton("Test", 100, 100, 80, 40)
Global Enum $idNew = 1000, $idOpen, $idClose, $idExit
Global $hMenu
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem ($hMenu, 0, "新建文件", $idNew)
_GUICtrlMenu_InsertMenuItem ($hMenu, 1, "", 0)
_GUICtrlMenu_InsertMenuItem ($hMenu, 2, "打开文件", $idOpen)
_GUICtrlMenu_InsertMenuItem ($hMenu, 3, "关闭文件", $idClose)
_GUICtrlMenu_InsertMenuItem ($hMenu, 4, "", 0)
_GUICtrlMenu_InsertMenuItem ($hMenu, 5, "退出", $idExit)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            _GUICtrlMenu_DestroyMenu($hMenu)
            GUIDelete()
            Exit
        Case $idButton
            ShowMenu($hGUI)
    EndSwitch
WEnd

Func New()
    MsgBox(0, "信息", "新建文件")
EndFunc

Func Open()
    MsgBox(0, "信息", "打开")    
EndFunc

Func Close()
    MsgBox(0, "信息", "关闭")    
EndFunc

Func ShowMenu($hWnd)
    Local $aButton = ControlGetPos("", "", $idButton)
    Local $x = $aButton[0]
    Local $y = $aButton[1] + $aButton[3]
    ClientToScreen($hGUI, $x, $y)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd, $x, $y)
    Return True
EndFunc   ;==>WM_CONTEXTMENU

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $iwParam
         Case $idNew
                        New()
        Case $idOpen
            Open()
        Case $idClose
            Close()
        Case $idExit
            Exit
    EndSwitch
EndFunc

Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate("int;int")
    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)
    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    $stPoint = 0
EndFunc   ;==>ClientToScreen
 楼主| 发表于 2011-5-20 21:03:09 | 显示全部楼层
回复 6# 3mile


谢谢你,3mile。
问题解决了,还有就是下面这个帖子的问题。
http://www.autoitx.com/forum.php?mod=viewthread&tid=24463&highlight=
麻烦帮忙下,有没办法让打开的google翻译网页,提取出网页的源码跟右击的提取出来的是一样的。
_IEDocReadHTML用这个提取出来的跟源文件是不一样的,不知道还有其他的办法没有,我现在用的是模拟鼠标键盘的操作,右击提取出来的,然后通过读取保存的源文件.txt正则得到自己想要的。麻烦3mile帮忙下,看有没好的解决办法。谢谢。
发表于 2011-5-20 21:05:46 | 显示全部楼层
回复 7# xiezhang6263
提取源码干什么?是想要发送需要翻译的文件,返回翻译好的内容吗?
 楼主| 发表于 2011-5-20 21:15:34 | 显示全部楼层
回复 8# 3mile


    不是的,是我们内网的网页上需要提取相关人员的信息,但是这个信息是需要输入身份证查询得到的基本信息的,跟这个google翻译有点差不多的原理,输入不同的身份证号码会得到不同人员的信息,里面有户籍地等等,我想就是在这个网页上输入身份证号码,把里面得到的信息反馈给我们。
发表于 2011-5-20 21:16:48 | 显示全部楼层
学习下。。。。。。。。。。
 楼主| 发表于 2011-5-21 00:17:57 | 显示全部楼层
回复 8# 3mile
要是有两个按钮要实现这样的效果每个按钮下面的菜单对应的是不同的项目,请问如何操作呢?谢谢。
发表于 2011-5-21 08:51:20 | 显示全部楼层
来晚了  看到3m的源码 我就不发源码了  我的代码好麻烦 效率太低  学习了
发表于 2011-5-21 10:33:54 | 显示全部楼层
回复 11# xiezhang6263
#include <GuiToolbar.au3>
#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $hGUI
Local $hToolbar
Global Enum $idOpen = 1000, $idSave, $idInfo
Global Enum $idOpen1 = 2000, $idSave1, $idInfo1
$hGUI = GUICreate("Toolbar", 200, 100)
$Button = GUICtrlCreateButton("Button", 100, 10)
$Button1 = GUICtrlCreateButton("Button1", 100, 60)
GUISetState()
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
;~ GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
        $nMsg=GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE 
                        Exit
                Case $Button,$Button1
                        WM_CONTEXTMENU($hGUI)                
        EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Switch $iwParam
                Case $idOpen1
                        _WinAPI_ShowMsg("关于")
                Case $idSave1
                        _WinAPI_ShowMsg("设置")
                Case $idInfo1
                        _WinAPI_ShowMsg("退出")
                Case $idOpen
                        _WinAPI_ShowMsg("按钮_关于")
                Case $idSave
                        _WinAPI_ShowMsg("按钮_设置")
                Case $idInfo
                        _WinAPI_ShowMsg("按钮_退出")
        EndSwitch
EndFunc   ;==>WM_COMMAND

Func WM_CONTEXTMENU($hWnd)
        Local $aa = GUIGetCursorInfo()
        If $aa[4] = $Button Then
                Local $hMenu
                $hMenu = _GUICtrlMenu_CreatePopup()
                _GUICtrlMenu_InsertMenuItem($hMenu, 0, "按钮_关于", $idOpen)
                _GUICtrlMenu_InsertMenuItem($hMenu, 1, "按钮_设置", $idSave)
                _GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0)
                _GUICtrlMenu_InsertMenuItem($hMenu, 3, "按钮_退出", $idInfo)
                _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)
                _GUICtrlMenu_DestroyMenu($hMenu)
                Return True
        ElseIf $aa[4]=$Button1 Then
                Local $hMenu
                $hMenu1 = _GUICtrlMenu_CreatePopup()
                _GUICtrlMenu_InsertMenuItem($hMenu1, 0, "关于", $idOpen1)
                _GUICtrlMenu_InsertMenuItem($hMenu1, 1, "设置", $idSave1)
                _GUICtrlMenu_InsertMenuItem($hMenu1, 3, "", 0)
                _GUICtrlMenu_InsertMenuItem($hMenu1, 3, "退出", $idInfo1)
                _GUICtrlMenu_TrackPopupMenu($hMenu1, $hGUI)
                _GUICtrlMenu_DestroyMenu($hMenu1)
                Return True
        EndIf
        Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_CONTEXTMENU
发表于 2011-5-21 10:50:02 | 显示全部楼层
有三笑兄的地方就会有欢乐的笑声!!

实践证明,笑兄是个非常热心的人!!挺你!!
 楼主| 发表于 2011-5-21 20:35:49 | 显示全部楼层
回复 13# 3mile

谢谢3mile的热心帮助,假如我想实现两个button的下拉方式,跟你提供的第一个方法一样的样式
是用ControlGetPos相对控件而不是GUIGetCursorInfo()相对gui窗口,请问该怎么实现呢?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-23 23:11 , Processed in 0.082561 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表