Ich schreibe zurzeit an einem IRC Client.
Nun habe ich folgendes Problem.
Ich lasse Tabs für einmal Status und jewalls für jeden Channel erstellen
Da ich leider die Controlls nicht direkt auf die tabs verweisen kann muss ich sie ausblenden wenn sie nicht gebraucht werden.
Leider werden die Controlls nicht sauber ausgeblendet
Sie verschwinden er in den Hintergrund bzw das fenster müsste komplett neu gezeichnet werden.
Lange rede kurzer Sinn ich häng einfach mal ein wenig beispiel code ran wo man das gut sehen kann.
AutoIt Code
#include <Array.au3>
#include <StructureConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListBox.au3>
#include <GuiRichEdit.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <GuiTab.au3>
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: Gummibaer
Script Function:
IRC Client.
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
AutoItSetOption ( "GUICloseOnESC",0)
AutoItSetOption ( "TrayMenuMode",1)
AutoItSetOption ( "TrayIconDebug",0)
AutoItSetOption ( "TrayAutoPause",0)
Global $IRCserver = "xxxxxxxxxxxx"
Global $IRCchannel = '#yyyyy'
Global $IRCident = "hhh"
Global $IRCident = "test"
Global $IRCnick = IniRead ( "chat.ini", "User", "nick", "<Dein Nickname>" )
Global $IRCport = 6667
Global $IRCFullName, $IRCanick, $ChannelFenster
Global Const $SW_HIDE = 0
Global Const $SW_SHOW = 5
Global $Channels[1][6], $Servers[1][7]
$Channels[0][0] = 0
$Servers[0][0] = 0
_AddChannel(_AddServer($Servers, $IRCserver, $IRCport, $IRCnick,$IRCident),$Channels,$IRCchannel)
[/autoit] [autoit][/autoit] [autoit]_GUICtrlRichEdit_AppendTextUTF8(_gethwndforchannel(1,$IRCchannel),"[JOIN] du hast "&$IRCchannel&" betreten!")
_GUICtrlRichEdit_AppendTextUTF8(_gethwndforchannel(1,$IRCchannel),"14[048*Nemesis14] Zitat: Wenn ich die Folgen geahnt hätte, wäre ich Uhrmacher geworden.Albert Einstein")
_GUICtrlRichEdit_AppendTextUTF8(_gethwndforchannel(1,$IRCchannel),"10» Cassiopeia setzt mode: +l 11")
_GUICtrlRichEdit_AppendTextUTF8($Servers[1][5],"Bissel Text im Status Fenster")
_GUICtrlRichEdit_AppendTextUTF8($Servers[1][5],"und noch mehr")
_GUICtrlRichEdit_AppendTextUTF8($Servers[1][5],"usw")
_GUICtrlRichEdit_AppendTextUTF8($Servers[1][5],"....")
$Nicklist = _gethwndforchannel(1,$IRCchannel,"nicklist")
_GUICtrlListBox_AddString($Nicklist,"hanspeter")
_GUICtrlListBox_AddString($Nicklist,"Josef")
_GUICtrlListBox_AddString($Nicklist,"Cassiopeia")
_GUICtrlTab_SetCurFocus(GUICtrlGetHandle($Servers[1][3]), 1)
;Hauptschleife
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
Local $tNMHDR, $IDFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$IDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Local $tempindex = _ArraySearch($Servers, $hWnd, 0, 0, 0, 1, 1, 2)
If $tempindex == -1 then Return
;~ ConsoleWrite("$iCode "&$iCode & @CRLF)
;~ ConsoleWrite("$IDFrom "&$IDFrom & @CRLF)
;~ ConsoleWrite("$Servers[$tempindex][3] "&$Servers[$tempindex][3] & @CRLF)
Switch $IDFrom
Case $Servers[$tempindex][3]
;~ ConsoleWrite("$iCode "&$iCode & @CRLF)
Switch $iCode
Case $TCN_SELCHANGE
$iCurSel = _GUICtrlTab_GetCurSel(GUICtrlGetHandle($Servers[$tempindex][3]))
Local $tindex = _ArraySearch($Channels, $iCurSel, 0, 0, 0, 1, 1, 2)
if $iCurSel <> 0 Then ; wenn nicht status
ConsoleWrite("Verstecke Status "& @CRLF)
;~ GUICtrlSetState($Servers[$tempindex][4],$GUI_HIDE)
;~ GUICtrlSetState($Servers[$tempindex][5],$GUI_HIDE)
ConsoleWrite("$Servers[$tempindex][4] $SW_HIDE " & $Servers[$tempindex][4] & @CRLF)
ConsoleWrite("$Servers[$tempindex][5] $SW_HIDE " & $Servers[$tempindex][5] & @CRLF)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Servers[$tempindex][4], "int", $SW_HIDE)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Servers[$tempindex][5], "int", $SW_HIDE)
EndIf
For $i = 1 to $Channels[0][0]
if $tindex <> $i Then
ConsoleWrite("Verstecke Channel "& $Channels[$i][0]& @CRLF)
GUICtrlSetState($Channels[$i][3],$GUI_HIDE)
;~ GUICtrlSetState($Channels[$i][4],$GUI_HIDE)
;~ GUICtrlSetState($Channels[$i][5],$GUI_HIDE)
ConsoleWrite("$Channels[$i][3] $SW_HIDE " & $Channels[$i][3] & @CRLF)
ConsoleWrite("$Channels[$i][4] $SW_HIDE " & $Channels[$i][4] & @CRLF)
ConsoleWrite("$Channels[$i][5] $SW_HIDE " & $Channels[$i][5] & @CRLF)
;~ DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][3], "int", $SW_HIDE)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][4], "int", $SW_HIDE)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][5], "int", $SW_HIDE)
Else
ConsoleWrite("Zeige Channel "& $Channels[$i][0]& @CRLF)
ConsoleWrite("$Channels[$i][3] $SW_SHOW " & $Channels[$i][3] & @CRLF)
ConsoleWrite("$Channels[$i][4] $SW_SHOW " & $Channels[$i][4] & @CRLF)
ConsoleWrite("$Channels[$i][5] $SW_SHOW " & $Channels[$i][5] & @CRLF)
;~ DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][3], "int", $SW_SHOW)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][4], "int", $SW_SHOW)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Channels[$i][5], "int", $SW_SHOW)
GUICtrlSetState($Channels[$i][3],$GUI_SHOW)
;~ GUICtrlSetState($Channels[$i][4],$GUI_SHOW)
;~ GUICtrlSetState($Channels[$i][5],$GUI_SHOW)
EndIf
Next
if $iCurSel == 0 Then
ConsoleWrite("Zeige Status "& @CRLF)
ConsoleWrite("$Servers[$tempindex][4] $SW_SHOW " & $Servers[$tempindex][4] & @CRLF)
ConsoleWrite("$Servers[$tempindex][5] $SW_SHOW " & $Servers[$tempindex][5] & @CRLF)
;~ GUICtrlSetState($Servers[$tempindex][4],$GUI_SHOW)
;~ GUICtrlSetState($Servers[$tempindex][5],$GUI_SHOW)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Servers[$tempindex][4], "int", $SW_SHOW)
DllCall("User32.dll", "int", "ShowWindow", "hwnd", $Servers[$tempindex][5], "int", $SW_SHOW)
EndIf
;~ _ArrayDisplay($Channels)
;~ _ArrayDisplay($Servers)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func _gethwndforchannel($servernum,$chan,$target = "")
Local $c = _GUICtrlTab_GetItemCount($Servers[$servernum][3])
For $i = 0 To $c-1
$channel = _GUICtrlTab_GetItemText($Servers[$servernum][3], $i)
If $chan == $channel Then
Local $tindex = _ArraySearch($Channels, $i, 0, 0, 0, 1, 1, 2)
If $target == "" or $target == "main" then return $Channels[$tindex][4]
If $target == "nicklist" then return $Channels[$tindex][3]
If $target == "input" then return $Channels[$tindex][5]
EndIf
Next
EndFunc
Func _AddChannel($servernum,ByRef $avArray,$vValue)
If Not IsArray($avArray) Then Return SetError(1, 0, -1)
Local $iUBound = UBound($avArray)
ReDim $avArray[$iUBound + 1][6]
;~ ConsoleWrite("$servernum "&$servernum & @CRLF)
;~ _ArrayDisplay($Servers)
$Servers[$servernum][6] = $Servers[$servernum][6] + 1
_InsertTab($Servers[$servernum][3], $Servers[$servernum][6], $vValue)
ConsoleWrite($Servers[$servernum][3] & @CRLF)
Local $Status = _GUICtrlRichEdit_Create($Servers[$servernum][2], "", 16, 34, 785, 569, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL,$ES_READONLY ))
Local $Input = GUICtrlCreateInput("", 16, 610, 945, 21)
Local $Nicklist = GUICtrlCreateList("", 808, 34, 153, 565)
$avArray[$iUBound][0] = $vValue
$avArray[$iUBound][1] = "UserListe userxy bernd peter"
$avArray[$iUBound][2] = $Servers[$servernum][6]
$avArray[$iUBound][3] = GUICtrlGetHandle($Nicklist)
$avArray[$iUBound][4] = $Status
$avArray[$iUBound][5] = GUICtrlGetHandle($Input)
$avArray[0][0] = $iUBound
Return $iUBound
EndFunc
Func _AddServer(ByRef $avArray,$IRCserver, $IRCport, $IRCnick,$IRCident)
If Not IsArray($avArray) Then Return SetError(1, 0, -1)
Local $iUBound = UBound($avArray)
ReDim $avArray[$iUBound + 1][7]
;~ $sock = _IRCConnect($IRCserver, $IRCport, $IRCnick,$IRCident); Verbindung zu IRC und Identifizierung Nickname
$sock = Random(1,10000)
$Form = GUICreate($IRCserver, 985, 644, 192, 124)
;~ $Nicklist = GUICtrlCreateList("", 808, 16, 153, 565)
Global $Input = GUICtrlCreateInput("", 16, 592, 945, 21)
$hTab = GUICtrlCreateTab(8, 8, 969, 633)
_InsertTab($hTab, 0, "Status "&$IRCserver)
_GUICtrlTab_SetCurFocus($hTab, -1) ; Auswahl aufheben
_GUICtrlTab_SetCurFocus($hTab, 0) ; 1 Tab wählen
$Status = _GUICtrlRichEdit_Create($Form, "", 16, 34, 945, 569, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL,$ES_READONLY ))
$Input = GUICtrlCreateInput("", 16, 610, 945, 21)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)
$avArray[$iUBound][0] = $sock
$avArray[$iUBound][1] = $IRCserver
$avArray[$iUBound][2] = $Form
$avArray[$iUBound][3] = $hTab
$avArray[$iUBound][4] = GUICtrlGetHandle($Input)
$avArray[$iUBound][5] = $Status
$avArray[$iUBound][6] = 0
$avArray[0][0] = $iUBound
Return $iUBound
EndFunc
Func _InsertTab(ByRef $hTabParent, $iIndex, $sName)
_GUICtrlTab_InsertItem($hTabParent, $iIndex, $sName)
EndFunc ;==>_InsertTab
Func _GUICtrlRichEdit_AppendTextUTF8($hWnd, $sText)
return _GUICtrlRichEdit_AppendText($hWnd,_ParseColors($sText))
EndFunc
Func _ParseColors($string)
Local $RichEdit = "{\rtf1\utf8\deff0{\colortbl;\red0\green0\blue0;\red0\green0\blue127;\red0\green147\blue0;\red255\green0\blue0;\red127\green0\blue0;\red156\green0\blue156;\red252\green127\blue0;\red255\green255\blue0;\red0\green252\blue0;\red0\green147\blue147;\red0\green255\blue255;\red0\green0\blue252;\red255\green0\blue255;\red127\green127\blue127;\red210\green210\blue210;}"
$Testx = StringRegExpReplace($string, Chr(3)& '([0-9]{1,2}),([0-9]{1,2})', "\\highlight$2\\cf$1")
$Testx = StringRegExpReplace($Testx, Chr(3)& '([0-9]{1,2})', "\\cf$1\\highlight0")
$Testx = StringRegExpReplace($Testx, '(.+?)', "{\\b $1}")
$Testx = StringRegExpReplace($Testx, '(.+?)', "{\\i $1}")
$Testx = StringRegExpReplace($Testx, "", "\\cf0\\highlight0\\i0\\b0 ")
$Testx = StringReplace($Testx, "", "")
$Testx = StringReplace($Testx, "", "")
$RichEdit &= _NowTime()&" "&$Testx
$RichEdit &= "\line}"
return $RichEdit
EndFunc
Bilder
Wenn ich nicht gleich auf Tabindex 1 wechsel, sieht man wie die Nickliste noch überschneidet
und der Text vom eigentlichen Channelfenster darin auftaucht.
[Blockierte Grafik: http://img688.imageshack.us/img688/1230/screenshotox.jpg]
[Blockierte Grafik: http://img64.imageshack.us/img64/6552/screenshotpi.jpg]
[Blockierte Grafik: http://img339.imageshack.us/img339/1156/screenshottwf.jpg]
Wenn man nun vom Tab 1 zb auf Tab 0 wechselt bleibt die Nickliste weiterhin sichtbar und auch die Editbox
Wie man dem Code entnehmen kann habe ich schon
GUICtrlSetState und ein DLLCall versucht um das Problem in den griff zu kriegen.
hat noch wer eine Idee ?