Автор: sproxy
Дата сообщения: 28.07.2008 05:51
		не могу додумать следующее: 
  
 1) как скрывать окно по клику иконки в трее - 
 если окно в данный момент было активно. 
 А если было не активно, то сделать активным 
 и отобразить. 
  
 Проблема в том, что при клике по иконке в трее, 
 фокус с окна снимется и оно, в момент клика по иконке в трее 
 и далее, НЕ активно...т.е. как проверить состояние активно/не активно 
 определенного окна по клику иконки в трее? 
  
 2) очень плохо что: Some styles cannot be changed dynamically, check MSDN documentation. $CBS_UPPERCASE combo style is one example. 
  
 А мне как раз необходимо динамически менять стиль combo: 
 стандартный, заблокированный и вид как у обычного input`а 
 (кстати, как то можно задать такой вид  у combo?) 
  
 Есть ли решение? 
  
 3) в каком режиме обработки GUI 
 вы пишите программы: MessageLoop или OnEvent ? 
 Есть ли приимущества/недостатки у них друг над другом и вообще в целом? 
  
 тест код по #1 и #2: 
  
 
Код: #Include <Constants.au3> 
 #include <GuiConstantsEx.au3> 
 #include <ComboConstants.au3> 
 #include <WindowsConstants.au3> 
 #include <TabConstants.au3> 
 #include <ListViewConstants.au3> 
  
 Global $hImageList = 0 
 Global $what_do = "" 
 TraySetClick( 8 ) 
  
 $Main_GUI = GUICreate("Tab Sample", 400, 300, -1, -1);, BitOr($GUI_SS_DEFAULT_GUI,$WS_CLIPSIBLINGS)) 
 $OK_Button = GUICtrlCreateButton("OK", 110, 270, 70, 20) 
 $Cancel_Button = GUICtrlCreateButton("Cancel", 220, 270, 70, 20) 
 GUISetState() 
  
 ; Creates the first child window that is implemented into the main GUI 
 $Child1 = GUICreate("", 370, 215, 15, 40, BitOR($WS_CHILD, $WS_TABSTOP), -1, $Main_GUI) 
  
 $child1_tab = GUICtrlCreateTab(0, 0, 370, 215) 
 $child1_tabitem1 = GUICtrlCreateTabItem("Child1Tab1") 
  
 $combo = GUICtrlCreateCombo( "item1", 10, 30, 150, $CBS_UPPERCASE  ) 
 GUICtrlSetData( -1,"item2|item3", "item3" ) 
  
 $bt_normal = GUICtrlCreateButton( "normal", 10, 55, 70, 20 ) 
 $bt_block = GUICtrlCreateButton( "block", 85, 55, 70, 20 ) 
 $bt_as_input = GUICtrlCreateButton( "as_input", 160, 55, 70, 20 ) 
  
 $child1_tabitem2 = GUICtrlCreateTabItem("Child1Tab2") 
 $child1_tabitem3 = GUICtrlCreateTabItem("Child1Tab3") 
 GUICtrlCreateTabItem("") 
  
 GUISetState() 
  
 ; Creates the second child window that is implemented into the main GUI 
 $child2 = GUICreate("", 370, 215, 15, 40, BitOR($WS_CHILD, $WS_TABSTOP), -1, $Main_GUI) 
  
 $child3 = GUICreate("", 210, 220, 158, 0, BitOR($WS_CHILD, $WS_TABSTOP), -1, $child2) 
 $ListView = GUICtrlCreateListView("Col1|Col2", 0, 2, 210, 211, _ 
     BitOR($LVS_NOSORTHEADER, $LVS_SHOWSELALWAYS, $WS_TABSTOP), $WS_EX_CLIENTEDGE) 
  
 GUICtrlCreateListViewItem("ItemLong1|ItemLong2", $ListView) 
 GUICtrlCreateListViewItem("ItemLong3|ItemLong4", $ListView) 
 GUICtrlCreateListViewItem("ItemLong5|ItemLong6", $ListView) 
 GUISetState() 
  
 GUISwitch($child2) 
 $child2_tab = GUICtrlCreateTab(0, 0, 156, 215) 
 $child2_tabitem1 = GUICtrlCreateTabItem("Child2Tab1") 
 $child2_tabitem2 = GUICtrlCreateTabItem("Child2Tab2") 
 GUICtrlCreateTabItem("") 
  
 ; Switch back the main GUI and create the tabs 
 GUISwitch($Main_GUI) 
 $main_tab = GUICtrlCreateTab(10, 10, 380, 250) 
 $main_tabitem1 = GUICtrlCreateTabItem("MainTab1") 
 $main_tabitem2 = GUICtrlCreateTabItem("MainTab2") 
 GUICtrlCreateTabItem("") 
 GUICtrlSetState($main_tabitem1, $GUI_SHOW) 
  
 Bind_ImageList($main_tab) 
  
 While 1 
     $msg = GUIGetMsg(1) 
     Select 
         Case $msg[0] = $bt_normal 
             GUICtrlSetStyle( $combo, $GUI_SS_DEFAULT_COMBO ) 
  
         Case $msg[0] = $bt_block 
             GUICtrlSetStyle( $combo, $CBS_DROPDOWNLIST ) 
  
         Case $msg[0] = $bt_as_input 
 ;~          GUICtrlSetStyle( $combo, ????? ) 
  
         Case $msg[0] = $GUI_EVENT_CLOSE Or $msg[0] = $Cancel_Button 
             ExitLoop 
  
         Case $msg[0] = $main_tab 
             $tabidx = GUICtrlRead($main_tab) 
  
             Select 
                 Case $tabidx = 0 
                     GUISetState(@SW_HIDE, $child2) 
                     GUISetState(@SW_SHOW, $Child1) 
                 Case $tabidx = 1 
                     GUISetState(@SW_HIDE, $Child1) 
                     GUISetState(@SW_SHOW, $child2) 
             EndSelect 
     EndSelect 
     $msg = TrayGetMsg() 
         If $msg = $TRAY_EVENT_PRIMARYDOWN Then win_show_hide_active() 
  
     If WinGetState( $Main_GUI ) == 15 Then 
         $what_do = "hide" 
     ElseIf WinGetState( $Main_GUI ) == 5 Then 
         $what_do = "show" 
     Else 
         $what_do = "active" 
     EndIf 
  
     ToolTip( "State: " & WinGetState( $Main_GUI ) & " Active: " & WinActive( $Main_GUI ), 0, 60 ) 
 WEnd 
  
 Func win_show_hide_active() 
     If $what_do = "hide" Then 
         GUISetState( @SW_HIDE, $Main_GUI ) 
     ElseIf $what_do = "show" Then 
         GUISetState( @SW_SHOW, $Main_GUI ) 
     Else 
         GUISetState( @SW_RESTORE, $Main_GUI ) 
     EndIf 
  
 EndFunc 
  
 DllCall("comctl32.dll", "int", "ImageList_Destroy", "hwnd", $hImageList) 
  
 Func ImageList_Create() 
     $hImageList = DllCall("comctl32.dll", "hwnd", "ImageList_Create", "int", 16, "int", 16, "int", 0x0021, "int", 0, "int", 1) 
     $hImageList = $hImageList[0] 
     Return $hImageList 
 EndFunc   ;==>ImageList_Create 
  
 Func Bind_ImageList($nCtrl) 
     $hImageList = ImageList_Create() 
     GUICtrlSendMsg($nCtrl, $TCM_SETIMAGELIST, 0, $hImageList) 
  
     $szIconFile = "shell32.dll" 
  
     $tcitem = DllStructCreate("uint;dword;dword;ptr;int;int;int") 
     DllStructSetData($tcitem, 1, 0x0002) 
     DllStructSetData($tcitem, 6, 0) 
     AddImageToTab($nCtrl, 0, $tcitem, $szIconFile, 12) 
  
     DllStructSetData($tcitem, 6, 1) 
     AddImageToTab($nCtrl, 1, $tcitem, $szIconFile, 21) 
  
     $tcitem = 0 
 EndFunc   ;==>Bind_ImageList 
  
 Func AddImageToTab($nCtrl, $nTabIndex, $nItem, $szIconFile, $nIconID) 
     $hIcon = DllStructCreate("int") 
     $result = DllCall("shell32.dll", "int", "ExtractIconEx", "str", $szIconFile, "int", $nIconID, "hwnd", 0, "ptr", DllStructGetPtr($hIcon), "int", 1) 
     $result = $result[0] 
     If $result > 0 Then 
         DllCall("comctl32.dll", "int", "ImageList_AddIcon", "hwnd", $hImageList, "hwnd", DllStructGetData($hIcon, 1)) 
         DllCall("user32.dll", "int", "SendMessage", "hwnd", ControlGetHandle($Main_GUI, "", $nCtrl), "int", $TCM_SETITEM, "int", $nTabIndex, "ptr", DllStructGetPtr($nItem)) 
         DllCall("user32.dll", "int", "DestroyIcon", "hwnd", $hIcon) 
     EndIf 
  
     $hIcon = 0 
 EndFunc   ;==>AddImageToTab