Documente Academic
Documente Profesional
Documente Cultură
Descriere i ToolTip
n continuare vom (defini) ataa descrierea butonului i a ToolTip-ului. Descrierea apare n bara de stare, iar ToolTip-ul apare cnd mouse-ul rmne deasupra butonului pentru o secund sau dou. Aceste dou iruri de caractere le vom introduce n boxa de editare Prompt: mai nti irul pentru descrierea butonului i apoi separat cu newline (\n) irul pentru ToolTip.
2.
n primul caz vom alege acelai ID pentru buton ca i pentru comanda din meniu. Se presupune c pentru comenzile din meniu am scris codul. n cel de-al doilea caz vom proceda n felul urmtor:
1. Selectm butonul pentru care dorim s crem tratarea mesajului i apoi deschidem ClassWizard. 2. Din foia de proprieti care apare, cu ID-ul butonului selectat, selectm in boxa Class Name, clasa la care vom aduga funcia, n mod obinuit clasa pentru vizualizare (derivat din CView sau alte clase din aceast ierarhie). 3. Executm dublu clic pe COMMAND din boxa Messages. 4. Acceptm numele funciei propus de MFC i apoi editm codul. Observaie: Dac nu se definete nici o comand pentru un buton din toolbar atunci MFC l va face disabled n timpul execuiei. Acelai lucru este valabil i pentru o comand din meniu.
Se va exersa acest lucru la calculator. Un rspuns posibil pentru butonul cu ID-ul ID_CIRCLE.
Listing CToolView::OnCircle()
void CToolView::OnCircle() { CClientDC clientDC(this); CBrush newBrush(RGB(255,0,0)); CBrush* oldBrush = clientDC.SelectObject(&newBrush); clientDC.Ellipse(20, 20, 200, 200); clientDC.SelectObject(oldBrush); } Recapitulare: Evidenierea folosirii pensoanelor (clasa CBrush). Ce nseamn contextul de dispozitiv? Cum se folosete? Rolul funciei SelectObject(). Alte ntrebri legate de contextul de dispozitiv.
Loads a toolbar resource Sets a new toolbar button bitmap Sets a button's ID, style, and image number Sets the IDs for the toolbar buttons Sets a button's style Sets a button's text label Sets the toolbar's height Sets the button sizes
Bara de stare conine mai multe pri, numite panes, care afieaz informaii despre starea aplicaiei i a sistemului. Metoda cea mai folosit pentru a personaliza bara de stare, este de aduga noi pri. Pentru a face acest lucru procedm astfel:
1. Crem un ID pentru o comand pentru noul pane. 2. Crem un string implicit pentru acest pane. 3. Adugm comanda ID a pane-ului la tabloul (array) indicatorilor barei de stare. 4. Crem funcia corespunztoare pentru acest ID.
Explicm aceste lucruri n detaliu.
3.
tastm ID-ul, ID_MYNEWPANE n boxa ID (sau l alegem din lista drop-down) i apoi tastm textul (stringul) in boxa Caption .
Pentru a aduga noul pane, tastm ID-ul n acest vector n poziia n care vrem s apar panelul nou, urmat de virgul dac nu este pe ultima poziie.
Listing CMainFrame::OnUpdateMyNewPane()
void CMainFrame::OnUpdateMyNewPane(CCmdUI *pCmdUI) { pCmdUI->Enable(); pCmdUI->SetText(m_paneString); } m_paneString conine stringul (este de tip CString).
Listing CMainFrame::OnFileChangestring()
void CMainFrame::OnFileChangestring() { CPaneDlg dialog(this); dialog.m_paneString = m_paneString; int result = dialog.DoModal(); if (result == IDOK) { m_paneString = dialog.m_paneString; CClientDC dc(this); SIZE size = dc.GetTextExtent(m_paneString); int index = m_wndStatusBar.CommandToIndex(ID_MYNEWPANE); m_wndStatusBar.SetPaneInfo(index, ID_MYNEWPANE, SBPS_POPOUT, size.cx); } } De observat asemnarea codului cu cel din prima variant.
Lucrul cu Rebar
Rebar sunt toolbar-uri care conin alte controale dect butoanele toolbar. Ca exemplificare vom aduga un check box care este reprezentat de clasa CButton. Etape: n CMainFrame (.h) adugm: public: CReBar m_rebar; CButton m_check; n CMainFrame::Create() adugm la sfrit urmtoarele linii: if (!m_rebar.Create(this) ) { TRACE0("Failed to create rebar\n"); return -1; // fail to create } Controlul check box are nevoie de un ID. Selectm View->Resource Symbols->New i tastm IDC_CHECK. Acceptm aceast alegere. Se adaug astfel o linie n resource.h i aceast resurs nu poate fi utilizat i de alte controale. Din nou n CMainFrame::OnCreate(), adugm urmtoarele linii pentru a crea check box-ul: if (!m_check.Create("Check Here", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, CRect(0,0,20,20), this, IDC_CHECK) ) { TRACE0("Failed to create checkbox\n"); return -1; // fail to create } n final, se adaug acest control la rebar: m_rebar.AddBar(&m_check, "On The Bar", NULL, RBBS_BREAK | RBBS_GRIPPERALWAYS); AddBar() are patru parametri: un pointer la controlul care va fi adugat, textul afiat alturi de control, un pointer la un bitmap pentru a fi folosit pentru imaginea background-ului pe rebar i stilul rebar-ului. Alte stiluri sunt: RBBS_BREAK puts the band on a new line, even if there's room for it at the end of an existing line. RBBS_CHILDEDGE puts the band against a child window of the frame. RBBS_FIXEDBMP prevents moving the bitmap if the band is resized by the user. RBBS_FIXEDSIZE prevents the user from resizing the band. RBBS_GRIPPERALWAYS guarantees sizing wrinkles are present. RBBS_HIDDEN hides the band. RBBS_NOGRIPPER suppresses sizing wrinkles. RBBS_NOVERT hides the band when the rebar is vertical. RBBS_VARIABLEHEIGHT enables the band to be resized by the rebar.
n acest moment aplicaia funcioneaz dar nu se ntpl nimic la selecie sau deselecie check box. Pentru ca aplicaia s reacioneze la clic pe check box trebuie s prindem mesajul i s-l tratm. Cel mai simplu mod pentru a face acest lucru este s schimbm ceea ce se deseaneaz n OnDraw() din vizualizare. Adugm la clasa vizualizare tratarea mesajului care apare cnd se face clic pe acest buton. Adugarea se face manual ca la bara de stare, n afara codului generat de ClassWizard:
nainte de DECLARE_MESSAGE_MAP, adugm: afx_msg void OnClick(); Adugm funcia la clasa vizualizare: void CRebarView::OnClick() { Invalidate(); } Aceasta va apela OnDraw(). n harta de mesaje adugm (tot n afara codului generat de ClassWizard): ON_BN_CLICKED(IDC_CHECK, OnClick) La nceputul fiierului adugm: #include "mainFrm.h" n OnDraw() adugm: CString message; if ( ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_check.GetCheck()) message = "The box is checked"; else message = "The box is not checked"; pDC->TextOut(20,20,message); Nimic mai simplu..