Что нового

[Окна, Диалоги] Прозрачный фон у checkbox

Haldar

Новичок
Сообщения
4
Репутация
0
Всем доброго времени суток. AutoIt'ом занимаюсь не так давно, поэтому периодически возникают разные вопросы. Есть такая задача. В диалоге существует обычный checkbox, у которого необходимо сделать прозрачный фон. Я соответственно применил
Код:
GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
но фон не изсчез. Я так понял, что это связано с тем, что фон у меня в виде картинки (по мануалу http://autoit-script.ru/index.php/topic,2849.0.html#post_13). Покопавшись в гугле, я нашёл не совсем эффективное решение, просто создан свою функцию для чекбокса. В моём случае это получилось так:
Код:
Func _GUICtrlCreateCheckbox($sText, $iLeft, $iTop, $iWidth, $iHeight, $iStyle = -1, $iExStyle = -1)
    Local $ID = GUICtrlCreateCheckbox($sText, $iLeft, $iTop + Round(($iHeight - 13) / 2), 13, 13, $iStyle, $iExStyle)
    If $ID = 0 Then
        Return 0
    EndIf
    GUICtrlCreateLabel($sText, $iLeft + 16, $iTop + Round(($iHeight - 13) / 2) - 0, $iWidth - 16, 14)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    Return $ID
EndFunc   ;==>_GUICtrlCreateCheckbox

И вроде бы при этом фона нет, но мне бы хотелось, чтобы чекбокс отмечался не только при нажатии на сам квадратик, но и при нажатии на текст около него. То есть при обычной функции "GUICtrlCreateCheckbox" эта возможность есть, а при создании своей - нет.

Подскажите как исправить данный момент? Или может есть способ убить фон у чекбокса без вызова своей функции.
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
657
Может это подойдет:
Код:
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <SliderConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Global Const $tagNMCUSTOMDRAW = 'hwnd hWndFrom;uint_ptr IDFrom;int Code;dword DrawStage;hwnd hDC;' & $tagRECT & ';dword_ptr ItemSpec;uint ItemState;lparam ItemlParam'
Global Const $STM_GETIMAGE = 0x0173

Global $hGui = GUICreate("Test transparent checkbox replacement", 400, 200)
GUICtrlCreatePic(StringReplace(@AutoItExe, "AutoIt3.exe", "") & "Examples\GUI\msoobe.jpg", 0, 0, 400, 200, 0)
Global $hPic = GUICtrlGetHandle(-1)


GUICtrlCreateCheckbox("Standard checkbox", 10, 10, 200, 20)

GUICtrlCreateCheckbox("Standard checkbox transparent", 10, 50, 200, 20)
GUICtrlSetBkColor(-1, -2)

GUICtrlCreateCheckbox("Standard checkbox workaround", 10, 90, 13, 13)
GUICtrlCreateLabel("Standard checkbox workaround", 26, 90, 200, 13)
GUICtrlSetBkColor(-1, -2)


Global $hCB1 = _GuiCtrlCreateTransparentCheckbox("TransparentCheckbox 1", 10, 130)
Global $hCB2 = _GuiCtrlCreateTransparentCheckbox("T8494984box 2", 10, 170)

GUIRegisterMsg(0x004E, '_WM_NOTIFY')

GUISetState()

Do
Until GUIGetMsg() = -3

Func _GuiCtrlCreateTransparentCheckbox($text, $left, $top, $width = Default, $height = 13, $style = -1, $exStyle = 0)
GUICtrlCreateCheckbox($text, $left, $top, $width, $height, $style, $exStyle)
Return GUICtrlGetHandle(-1)
EndFunc   ;==>_GuiCtrlCreateTransparentCheckbox

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR

Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
Local $hWndFrom = DllStructGetData($tNMCD, 'hWndFrom')
Local $Code = DllStructGetData($tNMCD, 'Code')
Local $DrawStage = DllStructGetData($tNMCD, 'DrawStage')
Local $ItemSpec = DllStructGetData($tNMCD, 'ItemSpec')
Local $hDC = DllStructGetData($tNMCD, 'hDC')
Local $hMemDC, $hBitmap, $hPrev
Local $aPos

Switch $hWndFrom
  Case $hCB1, $hCB2
   Switch $Code
    Case $NM_CUSTOMDRAW
     Switch $DrawStage
      Case $CDDS_PREPAINT, $CDDS_POSTPAINT
       $aPos = ControlGetPos($hWndFrom, '', '')
       Switch $DrawStage
        Case $CDDS_PREPAINT
;~          DllStructSetData($tNMCD, 'ItemState', BitXOR(DllStructGetData($tNMCD, 'ItemState'), $CDIS_FOCUS))
         $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
         $hBitmap = _SendMessage($hPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
         $hPrev = _WinAPI_SelectObject($hMemDC, $hBitmap)
         _WinAPI_BitBlt($hDC, 13, 0, $aPos[2], $aPos[3], $hMemDC, $aPos[0] + 13, $aPos[1], $SRCCOPY)
         _WinAPI_SelectObject($hMemDC, $hPrev)
         _WinAPI_DeleteDC($hMemDC)
         Return BitOR($CDRF_NOTIFYITEMDRAW, $CDRF_NOTIFYPOSTPAINT)
       EndSwitch
     EndSwitch
   EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY
 
Автор
H

Haldar

Новичок
Сообщения
4
Репутация
0
Спасибо, помогло, только теперь другая проблема. Не могу изменить цвет текста у чекбокса. Упорно выдаёт черный цвет и на GuiCtrlSetColor не реагирует.
 

Ganibal95

GreenBytes
Сообщения
876
Репутация
237
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Тест", 400, 200, -1, -1)
GUISetState()
$Check = _GUICtrlCreateCheckbox('Текст бл*ть :D', 5, 5, 100, 5)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Check[1]
			if GUICtrlRead($Check[0]) == 4 Then
				GUICtrlSetState($Check[0],$GUI_CHECKED)
			Else
				GUICtrlSetState($Check[0],$GUI_UNCHECKED)
			EndIf
	EndSwitch
WEnd

Func _GUICtrlCreateCheckbox($sText, $iLeft, $iTop, $iWidth, $iHeight, $iStyle = -1, $iExStyle = -1)
    Local $ID[2] = [GUICtrlCreateCheckbox($sText, $iLeft, $iTop + Round(($iHeight - 13) / 2), 13, 13, $iStyle, $iExStyle),GUICtrlCreateLabel($sText, $iLeft + 16, $iTop + Round(($iHeight - 13) / 2) - 0, $iWidth - 16, 14)]
    GUICtrlSetBkColor($ID[1], $GUI_BKCOLOR_TRANSPARENT)
    Return $ID
EndFunc   ;==>_GUICtrlCreateCheckbox
 
Автор
H

Haldar

Новичок
Сообщения
4
Репутация
0
Ganibal95
Спасибо, как вариант работает. Только вот у меня используется
Код:
Opt("GUIOnEventMode", 1)

Как реализовать
Код:
if GUICtrlRead($Bkpbox[0]) == 4 Then
                GUICtrlSetState($Bkpbox[0],$GUI_CHECKED)
            Else
                GUICtrlSetState($Bkpbox[0],$GUI_UNCHECKED)
            EndIf


При нём? То есть при режиме событий.
 

Ganibal95

GreenBytes
Сообщения
876
Репутация
237
Haldar
Как обычно реализовать...
Так что, не катит?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Тест", 400, 200, -1, -1)
GUISetState()
$Check = _GUICtrlCreateCheckbox('Текст бл*ть :D', 5, 5, 100, 5)
GUICtrlSetOnEvent($Check[1], "_Ctrl")
While 1
	Sleep(1)
WEnd
Func _Ctrl()
	if GUICtrlRead($Check[0]) == 4 Then
		GUICtrlSetState($Check[0],$GUI_CHECKED)
	Else
		GUICtrlSetState($Check[0],$GUI_UNCHECKED)
	EndIf
EndFunc
Func _GUICtrlCreateCheckbox($sText, $iLeft, $iTop, $iWidth, $iHeight, $iStyle = -1, $iExStyle = -1)
    Local $ID[2] = [GUICtrlCreateCheckbox($sText, $iLeft, $iTop + Round(($iHeight - 13) / 2), 13, 13, $iStyle, $iExStyle),GUICtrlCreateLabel($sText, $iLeft + 16, $iTop + Round(($iHeight - 13) / 2) - 0, $iWidth - 16, 14)]
    GUICtrlSetBkColor($ID[1], $GUI_BKCOLOR_TRANSPARENT)
    Return $ID
EndFunc   ;==>_GUICtrlCreateCheckbox
 
Автор
H

Haldar

Новичок
Сообщения
4
Репутация
0
ТЬфу, всё так просто. Не догадался я :-[

Спасибо, в принципе решено. Жаль правда на частые клики он реагирует более медленно, чем дефолтный чекбокс. Но не критично.
 
Верх