xiezhang6263 发表于 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

haijie1223 发表于 2011-5-20 19:07:27

我真的没有看明白楼主想干什么

xiezhang6263 发表于 2011-5-20 19:13:37

回复 2# haijie1223
如上图,就是想把前面的图标变成按钮,然后点击按钮会出来像菜单1,菜单2这样的选项,然后对菜单1菜单2进行相应的func。

haijie1223 发表于 2011-5-20 19:19:34

这个应该好实现,不过我得回家了。晚上回去研究一下。

xiezhang6263 发表于 2011-5-20 19:27:57

回复 4# haijie1223

谢谢,辛苦了,我在论坛里搜索了好久都没没找到需要的。

3mile 发表于 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
    Local $y = $aButton + $aButton
    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

xiezhang6263 发表于 2011-5-20 21:03:09

回复 6# 3mile


谢谢你,3mile。
问题解决了,还有就是下面这个帖子的问题。http://www.autoitx.com/forum.php?mod=viewthread&tid=24463&highlight=麻烦帮忙下,有没办法让打开的google翻译网页,提取出网页的源码跟右击的提取出来的是一样的。
_IEDocReadHTML用这个提取出来的跟源文件是不一样的,不知道还有其他的办法没有,我现在用的是模拟鼠标键盘的操作,右击提取出来的,然后通过读取保存的源文件.txt正则得到自己想要的。麻烦3mile帮忙下,看有没好的解决办法。谢谢。

3mile 发表于 2011-5-20 21:05:46

回复 7# xiezhang6263
提取源码干什么?是想要发送需要翻译的文件,返回翻译好的内容吗?

xiezhang6263 发表于 2011-5-20 21:15:34

回复 8# 3mile


    不是的,是我们内网的网页上需要提取相关人员的信息,但是这个信息是需要输入身份证查询得到的基本信息的,跟这个google翻译有点差不多的原理,输入不同的身份证号码会得到不同人员的信息,里面有户籍地等等,我想就是在这个网页上输入身份证号码,把里面得到的信息反馈给我们。

vipanjintian 发表于 2011-5-20 21:16:48

学习下。。。。。。。。。。

xiezhang6263 发表于 2011-5-21 00:17:57

回复 8# 3mile
要是有两个按钮要实现这样的效果每个按钮下面的菜单对应的是不同的项目,请问如何操作呢?谢谢。

haijie1223 发表于 2011-5-21 08:51:20

来晚了看到3m的源码 我就不发源码了我的代码好麻烦 效率太低学习了

3mile 发表于 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 = $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=$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

meteor0330 发表于 2011-5-21 10:50:02

有三笑兄的地方就会有欢乐的笑声!!

实践证明,笑兄是个非常热心的人!!挺你!!

xiezhang6263 发表于 2011-5-21 20:35:49

回复 13# 3mile

谢谢3mile的热心帮助,假如我想实现两个button的下拉方式,跟你提供的第一个方法一样的样式
是用ControlGetPos相对控件而不是GUIGetCursorInfo()相对gui窗口,请问该怎么实现呢?
页: [1] 2
查看完整版本: 如何实现按钮下拉菜单?(已解决)