Для того, чтобы добавалять (убирать) кнопки в некоторые тоолбары (ребары) встроен этот диалог. При двойном клике на области тоолбара в моей проге он появляется и тотчас же исчезает. Как сделать так чтоб он нормально работал? Кто-нибудь может помочь?
God_Father Ты не показал свой код, поэтому трудно судить об используемом языке и возможных причинах исчезновения диалога. Предположу наиболее часто встречающуюся ошибку: в оконной процедуре отсутствует обработчик Код (Text): ... case WM_NOTIFY: if ((TBN_QUERYINSERT == ((LPNMHDR)lParam)->code) || (TBN_QUERYDELETE == ((LPNMHDR)lParam)->code)) return 1; ...
IceStudent Обрати внимание на "он появляется и тотчас же исчезает", imho и стиль есть и сообщение посылаетс/приходит.
IceStudent Может, с манифестом/инициализацией контролов проблемы.. Imho все проще. Пока нет автора, попробуй пример из аттача. Если просто собрать, то двойной щелчок по toollbar'у не возымеет ни какой реакции, если убрать комментарий с CCS_ADJUSTABLE, то двойной щелчок по toollbar'у приведет к "он появляется и тотчас же исчезает", если убрать комментарий с case WM_NOTIFY: ... break;, то можно увидеть "Диалог настройки панели инструментов" и порулить им.
Я разобрался там действительно стиль правильно, но не знаю как с обычного толбара это на док ребар перекинуть я погуглил и нашел на обычном толбаре пример появления этого окна думаю будет интересно ознакомиться я совместил 2 програмыы но он не хочет после удаления в этом диалоге востанавливать кнопки на тоолбаре Может кто-нибудь сумеет сделать что в ребаре все работало Даю примеры
God_Father Может кто-нибудь сумеет сделать что в ребаре все работало Вместо тебя? Ты даже не удосужился проверить #2, т.е. тривиально добавив Код (Text): ... assume edi: PTR NMHDR mov eax, [edi].hwndFrom .if [edi].code == TBN_QUERYINSERT mov eax, 1 ret .endif .if [edi].code == TBN_QUERYDELETE mov eax, 1 ret .endif .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG) assume edi: PTR NMREBAR ... и диалог перестанет пропадать. hint обработчик WM_NOTIFY из DockRebar.asm.MainWindow_WndProc занимается только rebar'ом, а обработчик WM_NOTIFY из toolbar.asm.WndProc занимается tooltip'ами (.if edx == TTN_NEEDTEXT) и диалогом настройки toolbar'а (начиная с .if eax == hToolBar).
Ну и что это я и сам смог я думал что вы что-нибудь эдак покруче придумаете. Да диалог бесспорно вызывается НО ПОПРОБУЙТЕ МЕТАМИ КНОПКИ В ЭТОМ ТОЛБАРЕ ПОМЕНЯТЬ или запихнуть кнопку в Listbox "Имеющиеся кнопки"а потом назад в Listbox "Панель инструментов" кнопка не хочет переходить видно ей и там не плохо . Вы можете объяснить как правильно построить обработчик чтобы кнопки туда-сюда можно было тягать?
God_Father Вы можете объяснить как правильно построить обработчик У тебя есть код с rebar'ом на котором лежат _два_ toolbar'а. Есть код, который демонстрирующий работу _одного_ toolbar'а с диалогом настройки. Задача переписать второй код так, чтобы toolbar и его данные были переменными. ps я думал что вы что-нибудь эдак покруче придумаете Так не пойдет. Ты до сих пор не показал ни строчки _своего_ кода.
НУ ты прям как бот покажи да покажи !НА! Код (Text): .ELSEIF wMsg == WM_NOTIFY mov edi, lParam push edi push eax mov edi, lParam assume edi: PTR NMHDR mov eax, [edi].hwndFrom .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG) assume edi: PTR NMREBAR mov rbi.cbSize, sizeof REBARBANDINFO mov rbi.fMask, RBBIM_CHILD m2m BandDraggingRebarBand, [edi].uBand invoke SendMessage, hWnd_Rebar, RB_GETBANDINFO, [edi].uBand, addr rbi m2m hWndDraggingRebarBand, rbi.hwndChild assume edi: PTR NMHDR .ELSEIF (eax == hWnd_Rebar) && ([edi].code == RBN_HEIGHTCHANGE) invoke GetClientRect ,hWnd, addr r invoke InvalidateRect ,hWnd, addr r, TRUE .ENDIF assume edi: NOTHING pop eax pop edi mov ebx, edi mov eax, (NMHDR ptr [ebx]).code .if eax == TTN_NEEDTEXT mov eax,(NMHDR ptr [ebx]).idFrom mov (TOOLTIPTEXT ptr [ebx]).lpszText,eax mov eax,hInstance mov [TOOLTIPTEXT ptr [ebx]].hinst,eax .endif .if eax == EN_MSGFILTER .endif .if eax == TTN_NEEDTEXT .endif .if eax == TBN_QUERYDELETE return TRUE ;возможность удаления ч-л из тоолбара .endif .if eax == TBN_GETBUTTONINFO return FALSE .endif .if eax == TBN_QUERYINSERT return TRUE ;возможность вставки ч-л в толбар .endif .if eax == TBN_GETBUTTONINFO ;TBNOTIFY = NMTOOLBAR mov eax,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N .if eax > NombreBoutons -1 return FALSE ;seul la doc peut dire comment .endif ;effectuer le retour lea esi,szRebar_Class mov ecx,sizeof TBBUTTON xor edx,edx mul ecx add esi,eax ;esi pointe sur la definition du bouton n mov eax,(TBBUTTON ptr [esi]).iBitmap mov (TBNOTIFY ptr [ebx]).tbButton.iBitmap,eax mov eax,(TBBUTTON ptr [esi]).idCommand mov (TBNOTIFY ptr [ebx]).tbButton.idCommand,eax mov al,(TBBUTTON ptr [esi]).fsState mov (TBNOTIFY ptr [ebx]).tbButton.fsState,al mov al,(TBBUTTON ptr [esi]).fsStyle mov (TBNOTIFY ptr [ebx]).tbButton.fsStyle,al mov eax,(TBBUTTON ptr [esi]).dwData mov (TBNOTIFY ptr [ebx]).tbButton.dwData,eax mov eax,(TBBUTTON ptr [esi]).iString mov (TBNOTIFY ptr [ebx]).tbButton.iString,eax ;le tampon de la toolbar est rempli des infos du bouton ; maintenant le tooltip mov edx,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N ;le message porte le meme numero que le bouton invoke LoadString,hInstance, edx,(TBNOTIFY ptr [ebx]).pszText,20h mov (TBNOTIFY ptr [ebx]).cchText,eax return TRUE .endif .if eax == TBN_BEGINADJUST mov CLEappli.pszValueName,offset KeyTemp invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli .endif .if eax == TBN_RESET mov CLEappli.pszValueName,offset KeyTemp invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,0,addr CLEappli .endif .if eax == TBN_TOOLBARCHANGE ;fixe la taille des boutons a 20*20 invoke SendMessage,hWnd_Rebar,TB_SETBUTTONSIZE,0,00140014h .endif .if eax == TBN_CUSTHELP ;la sauvegarde de la configuration des boutons InsTxt ToolTitle,"organisation des boutons" InsTxt ToolText,"sauvegarder la configuration" invoke MessageBox,NULL,ADDR ToolText,ADDR ToolTitle,MB_YESNO cmp eax,IDNO jz Passesave mov CLEappli.pszValueName,offset Keydure invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli Passesave: .endif ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Спасибо дарагой выручил Код (Text): .ELSEIF wMsg == WM_NOTIFY mov edi, lParam push edi push eax mov edi, lParam assume edi: PTR NMHDR mov eax, [edi].hwndFrom .IF (eax == hWnd_Rebar) && ([edi].code == RBN_BEGINDRAG) assume edi: PTR NMREBAR mov rbi.cbSize, sizeof REBARBANDINFO mov rbi.fMask, RBBIM_CHILD m2m BandDraggingRebarBand, [edi].uBand invoke SendMessage, hWnd_Rebar, RB_GETBANDINFO, [edi].uBand, addr rbi m2m hWndDraggingRebarBand, rbi.hwndChild assume edi: PTR NMHDR .ELSEIF (eax == hWnd_Rebar) && ([edi].code == RBN_HEIGHTCHANGE) invoke GetClientRect ,hWnd, addr r invoke InvalidateRect ,hWnd, addr r, TRUE .ENDIF assume edi: NOTHING pop eax pop edi mov ebx, edi mov eax, (NMHDR ptr [ebx]).code .if eax == TTN_NEEDTEXT mov eax,(NMHDR ptr [ebx]).idFrom mov (TOOLTIPTEXT ptr [ebx]).lpszText,eax mov eax,hInstance mov [TOOLTIPTEXT ptr [ebx]].hinst,eax .endif .if eax == EN_MSGFILTER .endif .if eax == TTN_NEEDTEXT .endif .if eax == TBN_QUERYDELETE return TRUE ;возможность удаления ч-л из тоолбара .endif ;.if eax == TBN_GETBUTTONINFO ;return FALSE ;.endif .if eax == TBN_QUERYINSERT return TRUE ;возможность вставки ч-л в толбар .endif .if eax == TBN_GETBUTTONINFO ;TBNOTIFY = NMTOOLBAR mov eax,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N .if eax > NombreBoutons -1 return FALSE ;seul la doc peut dire comment .endif ;effectuer le retour lea esi,offset tbToolBarFile mov ecx,sizeof TBBUTTON xor edx,edx mul ecx add esi,eax ;esi pointe sur la definition du bouton n mov eax,(TBBUTTON ptr [esi]).iBitmap mov (TBNOTIFY ptr [ebx]).tbButton.iBitmap,eax mov eax,(TBBUTTON ptr [esi]).idCommand mov (TBNOTIFY ptr [ebx]).tbButton.idCommand,eax mov al,(TBBUTTON ptr [esi]).fsState mov (TBNOTIFY ptr [ebx]).tbButton.fsState,al mov al,(TBBUTTON ptr [esi]).fsStyle mov (TBNOTIFY ptr [ebx]).tbButton.fsStyle,al mov eax,(TBBUTTON ptr [esi]).dwData mov (TBNOTIFY ptr [ebx]).tbButton.dwData,eax mov eax,(TBBUTTON ptr [esi]).iString mov (TBNOTIFY ptr [ebx]).tbButton.iString,eax ;le tampon de la toolbar est rempli des infos du bouton ; maintenant le tooltip mov edx,(NMTOOLBAR ptr [ebx]).iItem ;numero index bouton de 0 a N ;le message porte le meme numero que le bouton invoke LoadString,hInstance, edx,(TBNOTIFY ptr [ebx]).pszText,20h mov (TBNOTIFY ptr [ebx]).cchText,eax return TRUE .endif .if eax == TBN_BEGINADJUST mov CLEappli.pszValueName,offset KeyTemp invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli .endif .if eax == TBN_RESET mov CLEappli.pszValueName,offset KeyTemp invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,0,addr CLEappli .endif .if eax == TBN_TOOLBARCHANGE ;fixe la taille des boutons a 20*20 invoke SendMessage,hWnd_Rebar,TB_SETBUTTONSIZE,0,00140014h .endif .if eax == TBN_CUSTHELP ;la sauvegarde de la configuration des boutons InsTxt ToolTitle,"organisation des boutons" InsTxt ToolText,"sauvegarder la configuration" invoke MessageBox,NULL,ADDR ToolText,ADDR ToolTitle,MB_YESNO cmp eax,IDNO jz Passesave mov CLEappli.pszValueName,offset Keydure invoke SendMessage,hWnd_Rebar,TB_SAVERESTORE,1,addr CLEappli Passesave: .endif