Диалог настройки панели инструментов (Как вызвать правильно?)

Тема в разделе "WASM.BEGINNERS", создана пользователем God_Father, 2 ноя 2007.

  1. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Для того, чтобы добавалять (убирать) кнопки в некоторые тоолбары (ребары) встроен этот диалог.
    При двойном клике на области тоолбара в моей проге он появляется и тотчас же исчезает.
    Как сделать так чтоб он нормально работал?
    Кто-нибудь может помочь?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    God_Father
    Ты не показал свой код, поэтому трудно судить об используемом языке и возможных причинах исчезновения диалога. Предположу наиболее часто встречающуюся ошибку: в оконной процедуре отсутствует обработчик
    Код (Text):
    1. ...
    2. case WM_NOTIFY:
    3.   if ((TBN_QUERYINSERT == ((LPNMHDR)lParam)->code) ||
    4.       (TBN_QUERYDELETE == ((LPNMHDR)lParam)->code))
    5.     return 1;
    6. ...
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не оно?

    Попробуй для проверки послать программно сообщение TB_CUSTOMIZE.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent
    Обрати внимание на "он появляется и тотчас же исчезает", imho и стиль есть и сообщение посылаетс/приходит.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    q_q
    Обратил, поэтому и в сомнениях. Может, с манифестом/инициализацией контролов проблемы..
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent
    Может, с манифестом/инициализацией контролов проблемы..
    Imho все проще.

    Пока нет автора, попробуй пример из аттача. Если просто собрать, то двойной щелчок по toollbar'у не возымеет ни какой реакции, если убрать комментарий с CCS_ADJUSTABLE, то двойной щелчок по toollbar'у приведет к "он появляется и тотчас же исчезает", если убрать комментарий с case WM_NOTIFY: ... break;, то можно увидеть "Диалог настройки панели инструментов" и порулить им.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    q_q
    Да, действительно.
     
  8. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Я разобрался там действительно стиль правильно, но не знаю как с обычного толбара это на док ребар перекинуть
    я погуглил и нашел на обычном толбаре пример
    появления этого окна думаю будет интересно ознакомиться
    я совместил 2 програмыы но он не хочет после удаления в этом диалоге востанавливать кнопки на тоолбаре
    Может кто-нибудь сумеет сделать что в ребаре все работало
    Даю примеры
     
  9. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    и собственно пример с диалогом настройки панели инструментов
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    God_Father
    Может кто-нибудь сумеет сделать что в ребаре все работало
    Вместо тебя? Ты даже не удосужился проверить #2, т.е. тривиально добавив
    Код (Text):
    1. ...
    2. assume edi: PTR NMHDR
    3.         mov eax, [edi].hwndFrom
    4. .if [edi].code == TBN_QUERYINSERT
    5.   mov eax, 1
    6.   ret
    7. .endif
    8. .if [edi].code == TBN_QUERYDELETE
    9.   mov eax, 1
    10.   ret
    11. .endif
    12.         .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG)
    13. assume edi: PTR NMREBAR
    14. ...
    и диалог перестанет пропадать.

    hint обработчик WM_NOTIFY из DockRebar.asm.MainWindow_WndProc занимается только rebar'ом, а обработчик WM_NOTIFY из toolbar.asm.WndProc занимается tooltip'ами (.if edx == TTN_NEEDTEXT) и диалогом настройки toolbar'а (начиная с .if eax == hToolBar).
     
  11. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Ну и что это я и сам смог я думал что вы что-нибудь эдак покруче придумаете.
    Да диалог бесспорно вызывается
    НО ПОПРОБУЙТЕ МЕТАМИ КНОПКИ В ЭТОМ ТОЛБАРЕ ПОМЕНЯТЬ или запихнуть кнопку в Listbox "Имеющиеся кнопки"а потом назад
    в Listbox "Панель инструментов"
    кнопка не хочет переходить
    видно ей и там не плохо :) .
    Вы можете объяснить как правильно построить обработчик
    чтобы кнопки туда-сюда можно было тягать?
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    God_Father
    Вы можете объяснить как правильно построить обработчик
    У тебя есть код с rebar'ом на котором лежат _два_ toolbar'а.
    Есть код, который демонстрирующий работу _одного_ toolbar'а с диалогом настройки.
    Задача переписать второй код так, чтобы toolbar и его данные были переменными.

    ps
    я думал что вы что-нибудь эдак покруче придумаете
    Так не пойдет. Ты до сих пор не показал ни строчки _своего_ кода.
     
  13. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    НУ ты прям как бот покажи да покажи
    !НА!
    Код (Text):
    1. .ELSEIF wMsg == WM_NOTIFY
    2.         mov edi, lParam
    3.         push edi
    4.         push eax
    5.         mov edi, lParam
    6. assume edi: PTR NMHDR
    7.         mov eax, [edi].hwndFrom
    8.         .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG)
    9. assume edi: PTR NMREBAR
    10.             mov rbi.cbSize, sizeof REBARBANDINFO
    11.             mov rbi.fMask, RBBIM_CHILD
    12.             m2m BandDraggingRebarBand, [edi].uBand
    13.             invoke SendMessage, hWnd_Rebar, RB_GETBANDINFO, [edi].uBand, addr rbi
    14.             m2m hWndDraggingRebarBand, rbi.hwndChild
    15. assume edi: PTR NMHDR
    16.         .ELSEIF (eax == hWnd_Rebar) && ([edi].code == RBN_HEIGHTCHANGE)
    17.             invoke GetClientRect    ,hWnd, addr r
    18.             invoke InvalidateRect   ,hWnd, addr r, TRUE
    19.    
    20.         .ENDIF
    21.  
    22. assume edi: NOTHING
    23.    
    24.         pop eax
    25.         pop edi
    26.         mov ebx, edi
    27.         mov     eax, (NMHDR ptr [ebx]).code
    28.         .if eax == TTN_NEEDTEXT
    29.             mov eax,(NMHDR ptr [ebx]).idFrom
    30.             mov (TOOLTIPTEXT ptr [ebx]).lpszText,eax
    31.             mov  eax,hInstance
    32.             mov     [TOOLTIPTEXT ptr [ebx]].hinst,eax
    33.         .endif
    34.         .if eax == EN_MSGFILTER
    35.         .endif
    36.         .if eax == TTN_NEEDTEXT
    37.         .endif
    38.         .if eax == TBN_QUERYDELETE
    39.         return TRUE ;возможность удаления ч-л из тоолбара
    40.         .endif
    41.         .if eax == TBN_GETBUTTONINFO
    42.         return FALSE
    43.         .endif
    44.         .if eax == TBN_QUERYINSERT
    45.         return TRUE ;возможность вставки ч-л в толбар
    46.         .endif
    47.         .if eax == TBN_GETBUTTONINFO
    48.                     ;TBNOTIFY = NMTOOLBAR
    49.                 mov eax,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N
    50.                 .if eax > NombreBoutons -1
    51.                     return FALSE                ;seul la doc peut dire comment
    52.                 .endif                      ;effectuer le retour
    53.                 lea esi,szRebar_Class
    54.                 mov ecx,sizeof TBBUTTON
    55.                 xor edx,edx
    56.                 mul ecx
    57.                 add esi,eax             ;esi pointe sur la definition du bouton n
    58.                 mov eax,(TBBUTTON ptr [esi]).iBitmap
    59.                 mov (TBNOTIFY ptr [ebx]).tbButton.iBitmap,eax
    60.                 mov eax,(TBBUTTON ptr [esi]).idCommand
    61.                 mov (TBNOTIFY ptr [ebx]).tbButton.idCommand,eax
    62.                 mov al,(TBBUTTON ptr [esi]).fsState
    63.                 mov (TBNOTIFY ptr [ebx]).tbButton.fsState,al
    64.                 mov al,(TBBUTTON ptr [esi]).fsStyle
    65.                 mov (TBNOTIFY ptr [ebx]).tbButton.fsStyle,al
    66.                 mov eax,(TBBUTTON ptr [esi]).dwData
    67.                 mov (TBNOTIFY ptr [ebx]).tbButton.dwData,eax
    68.                 mov eax,(TBBUTTON ptr [esi]).iString
    69.                 mov (TBNOTIFY ptr [ebx]).tbButton.iString,eax
    70.                 ;le tampon de la toolbar est rempli des infos du bouton
    71.                 ; maintenant le tooltip
    72.                 mov edx,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N
    73.                         ;le message porte le meme numero que le bouton
    74.                 invoke    LoadString,hInstance, edx,(TBNOTIFY ptr [ebx]).pszText,20h
    75.                 mov (TBNOTIFY ptr [ebx]).cchText,eax
    76.                 return TRUE
    77.         .endif
    78.         .if eax == TBN_BEGINADJUST
    79.                
    80.                 mov CLEappli.pszValueName,offset KeyTemp
    81.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli
    82.         .endif
    83.         .if eax == TBN_RESET
    84.                 mov CLEappli.pszValueName,offset KeyTemp
    85.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,0,addr CLEappli
    86.         .endif
    87.         .if eax == TBN_TOOLBARCHANGE
    88.                 ;fixe la taille des boutons a 20*20
    89.                 invoke SendMessage,hWnd_Rebar,TB_SETBUTTONSIZE,0,00140014h
    90.         .endif
    91.         .if eax == TBN_CUSTHELP
    92.                 ;la sauvegarde de la configuration des boutons
    93.                 InsTxt   ToolTitle,"organisation des boutons"
    94.                 InsTxt   ToolText,"sauvegarder la configuration"
    95.                 invoke MessageBox,NULL,ADDR ToolText,ADDR ToolTitle,MB_YESNO
    96.                 cmp eax,IDNO   
    97.                 jz Passesave
    98.                 mov CLEappli.pszValueName,offset Keydure
    99.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli                   
    100.                 Passesave:
    101.         .endif
    102. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    God_Father
    В этом куске два раза присутствует .if eax == TBN_GETBUTTONINFO.

    ps.
    !НА!
    Грубишь? Я пас.
     
  15. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Спасибо дарагой выручил
    Код (Text):
    1. .ELSEIF wMsg == WM_NOTIFY
    2.         mov edi, lParam
    3.         push edi
    4.         push eax
    5.         mov edi, lParam
    6. assume edi: PTR NMHDR
    7.         mov eax, [edi].hwndFrom
    8.         .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG)
    9. assume edi: PTR NMREBAR
    10.             mov rbi.cbSize, sizeof REBARBANDINFO
    11.             mov rbi.fMask, RBBIM_CHILD
    12.             m2m BandDraggingRebarBand, [edi].uBand
    13.             invoke SendMessage, hWnd_Rebar, RB_GETBANDINFO, [edi].uBand, addr rbi
    14.             m2m hWndDraggingRebarBand, rbi.hwndChild
    15. assume edi: PTR NMHDR
    16.         .ELSEIF (eax == hWnd_Rebar) && ([edi].code == RBN_HEIGHTCHANGE)
    17.             invoke GetClientRect    ,hWnd, addr r
    18.             invoke InvalidateRect   ,hWnd, addr r, TRUE
    19.    
    20.         .ENDIF
    21.  
    22. assume edi: NOTHING
    23.    
    24.         pop eax
    25.         pop edi
    26.         mov ebx, edi
    27.         mov     eax, (NMHDR ptr [ebx]).code
    28.         .if eax == TTN_NEEDTEXT
    29.             mov eax,(NMHDR ptr [ebx]).idFrom
    30.             mov (TOOLTIPTEXT ptr [ebx]).lpszText,eax
    31.             mov  eax,hInstance
    32.             mov     [TOOLTIPTEXT ptr [ebx]].hinst,eax
    33.         .endif
    34.         .if eax == EN_MSGFILTER
    35.         .endif
    36.         .if eax == TTN_NEEDTEXT
    37.         .endif
    38.         .if eax == TBN_QUERYDELETE
    39.         return TRUE ;возможность удаления ч-л из тоолбара
    40.         .endif
    41.         ;.if eax == TBN_GETBUTTONINFO
    42.         ;return FALSE
    43.         ;.endif
    44.         .if eax == TBN_QUERYINSERT
    45.         return TRUE ;возможность вставки ч-л в толбар
    46.         .endif
    47.         .if eax == TBN_GETBUTTONINFO
    48.                     ;TBNOTIFY = NMTOOLBAR
    49.                 mov eax,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N
    50.                 .if eax > NombreBoutons -1
    51.                     return FALSE                ;seul la doc peut dire comment
    52.                 .endif                      ;effectuer le retour
    53.                 lea esi,offset tbToolBarFile
    54.                 mov ecx,sizeof TBBUTTON
    55.                 xor edx,edx
    56.                 mul ecx
    57.                 add esi,eax             ;esi pointe sur la definition du bouton n
    58.                 mov eax,(TBBUTTON ptr [esi]).iBitmap
    59.                 mov (TBNOTIFY ptr [ebx]).tbButton.iBitmap,eax
    60.                 mov eax,(TBBUTTON ptr [esi]).idCommand
    61.                 mov (TBNOTIFY ptr [ebx]).tbButton.idCommand,eax
    62.                 mov al,(TBBUTTON ptr [esi]).fsState
    63.                 mov (TBNOTIFY ptr [ebx]).tbButton.fsState,al
    64.                 mov al,(TBBUTTON ptr [esi]).fsStyle
    65.                 mov (TBNOTIFY ptr [ebx]).tbButton.fsStyle,al
    66.                 mov eax,(TBBUTTON ptr [esi]).dwData
    67.                 mov (TBNOTIFY ptr [ebx]).tbButton.dwData,eax
    68.                 mov eax,(TBBUTTON ptr [esi]).iString
    69.                 mov (TBNOTIFY ptr [ebx]).tbButton.iString,eax
    70.                 ;le tampon de la toolbar est rempli des infos du bouton
    71.                 ; maintenant le tooltip
    72.                 mov edx,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N
    73.                         ;le message porte le meme numero que le bouton
    74.                 invoke    LoadString,hInstance, edx,(TBNOTIFY ptr [ebx]).pszText,20h
    75.                 mov (TBNOTIFY ptr [ebx]).cchText,eax
    76.                 return TRUE
    77.         .endif
    78.         .if eax == TBN_BEGINADJUST
    79.                
    80.                 mov CLEappli.pszValueName,offset KeyTemp
    81.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli
    82.         .endif
    83.         .if eax == TBN_RESET
    84.                 mov CLEappli.pszValueName,offset KeyTemp
    85.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,0,addr CLEappli
    86.         .endif
    87.         .if eax == TBN_TOOLBARCHANGE
    88.                 ;fixe la taille des boutons a 20*20
    89.                 invoke SendMessage,hWnd_Rebar,TB_SETBUTTONSIZE,0,00140014h
    90.         .endif
    91.         .if eax == TBN_CUSTHELP
    92.                 ;la sauvegarde de la configuration des boutons
    93.                 InsTxt   ToolTitle,"organisation des boutons"
    94.                 InsTxt   ToolText,"sauvegarder la configuration"
    95.                 invoke MessageBox,NULL,ADDR ToolText,ADDR ToolTitle,MB_YESNO
    96.                 cmp eax,IDNO   
    97.                 jz Passesave
    98.                 mov CLEappli.pszValueName,offset Keydure
    99.                 invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli                   
    100.                 Passesave:
    101.         .endif