Praca z paska narzędzi, który powtarza niektóre elementy menu z menu starszego aplikacji MFC, pracuję w tej kwestii podpowiedzi, jak (1) modyfikowanie Mapa bitowa paska narzędzi zawierająca dodatkowe ikony i (2) zapewniająca informację zwrotną od użytkownika na temat bieżącego stanu aplikacji. Mój problem polega na tym, że muszę to robić ręcznie, zamiast korzystać z różnych kreatorów i narzędzi.
To, co zrobiłem, to (1) dodać nowych członków do klasy pochodnej CView do obsługi dodatkowych wiadomości, (2) zmodyfikować mapę bitową paska narzędzi, aby dodać dodatkowe ikony przy użyciu zarówno MS Paint, jak i edytora zasobów, oraz (3) dodał nowe identyfikatory zdarzeń i programy obsługi zdarzeń do mapy komunikatów dla klasy pochodnej CView.
Jednym z problemów, które napotkałem podczas zmiany paska mapy, było to, że od kiedy wstawiałem ikonę, musiałem przesunąć istniejącą ikonę w bitmapie w prawo. Moja pierwsza próba spowodowała przesunięcie ikony pokazanej jako puste na pasku narzędzi aplikacji. Wtedy zdałem sobie sprawę, że muszę dodać trochę więcej do długości mapy bitowej paska narzędzi. Po dodaniu kilku dodatkowych kolumn do ostatniej ikony w mapie bitowej paska narzędzi, aby stała się ona standardową szerokością w pikselach, ikona wyświetli się prawidłowo.
Dla podpowiedzi I dodaje następujące do mapy wiadomość:
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
I dodaje następujące metody do mojej klasy do obsługi powiadomień dla mojego menu. Na marginesie okazuje się, że OnToolTipText()
jest standardową metodą używaną w klasie CFrameWnd
i CMDIChildWnd
, jednak CView
wywodzi się z CWnd
, podobnie jak CFrameWnd
, więc wątpię, czy ma to wpływ na nazwę metody.
inline BOOL CPCSampleView::OnToolTipText(UINT id, NMHDR * pNMHDR, LRESULT * pResult)
{
static wchar_t toolTextToggleExportSylk [64] = L"Toggle SYLK export.";
static wchar_t toolTextClearWindow [64] = L"Clear the log displayed.";
static wchar_t toolTextConnectLan [64] = L"Log on the POS terminal through the LAN.";
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
switch (pNMHDR->idFrom) {
case ID_TOGGLE_SYLK_EXPORT:
pTTT->lpszText = toolTextToggleExportSylk;
return TRUE;
case ID_WINDOW_CLEAR:
pTTT->lpszText = toolTextClearWindow;
return TRUE;
case ID_CONNECT_LAN_ON:
pTTT->lpszText = toolTextConnectLan;
return TRUE;
}
// if we do not handle the message then return FALSE to let someone else do it.
return FALSE;
}
za opinie użytkowników na menu, które przełącza się eksport plików podczas wykonywania raportów ja przewidziane następujące zmiany w mapie wiadomość, a następnie wdrożyć odpowiednie metody. Istnieją dwa rodzaje komunikatów zaangażowanych więc musiałem dodać dwie metody i dwa nowe wpisy wiadomość mapy:
// New message map entries to handle the menu item selection event
// and to update the menu item and the toolbar icon with state changes
ON_COMMAND(ID_TOGGLE_SYLK_EXPORT, OnToggleExportSylk)
ON_UPDATE_COMMAND_UI(ID_TOGGLE_SYLK_EXPORT, OnUpdateToggleExportSylk)
// New methods added to the CView derived class
// handle the menu selection event generated by either selecting the menu item
// from the menu or by clicking on the icon in the toolbar.
void CPCSampleView::OnToggleExportSylk()
{
// Exclusive Or to toggle the indicator bit from 0 to 1 and 1 to 0.
GetDocument()->ulReportOptionsMap ^= CPCSampleDoc::ulReportOptionsExportSylk;
}
// handle the request from the MFC framework to update the displayed state this
// not only does a check mark against the menu item it also causes the toolbar
// icon to appear depressed if click is set or non-depressed if click is not set
inline void CPCSampleView::OnUpdateToggleExportSylk (CCmdUI* pCmdUI)
{
if (GetDocument()->ulReportOptionsMap & CPCSampleDoc::ulReportOptionsExportSylk)
{
// SYLK export is turned on so indicate status to the user. This will
// put a check mark beside the menu item and show the toolbar button depressed
pCmdUI->SetCheck (1);
}
else
{
// SYLK export is turned off so indicate status to the user. This will
// remove the check mark beside the menu item and show the toolbar button as raised.
pCmdUI->SetCheck (0);
}
}
Zasób potrzebne zmiany pliku zostały dostarczenie nowego przycisku na działanie przerzutnika jak dodać nowy element menu dla akcji przełączania. Używam tego samego identyfikatora zasobu dla kilku różnych rzeczy, ponieważ wszystkie są oddzielne. Tak więc id łańcucha zasobów jest taki sam jak dla pozycji menu i jest taki sam dla przycisku paska narzędzi, aby uprościć moje życie i ułatwić znalezienie wszystkich poszczególnych bitów.
Definicja pliku zasobów Pasek wygląda następująco:
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_CONNECT_LAN_ON
SEPARATOR
BUTTON ID_WINDOW_CLEAR
SEPARATOR
BUTTON ID_TOGGLE_SYLK_EXPORT
SEPARATOR
BUTTON ID_APP_ABOUT
END
A specyficzna część menu, która wykorzystuje ten sam identyfikator zasobu dla identyfikatora zdarzenia przełącznik wygląda następująco:
MENUITEM "Export to SYLK file", ID_TOGGLE_SYLK_EXPORT
Następnie do podać tekst paska stanu, który pojawia się za pomocą myszy, tam jest dodawanie tablicy ciągów:
ID_TOGGLE_SYLK_EXPORT "Toggle export of SYLK format report files for spreadsheets."
Członek struct lpszText
jest opisać w dokumentacji MSDN dla struct TOOLINFO
jak:
wskaźnik do bufora zawierającego tekst narzędzia lub identyfikatorem zasobu znaków, który zawiera tekst. Ten element członkowski jest czasami używany do zwracania wartości. Jeśli chcesz sprawdzić zwróconą wartość, musisz wskazać prawidłowy bufor o odpowiednim rozmiarze. W przeciwnym razie można ustawić wartość NULL. Jeśli lpszText jest ustawiony na LPSTR_TEXTCALLBACK, kontrolka wysyła kod powiadomienia TTN_GETDISPINFO do okna właściciela, aby pobrać tekst.
przeglądu istniejącego odpowiedź na to pytanie, zastanawiałem się o czeku if
Oświadczenie dla flagi TTF_IDISHWND
. Dokumentacja MSDN dla struktury TOOLINFO
ma następujące znaczenie:
Wskazuje, że członem uId jest uchwyt okna narzędzia. Jeśli ta flaga nie jest ustawiona, uID jest identyfikatorem narzędzia.
Napotkałem podobny problem w systemie Windows XP (i tylko na XP, bez problemów w Vista, 7 i 8). Mam przycisk z końcówką narzędzia w modalnym oknie dialogowym.Gdy mysz zatrzyma się nad przyciskiem, etykietka pojawi się po bardzo krótkim czasie. Jak na razie dobrze. Teraz podpowiedź odchodzi, gdy jeden z następujących dwóch coditions spełniony jest: 1) użytkownik przesuwa kursor myszy na przycisku, 2) użytkownik nie porusza się mysz dla 4 lub 5 sekund. Jeśli końcówka narzędzia zniknie z powodu drugiego warunku, nigdy nie powróci do tego okna dialogowego, chyba że okno dialogowe zostanie zamknięte i ponownie otwarte. –
Również używam komputera z systemem Windows XP. Nie masz problemy nr 2, jak liście, mogę pozwolić podpowiedź zniknie i będzie wrócić po usunę + przesunąć kursor nad nim ponownie. Mój problem polega na tym, że tooltip nie ma i nie pojawia się w przypadku unikalnych kontrolek, a nie konkretnych. Wydaje się, że dla niektórych CCheckBox i niektórych nie, pojawi się dla niektórych CEdit, a niektóre nie. Etykietka również miga co każde 50ms, dzięki czemu jest częściowo nieczytelna; ale jest to tylko z nietypowymi myszami, takimi jak "krzyż", którego często używam na ekranie z dokładnością. –
podpowiedzi Okna są jednym z najważniejszych cech Pita (wdrożenie) wszechczasów. –