Что нового

Контакт-лист для чата в стиле Skype

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Скриншот:


Код:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>

Opt('GUIDataSeparatorChar', '|')

Global Const $ODT_LISTVIEW   = 102
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_SELECTED   = 0x0001

$hForm = GUICreate('Contact list', 330, 430)
GUIRegisterMsg($WM_MEASUREITEM, 'WndProc')
GUIRegisterMsg($WM_DRAWITEM, 'WndProc')
$iList = GUICtrlCreateListView('', 0, 0, 330, 430, BitOR($LVS_NOCOLUMNHEADER, $LVS_OWNERDRAWFIXED, $LVS_SHOWSELALWAYS, $LVS_AUTOARRANGE, $LVS_SINGLESEL))
$hList = GUICtrlGetHandle($iList)
_GUICtrlListView_SetExtendedListViewStyle($hList, $LVS_EX_DOUBLEBUFFER)
_GUICtrlListView_AddColumn($hList, '', 305)

For $i = 0 To 10
   _GUICtrlListView_SetItemParam($hList, _GUICtrlListView_AddItem($hList, 'Иванов Иван Иванович|2x2=5'), Random(0, 1, 1))
   _GUICtrlListView_SetItemParam($hList, _GUICtrlListView_AddItem($hList, 'Mauris|Tel. +7 (961) 483-01-34'), Random(0, 1, 1))
   _GUICtrlListView_SetItemParam($hList, _GUICtrlListView_AddItem($hList, 'Voland|Fantaisie Software'), Random(0, 1, 1))
Next

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Func WndProc($hWnd, $iMsg, $wParam, $lParam)
	Local $iTxtCol, $iTexSta, $hImage
	Switch $hWnd
		Case $hForm
			Switch $iMsg
				Case $WM_MEASUREITEM
					Local $tMEASUREITEMS = DllStructCreate('uint cType;uint cID;uint itmID;uint itmW;uint itmH;ulong_ptr itmData', $lParam)
					If DllStructGetData($tMEASUREITEMS, 'cType') <> $ODT_LISTVIEW Then
					    Return 0
					EndIf
					DllStructSetData($tMEASUREITEMS, 'itmH', 40)
				Case $WM_DRAWITEM
                    Local $tDRAWITEMSTRUCT = DllStructCreate('uint cType;uint cID;uint itmID;uint itmAction;uint itmState;hwnd hItm;handle hDC;long itmRect[4];ulong_ptr itmData', $lParam)
                    If (DllStructGetData($tDRAWITEMSTRUCT, 'cType') <> $ODT_LISTVIEW) Then
	                    Return 0
	                EndIf
                    Local $cID = DllStructGetData($tDRAWITEMSTRUCT, "cID")
                    Local $itmID = DllStructGetData($tDRAWITEMSTRUCT, "itmID")
                    Local $itmAction = DllStructGetData($tDRAWITEMSTRUCT, "itmAction")
                    Local $itmState = DllStructGetData($tDRAWITEMSTRUCT, "itmState")
                    Local $hItm = DllStructGetData($tDRAWITEMSTRUCT, "hItm")
                    Local $hDC = DllStructGetData($tDRAWITEMSTRUCT, "hDC")
                    Switch $cID
						Case $iList
							Switch $itmAction
								Case $ODA_DRAWENTIRE
									If (Not BitAND($itmState, $ODS_SELECTED)) Then
                                        $iTxtCol = 0x000000 ;~ Цвет верхнего текста, если пункт не выбран
		                                $iTexSta = 0x848484 ;~ Цвет нижнего текста, если пункт не выбран
									Else
                                        $iTxtCol = 0xFEFEFE ;~ Цвет верхнего текста, если пункт выбран
		                                $iTexSta = 0xFEFEFE ;~ Цвет нижнего текста, если пункт выбран

                                        $hBrush = _WinAPI_CreateSolidBrush(0xFFCB93)
										_WinAPI_FillRect($hDC, DllStructGetPtr($tDRAWITEMSTRUCT, 'itmRect'), $hBrush)
		                                _WinAPI_DeleteObject($hBrush)
                                    EndIf
									Local $tRECT = DllStructCreate($tagRECT)
									Local $tTEXT = DllStructCreate('wchar[4096]')
                                    Local $tLVITEM = DllStructCreate($tagLVITEM)
                                    DllStructSetData($tLVITEM, 'TextMax', DllStructGetSize($tTEXT))
                                    DllStructSetData($tLVITEM, 'SubItem', 0)
                                    DllStructSetData($tLVITEM, 'Text', DllStructGetPtr($tTEXT))
                                    GUICtrlSendMsg($cID, $LVM_GETITEMTEXTW, $itmID, DllStructGetPtr($tLVITEM))
									Local $aItemText = StringSplit(DllStructGetData($tTEXT, 1), '|', 2)
									DllStructSetData($tRECT, 'Left', $LVIR_BOUNDS)
									DllStructSetData($tRECT, 'Top', 0)
                                    GUICtrlSendMsg($cID, $LVM_GETSUBITEMRECT, $itmID, DllStructGetPtr($tRECT))
									Local $iLeft = DllStructGetData($tRECT, 'Left')
									Local $iTop  = DllStructGetData($tRECT, 'Top')
									Switch $hItm
										Case $hList
											;~ Рисуем аватарку
											_WinAPI_DrawBitmap($hDC, 4, $iTop + 4, _WinAPI_LoadImage(0, '1.bmp', 0, 0, 0, $LR_LOADFROMFILE))

											;~ Рисуем статус
											If _GUICtrlListView_GetItemParam($hList, $itmID) Then
				                                $hImage = _WinAPI_LoadImage(0, '2.ico', 1, 0, 0, $LR_LOADFROMFILE)
			                                Else
				                                $hImage = _WinAPI_LoadImage(0, '3.ico', 1, 0, 0, $LR_LOADFROMFILE)
			                                EndIf
			                                _WinAPI_DrawIconEx($hDC, 46, $iTop + 5, $hImage, 16, 16)
                                            _WinAPI_DeleteObject($hImage)

                                            ;~ Верхний текст
                                            _WinAPI_SetTextColor($hDC, $iTxtCol)
                                            DllStructSetData($tRECT, 1, 74)
                                            DllStructSetData($tRECT, 2, $iTop + 5)
                                            _WinAPI_DrawText($hDC, $aItemText[0], $tRECT, BitOR($DT_LEFT, $DT_WORDBREAK, $DT_SINGLELINE))

											;~ Нижний текст
                                            _WinAPI_SetTextColor($hDC, $iTexSta)
                                            DllStructSetData($tRECT, 1, 74)
											DllStructSetData($tRECT, 2, $iTop + 21)
                                            _WinAPI_DrawText($hDC, $aItemText[1], $tRECT, BitOR($DT_LEFT, $DT_WORDBREAK, $DT_SINGLELINE))
									EndSwitch
							EndSwitch
                    EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

Архив:
Contact List
 
Верх