xzf680 发表于 2017-6-13 14:59:30

[已解决]关于combo添加 GDIPlus.au3 报错求解决

本帖最后由 xzf680 于 2017-6-13 15:27 编辑

关于如下源码添加#include <GDIPlus.au3>冲突的问题该如何解决?


#include <GUIComboBox.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <WinAPIFiles.au3>
#include <GDIPlus.au3>;添加后报错,求解决。。。

Global $iColor = 0x114c93;选中颜色
Global $clrWindow = 0xffffff;底色
Global $hBrushNorm = _WinAPI_CreateSolidBrush($clrWindow)
Global $hBrushSel = _WinAPI_CreateSolidBrush(_WinAPI_SwitchColor($iColor))
Global $hPen = _WinAPI_CreatePen($PS_SOLID, 2, _WinAPI_SwitchColor($iColor))


GUIRegisterMsg($WM_MEASUREITEM, '_WM_MEASUREITEM')
GUIRegisterMsg($WM_DRAWITEM, '_WM_DRAWITEM')

$hGUI = GUICreate('Test', 220, 300)
$ComboBox = GUICtrlCreateCombo('', 10, 10, 200, 300, BitOR($WS_CHILD, $CBS_OWNERDRAWVARIABLE, $CBS_HASSTRINGS, $CBS_DROPDOWNLIST))
GUICtrlSetData($ComboBox, "实现这里背景为白色|苹果|香蕉|桔子|梨子|李子|西瓜|桔子|梨子|李子|西瓜|桔子|梨子|李子|西瓜", "实现这里背景为白色")
GUICtrlSetFont(-1, 12, 400, -1)
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_DeleteObject($hPen)
_WinAPI_DeleteObject($hBrushSel)
_WinAPI_DeleteObject($hBrushNorm)
GUIDelete()

Func _WM_MEASUREITEM($hWnd, $iMsg, $iwParam, $ilParam)
      Local $tagMEASUREITEMSTRUCT = 'uint CtlType;uint CtlID;uint itemID;uint itemWidth;uint itemHeight;ulong_ptr itemData;'
      Local $tMIS = DllStructCreate($tagMEASUREITEMSTRUCT, $ilParam)
      Local $iCtlType, $iCtlID, $iItemID, $iItemWidth, $iItemHeight
      Local $hComboBox
      Local $tSize
      Local $sText

      $iCtlType = DllStructGetData($tMIS, 'CtlType')
      $iCtlID = DllStructGetData($tMIS, 'CtlID')
      $iItemID = DllStructGetData($tMIS, 'itemID')
      $iItemWidth = DllStructGetData($tMIS, 'itemWidth')
      $iItemHeight = DllStructGetData($tMIS, 'itemHeight')
      $hComboBox = GUICtrlGetHandle($iCtlID)

      If $iCtlType = 3 Then DllStructSetData($tMIS, 'itemHeight', 30)

      Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_MEASUREITEM

Func _WM_DRAWITEM($hWnd, $iMsg, $iwParam, $ilParam)
      Local $tagDRAWITEMSTRUCT = 'uint CtlType;uint CtlID;uint itemID;uint itemAction;uint itemState;hwnd hwndItem;hwnd hDC;' & $tagRECT & ';ulong_ptr itemData;'
      Local $tDIS = DllStructCreate($tagDRAWITEMSTRUCT, $ilParam)
      Local $iCtlType, $iCtlID, $iItemID, $iItemAction, $iItemState
      Local $clrForeground, $clrBackground
      Local $hWndItem, $hDC, $hOldPen, $hOldBrush
      Local $tRect, $aRect
      Local $sText

      $iCtlType = DllStructGetData($tDIS, 'CtlType')
      $iCtlID = DllStructGetData($tDIS, 'CtlID')
      $iItemID = DllStructGetData($tDIS, 'itemID')
      $iItemAction = DllStructGetData($tDIS, 'itemAction')
      $iItemState = DllStructGetData($tDIS, 'itemState')
      $hWndItem = DllStructGetData($tDIS, 'hwndItem')
      $hDC = DllStructGetData($tDIS, 'hDC')
      $tRect = DllStructCreate($tagRECT)

      If $iCtlType = 3 Then
                Switch $iCtlID
                        Case $ComboBox
                              For $i = 1 To 4
                                        DllStructSetData($tRect, $i, DllStructGetData($tDIS, $i + 7))
                                        $aRect[$i - 1] = DllStructGetData($tRect, $i)
                              Next

                              _GUICtrlComboBox_GetLBText($hWndItem, $iItemID, $sText)

                              If BitAND($iItemState, 1) Then
                                        $hOldBrush = _WinAPI_SelectObject($hDC, $hBrushSel)
                                        $hOldPen = _WinAPI_SelectObject($hDC, $hPen)
                                        _WinAPI_Rectangle($hDC, $aRect + 1, $aRect + 1, $aRect, $aRect)
                                        _WinAPI_SelectObject($hDC, $hOldPen)
                                        _WinAPI_SelectObject($hDC, $hOldBrush)

                                        $clrBackground = _WinAPI_SetBkColor($hDC, _WinAPI_SwitchColor($iColor))
                                       
                              Else

                                        $clrBackground = _WinAPI_SetBkColor($hDC, $clrWindow)
                                        _WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrushNorm)
                              EndIf
                              DllStructSetData($tRect, "Left", $aRect + 4)
                              DllStructSetData($tRect, "Top", $aRect + 8)
                              DllStructSetData($tRect, "Bottom", $aRect - 2)

                              _WinAPI_DrawText($hDC, $sText, $tRect, BitOR($DT_LEFT, $DT_VCENTER))
                              _WinAPI_SetTextColor($hDC, $clrForeground)
                              _WinAPI_SetBkColor($hDC, $clrBackground)
                EndSwitch
      EndIf

      Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_DRAWITEM

Func _WinAPI_Rectangle($hDC, $iLeft, $iTop, $iRight, $iBottom)
      Local $aResult = DllCall("gdi32.dll", "int", "Rectangle", "hwnd", $hDC, "int", $iLeft, "int", $iTop, "int", $iRight, "int", $iBottom)

      If @error Then Return SetError(@error, @extended, 0)
      Return $aResult <> 0
EndFunc   ;==>_WinAPI_Rectangle

#include <GDIPlus.au3>;添加后报错,求解决。。。

afan 发表于 2017-6-13 15:16:06

将 82、106 行的 _WinAPI_Rectangle 重命名

xzf680 发表于 2017-6-13 15:25:43

感谢 a版 出手帮忙,解决了看起来就简单了,多谢 afan
页: [1]
查看完整版本: [已解决]关于combo添加 GDIPlus.au3 报错求解决