Szabóné Nacsa Rozália
1
Egérmozgás figyelése Ctrlhelp.txt
.topic IDH_BUTTON_ALMA Alma vagyok. .topic IDH_EDIT_ALMA Hány almát kér?
Ha egy gomb fölött „álldogál” az egérkurzor, akkor egy adott id eltelte után jelenjen meg egy kis „popup” szöveg.
A megjelenítend szöveget fájlban tároljuk.
Kattintás a jobb egérgombra Ctrlhelp_English.txt
.topic IDH_BUTTON_ALMA How many pears do you want?
Ha egy vezérl fölött az egér jobb fülére kattintunk, akkor jelenjen meg angol nyelv „popup” szöveg.
A megjelenítend szöveget fájlban tároljuk.
2
Shift F1 vagy F1 használata
Alma.htm
Ha kiválasztunk egy vezérl t, akkor a Shift F1 vagy F1 billenty leütésekor jelenjen meg az adott gombhoz illeszked HTML oldat.
Hibaüzenet - MsgBox
Ha egynél hosszabb számot próbálunk begépelni az alma adatbeviteli mez be, akkor jelenjen meg figyelmeztetés.
3
Hibaüzenet - „Popup” szöveg
Ha a „szilva” adatbeviteli mez t módosítjuk, jelenjen meg egy a programban konstans stringben megadott megadott „popup” hibaüzenet.
Helyi menü használata
Ha a jobb egérfüllel a párbeszédablak „szabad” felületére kattintunk, akkor jelenjen meg egy színeket tartalmazó helyi menü
A szín kiválasztása után ajánljuk fel kiválasztásra a színhez tartozó témaköröket
4
HTML oldal megjelenítése önálló ablakban
Ha a Help gombra kattintunk egy önálló ablakban jelenjen meg a párbeszédablakra vonatkozó HTML oldal.
5
Alkalmazás IDC_BUTTON_ALMA
Súgó fájl (.chm) IDH_BUTTON_ALMA
Control ID
Help ID .hhp [FILES] html\alma.htm [ALIAS] IDH_BUTTON_ALMA=html\alma.htm [MAP] #include ctrlhelp.h [TEXT POPUPS] ctrlhelp.h ctrlhelp.txt ctrlhelp_english.txt
Súgó azonosítók és szövegek megadása #include ” htmlhelp.h” #include „ctrlhelp.h”
ctrlhelp.h #define IDH_BUTTON_ALMA #define IDH_BUTTON_KORTE
1200 1220
…. HtmlHelp( ….. IDH_BUTTON_KORTE ….
.hhp [ALIAS] IDH_BUTTON_KORTE=html\korte.htm [MAP] #include ctrlhelp.h [TEXT POPUPS] ctrlhelp.h ctrlhelp.txt ctrlhelp_english.txt
ctrlhelp.txt .topic IDH_BUTTON_ALMA Alma vagyok. .topic IDH_BUTTON_KORTE Körte vagyok.
6
HtmlHelp API A szolgáltatást kér ablakra mutató pointer
BOOL HtmlHelp ( HWND hWndMain, LPCTSTR lpszHelp, UINT uCommand, DWORD dwData)
A súgó fájl neve
Parancs A parancshoz szükséges további adat.
Parancs HH_DISPLAY_TOC HH_DISPLAY_TOPIC HH_DISPLAY_TEXT_POPUP HH_HELP_CONTEXT ...
A HH_POPUP struktúra typedef struct tagHH_POPUP { int cbStruct; // sizeof this structure HINSTANCE hinst; // instance handle for string resource UINT idString; // string resource id, or text id if pszFile is // specified in HtmlHelp call // used if idString is zero LPCTSTR pszText; POINT pt; // top center of popup window COLORREF clrForeground; // use -1 for default COLORREF clrBackground; // use -1 for default RECT rcMargins; // amount of space between edges //of window and text, //-1 for each member to ignore LPCTSTR pszFont; // facename, point size, char set, //BOLD ITALIC UNDERLINE } HH_POPUP;
7
Készítsünk el egy új HTML oldalt a dialógusablakunkra vonatkozó használati utasítással. A súgó projektünkben hozzunk létre egy külön ablakot ezen HTML oldal számára.
8
Új súgófájl elkészítése AdvancedHelpDemo.htm Készítsük el a dialógusablak használatára vonatkozó ismereteket tartalmazó AdvancedHelpDemo.htm fájlt
Súgófájl beillesztése a súgóba AdvancedHelpDemo.htm
Vegyük fel az AdvancedHelpDemo.htm fájlt a súgó projektünk html oldalai közé
HHDemo.hhp [FILES] html\alma.htm ... html\AdvancedHelpDemo.htm
9
Új ablak létrehozása - Add
A párbeszédablak súgófájlját egy önálló súgóablakban szeretnénk megjeleníteni
Ablak stílus beállítása
10
Ablak pozíció beállítása
Az Autosizer gombbal kényelmesen beállíthatja a kívánt ablakméretet.
Súgó szöveg felvétele a súgó projektbe - Text Popups
HHDemo.hhp
11
Súgó azonosítók és HTML oldalak összekapcsolása Alias
Súgó azonosítók és HTML oldalak összekapcsolása Map
12
Ötlet: Készítünk egy olyan gomb osztályt, amely önállóan, saját hatáskörében oldja meg a „súgást”, és a dialógusablakunkra csupa ilyen gombokat fogunk feltenni.
13
A CSHButton osztály adattagjai és metódusai class CSHButton : public Cbutton { ... public: void SetHelpID(DWORD d); protected: DWORD m_HelpID; bool m_Over; void ShowPopupText(CString textfile, COLORREF frg, COLORREF bkg ); //{{AFX_MSG(CSHButton) afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
CSHButton osztály létrehozása
14
Adattagok inicializálása CSHButton::CSHButton() { m_Over=false; m_HelpID=0; }
Id zít k definiálása #define SHOW_POPUP_TIMER 1 #define MOVE_OUT_TIMER 2
Id zít k használata - ötlet If (m_Over==false) OnMouseMove { m_Over = true; SetTimer(SHOW_POPUP_TIMER,1000,NULL); SetTimer(MOVE_OUT_TIMER,100,NULL); } case MOVE_OUT_TIMER: OnTimer if ( ! (btnRect.PtInRect(point))) { m_Over=false; KillTimer(SHOW_POPUP_TIMER); KillTimer(MOVE_OUT_TIMER); } break; case SHOW_POPUP_TIMER: if (m_Over) ShowPopupText("ctrlhelp.txt",frg,bkg); KillTimer(SHOW_POPUP_TIMER); break;
Ha most jöttünk a gomb fölé, …
Ha nem a gomb fölött vagyunk, …
Ha a gomb fölött vagyunk, és eljött az ideje a szöveg mgjelenítésének, …
15
A ShowPopupText segédfüggvény
1. Üzenet helyének meghatározása 2. HH_POPUP struktúra kitöltése 3. HtmlHelp API meghívása
void ShowPopupText(CString textfile, COLORREF frg, COLORREF bkg )
void CSHButton::ShowPopupText(CString textfile, COLORREF frg, COLORREF bkg ) { Üzenet helyének //Find the good position meghatározása CRect ctrlRect; GetClientRect(ctrlRect); CPoint msgPoint; msgPoint.x=ctrlRect.left+ctrlRect.Width(); msgPoint.y=ctrlRect.bottom; ClientToScreen(&msgPoint);
16
void ShowPopupText(CString textfile, COLORREF frg, COLORREF bkg ) HH_POPUP popup ; RECT rRect ; // Set the popup's margins rRect.top = -1 ; rRect.left = -1 ; rRect.bottom = -1 ; rRect.right = -1 ; memset(&popup, 0, sizeof(HH_POPUP)); popup.cbStruct = sizeof(HH_POPUP); popup.hinst = 0; popup.idString = m_HelpID; popup.pszText =""; popup.pt = msgPoint; popup.clrForeground = frg; popup.clrBackground = bkg; popup.rcMargins = rRect; popup.pszFont = "Arial, 8, ascii, , , ";
HH_POPUP struktúra kitöltése
void ShowPopupText(CString textfile, COLORREF frg, COLORREF bkg )
HtmlHelp( 0, "hhdemo.chm::/"+textfile, HH_DISPLAY_TEXT_POPUP, (DWORD)&popup) ; } HtmlHelp API meghívása
17
Események • • • •
OnMouseMove OnTimer OnContextMenu OnHelpInfo
CSHButton:: OnMouseMove - létrehozás
18
CSHButton:: OnMouseMove - kód void CSHButton::OnMouseMove(UINT nFlags, CPoint point) { if(m_Over==false) //Ha most jöttünk a gomb fölé { m_Over = true; SetTimer(SHOW_POPUP_TIMER,1000,NULL); SetTimer(MOVE_OUT_TIMER,100,NULL); } CButton::OnMouseMove(nFlags, point); }
CSHButton:: OnTimer - létrehozás
19
CSHButton:: OnTimer – kód - 1
void CSHButton::OnTimer(UINT nIDEvent) { CRect btnRect; GetClientRect(btnRect); CPoint point(GetMessagePos()); //get the current mouse position ScreenToClient(&point);
}
CSHButton:: OnTimer – kód - 1 switch(nIDEvent) { case MOVE_OUT_TIMER: if (!(btnRect.PtInRect(point))){ m_Over=false; KillTimer(SHOW_POPUP_TIMER); KillTimer(MOVE_OUT_TIMER); } break; case SHOW_POPUP_TIMER: if(m_Over) { COLORREF frg = 0; COLORREF bkg = RGB(255, 255, 208); ShowPopupText("ctrlhelp.txt",frg,bkg); } KillTimer(SHOW_POPUP_TIMER); break; } }
20
A jobb egérkattintás callback függvénye
CSHButton::OnContextMenu
void CSHButton::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here ShowPopupText("ctrlhelp_English.txt",0,RGB(255, 0, 0)); }
21
Az F1 billenty callback függvénye
CSHButton::OnHelpInfo
BOOL CSHButton::OnHelpInfo(HELPINFO* pHelpInfo) { // TODO: Add your message handler code here and/or call default return (HtmlHelp( 0, "hhdemo.chm>tripane", HH_HELP_CONTEXT, m_HelpID) !=NULL) ; }
22
A CSHButton osztály alapján elkészíthet a CSHEdit osztály is.
Készítsünk el egy dialógusablakot, amely a fenti két osztályból származó vezérl ket tartalmaz.
23
AdvancedHelpDemo: adattagok // Dialog Data //{{AFX_DATA(AdvancedHelpDemo) enum { IDD = IDD_ADVANCED_HELP_DEMO }; CSHEdit m_edit_szilva; CSHEdit m_edit_korte; CSHEdit m_edit_alma; CSHButton m_button_szilve; CSHButton m_button_korte; CSHButton m_button_help; CSHButton m_button_alma; CString m_alma; int m_szilva; //}}AFX_DATA
AdvancedHelpDemo: OnInitDialog #include "ctrlhelp.h" BOOL AdvancedHelpDemo::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here ModifyStyleEx(0, WS_EX_CONTEXTHELP); m_button_alma.SetHelpID(IDH_BUTTON_ALMA); m_button_korte.SetHelpID(IDH_BUTTON_KORTE); m_button_szilva.SetHelpID(IDH_BUTTON_SZILVA); m_button_help.SetHelpID(IDH_BUTTON_HELP); m_button_ok.SetHelpID(IDH_BUTTON_OK); m_button_cancel.SetHelpID(IDH_BUTTON_CANCEL); m_edit_alma.SetHelpID(IDH_EDIT_ALMA); m_edit_korte.SetHelpID(IDH_EDIT_KORTE); m_edit_szilva.SetHelpID(IDH_EDIT_SZILVA); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
24
A párbeszédablak „behívása”
A Demo/Advanced Demo menüpont callback függvénye
#include "AdvancedHelpDemo.h" void CMainFrame::OnDemoAdvanced() { // TODO: Add your command handler code here AdvancedHelpDemo dlg; if (dlg.DoModal() == IDOK) { return; } }
25
Helyi menü megvalósítása Kezdetben töltsük ki valamilyen fiktív szöveggel a f menüt is, mert különben nem tudjuk létrehozni az almenüpontokat
Amikor elkészültünk a f menü feliratát a töröljük ki.
26
Helyi menü megvalósítása
IDR_COLOR_POPUP_MENU
A helyi menü behívása: jobb egérkattintásra
27
AdvancedHelpDemo::OnRButtonDown void AdvancedHelpDemo::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMenu menu; VERIFY(menu.LoadMenu(IDR_COLOR_POPUP_MENU)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); ClientToScreen(&point); pPopup->TrackPopupMenu (TPM_LEFTALIGN| TPM_RIGHTBUTTON, point.x, point.y, this); CDialog::OnRButtonDown(nFlags, point); }
A helyi menüpont kiválasztásának callback függvénye
void AdvancedHelpDemo::OnPopupSarga() { // TODO: Add your command handler code here ShowKeyword("Sárga szín"); }
28
HTML oldal megjelenítése kulcsszó alapján AdvancedHelpDemo::ShowKeyword void AdvancedHelpDemo::ShowKeyword(CString keyword) { HH_AKLINK link; link.cbStruct = sizeof(HH_AKLINK) ; link.fReserved = FALSE ; link.pszKeywords = keyword ; link.pszWindow = "tripane" ; link.fIndexOnFail = FALSE ; HtmlHelp( 0, "hhdemo.chm", HH_KEYWORD_LOOKUP, (DWORD)&link); }
29
A Help gomb callback függvénye
void AdvancedHelpDemo::OnButtonHelp() { // TODO: Add your control notification handler code here HtmlHelp( 0, "hhdemo.chm>second", HH_HELP_CONTEXT, IDH_ADVANCED_HELP_DEMO) ; }
30
Hibaüzenet callback függvénye – EN_CHANGE
Hibaüzenet callback függvénye - 2
void AdvancedHelpDemo::OnChangeEditSzilva() { // TODO: Add your control notification handler code here CRect ctrlRect; CWnd *pWnd=GetFocus(); pWnd->GetClientRect(ctrlRect); CPoint msgPoint; msgPoint.x=ctrlRect.left+ctrlRect.Width(); msgPoint.y=ctrlRect.bottom-ctrlRect.Height()/2; pWnd->ClientToScreen(&msgPoint);
Az üzenet helyének meghatározása
}
31
Hibaüzenet callback függvénye - 3 HH_POPUP popup ; RECT rRect ; A HH_POPUP rRect.top = -1 ; struktúra rRect.left = -1 ; kitöltése rRect.bottom = -1 ; rRect.right = -1 ; memset(&popup, 0, sizeof(HH_POPUP)); popup.cbStruct = sizeof(HH_POPUP); popup.hinst = 0; popup.idString = 0; popup.pszText =_tcsdup(_T("Sajnos kifogyott a szilva.")); popup.pt = msgPoint; popup.clrForeground = RGB(255, 255, 255); popup.clrBackground = RGB(92, 143, 218); popup.rcMargins = rRect; popup.pszFont = "Arial, 8, ascii, , , ";
Hibaüzenet callback függvénye - 4 HtmlHelp( 0, NULL, HH_DISPLAY_TEXT_POPUP, (DWORD)&popup) ;
A HtmlHelp API meghívása
32
33