求助:这个是什么控件呢?
本帖最后由 awfymwvf 于 2011-3-16 14:38 编辑我看了这个贴子:
http://www.autoitx.com/forum.php?mod=viewthread&tid=19411&highlight=%B9%F6%B6%AF%CC%F5
这界面是如何做出来的。这个软件安装器是读取INI来创建每一行的。也就是说是动态创建的。
这到底是个什么控件呢。是多个控件在一起,还是一个自己设计的控件呢?
如果自已创建。左边的各项都是动态创建的。右边的滚动条怎么实现呢?
自己想了好久也没想出来。唉。。。。
望各位大侠给解惑。谢谢大家了 回复 1# awfymwvf
用 Au3Info 能看到,大概就是标签 + 图片之类,只是不知如何滚动。。。。 随便写了一个,有点乱,但原理是差不多的#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <StaticConstants.au3>
#include <Array.au3>
$GUI = GUICreate("Form1", 700, 500)
GUISetBkColor(0xf3f3f3)
Global $ItemArray
_AddGUI($GUI)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $ItemArray To $ItemArray[$ItemArray] ;CHECKBOX
If GUICtrlRead($nmsg) = 1 Then
$v = _ArraySearch($ItemArray, $nMsg, 1, -1, -1, -1, -1, 0)
If $ItemArray[$v] = $nMsg Then
GUICtrlSetBkColor($ItemArray[$ItemArray], $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor($ItemArray[$ItemArray], 0x0000ff)
GUICtrlSetColor($ItemArray[$ItemArray], 0x0000ff)
GUICtrlSetBkColor($ItemArray[$v], 0x00a8ec)
GUICtrlSetColor($ItemArray[$v], 0xffffff)
GUICtrlSetColor($ItemArray[$v], 0xffffff)
$ItemArray = $v
EndIf
EndIf
EndSwitch
WEnd
Func _AddGUI($GUI)
$Item_GUI = GUICreate("", 550, 400, 120, 70, $WS_CHILD, "", $GUI)
GUISetBkColor(0xffffff)
GUISetState()
Local $ItemNum = 12, $x = 10, $y = 0, $ItemH = 60, $ItemW = 520
For $i = 1 To $ItemNum
GUICtrlCreateGraphic($x, $y+$ItemH, $ItemW, 1, $SS_ETCHEDHORZ) ;建立分割线
ReDim $ItemArray
$ItemArray = GUICtrlCreateCheckbox("", $x+5, $y+25, 15, 15) ;CHECKBOX
$ItemArray = GUICtrlCreateLabel("", $x+30, $y, 490, $ItemH) ;背景框
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateLabel($i & "-" & Random(1111111, 9999999, 1), $x+40, $y+15, 200, 25) ;项目文本
GUICtrlSetFont(-1, 16, 800)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("说明文本:" & Random(1111111, 9999999, 1), $x+40, $y+40, 200, 25) ;项目说明文本
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$ItemArray = GUICtrlCreateLabel("手动安装", $x+340, $y+22, 50, 20)
GUICtrlSetFont(-1, 9, 400, 4)
GUICtrlSetCursor(-1, 0)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$ItemArray = GUICtrlCreateLabel("自动安装", $x+420, $y+22, 50, 20)
GUICtrlSetFont(-1, 9, 400, 4)
GUICtrlSetCursor(-1, 0)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$ItemArray = UBound($ItemArray)-1
$y += $ItemH
Next
GUIRegisterMsg($WM_SIZE, "WM_SIZE")
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
_GUIScrollBars_Init($Item_GUI, 0, $ItemH*$ItemNum*0.059) ;初始化滚动条 上下值的最佳比例是 项目数*单项的高*0.059
GUISwitch($GUI)
EndFunc
Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam) ;设置垂直滚动条
#forceref $Msg, $wParam, $lParam
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Local $index = -1, $yChar, $yPos
Local $Min, $Max, $Page, $Pos, $TrackPos
For $x = 0 To UBound($aSB_WindowInfo) - 1
If $aSB_WindowInfo[$x] = $hWnd Then
$index = $x
$yChar = $aSB_WindowInfo[$index]
ExitLoop
EndIf
Next
If $index = -1 Then Return 0
;获取所有垂直滚动条信息
Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
$Min = DllStructGetData($tSCROLLINFO, "nMin")
$Max = DllStructGetData($tSCROLLINFO, "nMax")
$Page = DllStructGetData($tSCROLLINFO, "nPage")
;为稍后进行比较保存位置
$yPos = DllStructGetData($tSCROLLINFO, "nPos")
$Pos = $yPos
$TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
Switch $nScrollCode
Case $SB_TOP ;点击HOME键盘键
DllStructSetData($tSCROLLINFO, "nPos", $Min)
Case $SB_BOTTOM ;点击END键盘键
DllStructSetData($tSCROLLINFO, "nPos", $Max)
Case $SB_LINEUP ;点击顶端箭头
DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
Case $SB_LINEDOWN ;点击底部箭头
DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
Case $SB_PAGEUP ;点击滚动箱上端的快速滚动
DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
Case $SB_PAGEDOWN ;点击滚动箱上端的快速滚动
DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
Case $SB_THUMBTRACK ;拖动滚动箱
DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
EndSwitch
;~ // 设置位置然后修正它. 由于窗口的调整可能会和设置的值不同.
DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
_GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
;// 如果位置改变, 滚动窗口并升级
$Pos = DllStructGetData($tSCROLLINFO, "nPos")
If ($Pos <> $yPos) Then
_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
$yPos = $Pos
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Func WM_SIZE($hWnd, $Msg, $wParam, $lParam) ;设置窗口尺寸
#forceref $Msg, $wParam
Local $index = -1, $yChar, $xChar, $xClientMax, $xClient, $yClient, $ivMax
For $x = 0 To UBound($aSB_WindowInfo) - 1
If $aSB_WindowInfo[$x] = $hWnd Then
$index = $x
$xClientMax = $aSB_WindowInfo[$index]
$xChar = $aSB_WindowInfo[$index]
$yChar = $aSB_WindowInfo[$index]
$ivMax = $aSB_WindowInfo[$index]
ExitLoop
EndIf
Next
If $index = -1 Then Return 0
Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
;修正客户区域尺寸
$xClient = BitAND($lParam, 0x0000FFFF)
$yClient = BitShift($lParam, 16)
$aSB_WindowInfo[$index] = $xClient
$aSB_WindowInfo[$index] = $yClient
;设置垂直滚动范围和页面大小
DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
DllStructSetData($tSCROLLINFO, "nMin", 0)
DllStructSetData($tSCROLLINFO, "nMax", $ivMax)
DllStructSetData($tSCROLLINFO, "nPage", $yClient / $yChar)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
;设置水平滚动范围和页面大小
DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
DllStructSetData($tSCROLLINFO, "nMin", 0)
DllStructSetData($tSCROLLINFO, "nMax", 2 + $xClientMax / $xChar)
DllStructSetData($tSCROLLINFO, "nPage", $xClient / $xChar)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
Return $GUI_RUNDEFMSG
EndFunc 本帖最后由 afan 于 2011-3-16 21:56 编辑
貌似很多人都对这类工具界面感兴趣哦~ 我看了下那个工具,应该不难做,不过我没兴趣做,也没时间玩它 ^ ^
主要的几乎就是 GUICtrlCreatePic + GUICtrlCreateLabel,复选框也是图片,Tab切换页面也是图片……
另外创建个$WS_CHILD样式的子窗口,至于如何设置滚动条,可以看看 _GUIScrollBars_Init() 例子
没留神LS已经给出例子了…… 效果不错,不过还需调整下,比如 Local $ItemNum = 7 就没滚动条了,或者 =200 位置也不太准~ 将 0.059 改为 0.0598) 貌似就ok了 其实是不用子窗体的. 这其实就是个ListView控件,用标准的SysListView32控件就能实现这样的界面。给ListView加上LVS_OWNERDRAWFIXED样式,在WM_DRAWITEM消息函数中自己画。 看了P大的指点,果然犀利.
呵呵,闻君一席话,胜读十年书.
个人理解如下,希望学会点东西.
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <WinAPI.au3>
;~ typedef struct tagDRAWITEMSTRUCT {
;~ UINT CtlType; //控件类型
;~ UINT CtlID; //控件ID
;~ UINT itemID; //菜单项、列表框或组合框中某一项的索引值
;~ UINT itemAction; //控件行为
;~ UINT itemState; //控件状态
;~ HWND hwndItem; //父窗口句柄或菜单句柄
;~ HDC hDC; //控件对应的绘图设备句柄
;~ RECT rcItem; //控件所占据的矩形区域
;~ DWORD itemData; //列表框或组合框中某一项的值
;~ } DRAWITEMSTRUCT, *PDRAWITEMSTRUCT, *LPDRAWITEMSTRUCT;
;~ 下面详细解释各个变量或机构的含义:
;~ DRAWITEMSTRUCT结构文档(根据Msdn翻译)
;~ DRAWITEMSTRUCT
;~ DRAWITEMSTRUCT 为需要自绘的控件或者菜单项提供了必要的信息。在需要绘制的控件或者菜单项对应的WM_DRAWITEM消息函数中得到一个指向该结构的指针。 DRAWITEMSTRUCT结构的定义如下:
;~ typedef struct tagDRAWITEMSTRUCT {
;~ UINT CtlType;
;~ UINT CtlID;
;~ UINT itemID;
;~ UINT itemAction;
;~ UINT itemState;
;~ HWND hwndItem;
;~ HDC hDC;
;~ RECT rcItem;
;~ ULONG_PTR itemData;
;~ } DRAWITEMSTRUCT;
;~ 结构成员:
;~ CtlType
;~ 指定了控件的类型,其取值如下表所示。
;~ 取值
;~ 描述
;~ ODT_BUTTON
;~ 按钮控件
;~ ODT_COMBOBOX
;~ 组合框控件
;~ ODT_LISTBOX
;~ 列表框控件
;~ ODT_LISTVIEW
;~ 列表视图控件
;~ ODT_MENU
;~ 菜单项
;~ ODT_STATIC
;~ 静态文本控件
;~ ODT_TAB
;~ Tab控件
;~ CtlID
;~ 指定了自绘控件的ID值,而对于菜单项则不需要使用该成员
;~ itemID
;~ 表示菜单项ID,也可以表示列表框或者组合框中某项的索引值。对于一个空的列表框或组合框,该成员的值为–1。这时应用程序只绘制焦点矩形(该矩形的坐标由rcItem 成员给出)虽然此时控件中没有需要显示的项,但是绘制焦点矩形还是很有必要的,因为这样做能够提示用户该控件是否具有输入焦点。当然也可以设置 itemAction 成员为合适值,使得无需绘制焦点。
;~ itemAction
;~ 指定绘制行为,其取值可以为下表中所示值的一个或者多个的联合。
;~ 取值
;~ 描述
;~ ODA_DRAWENTIRE
;~ 当整个控件都需要被绘制时,设置该值
;~ ODA_FOCUS
;~ 如果控件需要在获得或失去焦点时被绘制,则设置该值。此时应该检查itemState成员,以确定控件是否具有输入焦点。
;~ ODA_SELECT
;~ 如果控件需要在选中状态改变时被绘制,则设置该值。此时应该检查itemState 成员,以确定控件是否处于选中状态。
;~ itemState
;~ 指定了当前绘制操作完成后,所绘项的可见状态。例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。其取值可以为下表中所示值的一个或者多个的联合。
;~ 取值
;~ 描述
;~ ODS_CHECKED
;~ 如果菜单项将被选中,则可设置该值。该值只对菜单项有用。
;~ ODS_COMBOBOXEDIT
;~ 在自绘组合框控件中只绘制选择区域。
;~ ODS_DEFAULT
;~ 默认值。
;~ ODS_DISABLED
;~ 如果控件将被禁止,则设置该值。
;~ ODS_FOCUS
;~ 如果控件需要输入焦点,则设置该值。
;~ ODS_GRAYED
;~ 如果控件需要被灰色显示,则设置该值。该值只在绘制菜单时使用。
;~ ODS_HOTLIGHT
;~ Windows 98/Me, Windows 2000/XP: 如果鼠标指针位于控件之上,则设置该值,这时控件会显示高亮颜色。
;~ ODS_INACTIVE
;~ Windows 98/Me, Windows 2000/XP: 表示没有激活的菜单项。
;~ ODS_NOACCEL
;~ Windows 2000/XP: 控件是否有快速键盘。
;~ ODS_NOFOCUSRECT
;~ Windows 2000/XP: 不绘制捕获焦点的效果。
;~ ODS_SELECTED
;~ 选中的菜单项。
;~ hwndItem
;~ 指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。
;~ hDC
;~ 指定了绘制操作所使用的设备环境。
;~ rcItem
;~ 指定了将被绘制的矩形区域。这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。也就是说 rcItem中的坐标点(0,0)指的就是控件的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。
;~ itemData
;~ 对于菜单项,该成员的取值可以是由
;~ CMenu::AppendMenu、
;~ CMenu::InsertMenu或者
;~ CMenu::ModifyMenu
;~ 等函数传递给菜单的值。
;~ 对于列表框或这组合框,该成员的值可以为由
;~ ComboBox::AddString、
;~ CComboBox::InsertString、
;~ CListBox::AddString或者
;~ CListBox::InsertString
;~ 等传递给控件的值。
;~ 如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC, itemData的取值为0。
Global Const $ODT_LISTVIEW = 102
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODA_SELECT = 0x2
Global Const $ODA_FOCUS = 0x4
Global Const $ODS_SELECTED = 0x0001
$hGUI = GUICreate("Test GUI", 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 10, 10, 280, 180, BitOR($LVS_REPORT, $LVS_OWNERDRAWFIXED))
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_FULLROWSELECT)
For $i = 1 To 10
_GUICtrlListView_AddItem($hListView, "Item " & $i)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem " & $i, 1)
Next
GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
Local $tagDRAWITEMSTRUCT, $iBrushColor, $cID, $itmID, $itmAction, $itmState, $hItm, $hDC, $bSelected
$tagDRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
"hwnd hItm;hwnd hDC;int itmRect;dword itmData", $lParam)
If DllStructGetData($tagDRAWITEMSTRUCT, "cType") <> $ODT_LISTVIEW Then Return $GUI_RUNDEFMSG;控件类型
$cID = DllStructGetData($tagDRAWITEMSTRUCT, "cID");控件ID
$itmID = DllStructGetData($tagDRAWITEMSTRUCT, "itmID");菜单项、列表框或组合框中某一项的索引值
$itmAction = DllStructGetData($tagDRAWITEMSTRUCT, "itmAction");控件行为
$itmState = DllStructGetData($tagDRAWITEMSTRUCT, "itmState");控件状态
$hItm = DllStructGetData($tagDRAWITEMSTRUCT, "hItm");父窗口句柄或菜单句柄
$hDC = DllStructGetData($tagDRAWITEMSTRUCT, "hDC");控件对应的绘图设备句柄
$bSelected = BitAND($itmState, $ODS_SELECTED)
Switch $itmAction;判断动作
Case $ODA_DRAWENTIRE
If $itmState = $bSelected Then
$iBrushColor = 0xFFFFFF
Else
$iBrushColor = 0x00FFFF
EndIf
Local $aBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
Local $aBrushOld = _WinAPI_SelectObject($hDC, $aBrush)
Local $iLeft = DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 1)
DllStructSetData($tagDRAWITEMSTRUCT, "itmRect", $iLeft + 5, 1)
_WinAPI_FillRect($hDC, DllStructGetPtr($tagDRAWITEMSTRUCT, "itmRect"), $aBrush)
_WinAPI_SelectObject($hDC, $aBrushOld)
_WinAPI_DeleteObject($aBrush)
Local $itmText = _GUICtrlListView_GetItemText($hListView, $itmID)
DllStructSetData($tagDRAWITEMSTRUCT, "itmRect", DllStructGetData($tagDRAWITEMSTRUCT, "itmRect", 1) + 2, 1)
DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
"ptr", DllStructGetPtr($tagDRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)
Local $iSubItmText = _GUICtrlListView_GetItemText($hListView, $itmID, 1)
Local $aSubItmRect = _GUICtrlListView_GetSubItemRect($hListView, $itmID, 1)
Local $iSubItmRect = DllStructCreate("int")
DllStructSetData($iSubItmRect, 1, $aSubItmRect, 1)
DllStructSetData($iSubItmRect, 1, $aSubItmRect, 2)
DllStructSetData($iSubItmRect, 1, $aSubItmRect, 3)
DllStructSetData($iSubItmRect, 1, $aSubItmRect, 4)
DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $iSubItmText, "int", StringLen($iSubItmText), _
"ptr", DllStructGetPtr($iSubItmRect), "int", $DT_LEFT)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
试着画了一个简单的,如图,附件中有代码。
像1#那般复杂的,用标准的SysListView32控件也可以画出来。
呵呵,都写得狠好啊 强大。太强大了。谢谢各位大侠关注。这就测试一下 代码收下.... 本帖最后由 awfymwvf 于 2011-3-18 10:13 编辑
8楼P版的例子。我怎么加不上CHECKBOX呢?$LVS_EX_CHECKBOXES这个样式不管用啊? 回复 13# awfymwvf
测试发现LVS_OWNERDRAWFIXED样式和LVS_EX_CHECKBOXES扩展样式不兼容,加上LVS_EX_CHECKBOXES之后就不能设置行高了。要靠自己画,那个CheckBox也是图标。 高手出马就是不一样 本帖最后由 awfymwvf 于 2011-3-21 09:02 编辑
P版的例子真的不错。可是要自已画CHECKBOX。这个还没有想到一个好的办法
还有就是1楼图中的圆角矩形是如何画出来的呢?
页:
[1]
2