26
Iul
2007

Pe 27 februarie 2008 va fi lansat Visual Studio 2008. Pe partea de VC++, una din noutatile notabile o reprezinta modificarile aduse bibliotecii MFC. In acest articol voi puncta aceste modificari.

Update al headerelor

Pentru prima data din 1998, headerele bibliotecii au fost updatate. Aceasta inseamna ca exista suport direct pentru stiluri si mesaje aparute in API-ul de Windows incepand de atunci (pentru Windows 2000, XP sau Vista).

Controale noi

MFC 9 ofera suport pentru controale Vista, precum butonul de comanda (command button) si split button, care ofera un meniu cu diverse optiuni. Exista de asemenea suport si pentru controlul syslink aparut odata cu Windows XP, precum si un control netaddress pentru introducerea si validarea IP-urilor (atat IPv4 cat si IPv6) sau a numelor de domeniu. Prun suport se intelege plasarea lor in toolbar-ul de controale, si posibilitatea de a adauga direct din toolbar in resursa dialog aceste controale.

Pentru noile controale au fost definite siluri noi in commctrl.h (dar si in commctrl.rc):

#if _WIN32_WINNT >= 0x0600

// BUTTON STATE FLAGS
#define BST_DROPDOWNPUSHED      0x0400

// BUTTON STYLES
#define BS_SPLITBUTTON          0x0000000CL
#define BS_DEFSPLITBUTTON       0x0000000DL
#define BS_COMMANDLINK          0x0000000EL
#define BS_DEFCOMMANDLINK       0x0000000FL

Pentru butoanele comanda si split, clasa CButton a fost extinsa cu metode noi, insa acestea sunt disponibile doar in cazul unui build pentru UNICODE pentru Vista sau un sistem mai nou.

#if ( _WIN32_WINNT >= 0x0600 ) && defined(UNICODE)
	CString GetNote() const;
	_Check_return_ BOOL GetNote(_Out_z_cap_(*pcchNote) LPTSTR lpszNote, _Inout_ UINT* pcchNote) const;
	BOOL SetNote(_In_z_ LPCTSTR lpszNote);
	UINT GetNoteLength() const;
	BOOL GetSplitInfo(_Out_ PBUTTON_SPLITINFO pInfo) const;
	BOOL SetSplitInfo(_In_ PBUTTON_SPLITINFO pInfo);
	UINT GetSplitStyle() const;
	BOOL SetSplitStyle(_In_ UINT nStyle);
	BOOL GetSplitSize(_Out_ LPSIZE pSize) const;
	BOOL SetSplitSize(_In_ LPSIZE pSize);
	CImageList* GetSplitImageList() const;
	BOOL SetSplitImageList(_In_ CImageList* pSplitImageList);
	TCHAR GetSplitGlyph() const;
	BOOL SetSplitGlyph(_In_ TCHAR chGlyph);
	BOOL SetDropDownState(_In_ BOOL fDropDown);

	// Sets whether the action associated with the button requires elevated permissions.
	// If elevated permissions are required then the button should display an elevated icon.
	HICON SetShield(_In_ BOOL fElevationRequired);
#endif // ( _WIN32_WINNT >= 0x600 ) && defined(UNICODE)

Pentru un buton commanda, se foloseste stilul BS_COMMANDLINK sau BS_DEFCOMMANDLINK pentrun un buton default.

Pentru un buton split se foloseste stilul BS_SPLITBUTTON sau BS_DEFSPLITBUTTON pentru un buton default.

Controlul syslink ofera o modalitate e a include hipertext intr-o fereastra. De fapt e o fereastra care afiseaza text marked-up precum un browser afiseaza link-uri web. Mai multe link-uri pot fi folosite in cadrul aceluiasi control, si pot fi accesate incepand de la index-ul 0. In prezent suporta tag-ul ancora (<A>) cu atributele HREF si ID. Primul este folosit pentru a specifica un URL de orice protocol (http, ftp, mailto, etc.), iar al doilea defineste un nume unic in cadrul controlului, asociat cu un link individual.

Pentru a specifica textul cu tag-urile ancora se poate folosi pagina de proprietati, sau se poate seta direct din cod:

GetDlgItem(IDC_SYSLINK1)->SetWindowText(
   L"Visit my <a href=\"http://www.mariusbancila.ro\">web site</a>"
   L" and check my <a href=\"http://www.mariusbancila.ro/blog\">blog</a>.");

Pentru a executa o actiune sau alta, trebuie tratata notificarea NM_CLICK:

BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialog)
        ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &CMFCDemoDlg::OnNMClickSyslink1)
END_MESSAGE_MAP()   

void CMFCDemoDlg::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult)
{
        PNMLINK pNMLink = (PNMLINK) pNMHDR;   

        if (wcscmp(pNMLink->item.szUrl, WEB_SITE) == 0)
        {
                ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL);
        }
        else if(wcscmp(pNMLink->item.szUrl, BLOG_LINK) == 0)
        {
                ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL);
        }   

        *pResult = 0;
}

In MFC 9.0, clasa CLinkCtrl este un wrapper peste API-ul de Windows pentru acest control. Pentru un exemplu vedeti aplicatia demo atasata.

Dialogurile de selectie e unui fisier

In Windows Vista dialogurile de selectie a unui fisier au fost reproiectate. MFC 9 suporta aceste modificari. Tot ce este nevoie pentru a le putea folosi e sa compilati aplicatia cu VC++ 2008. Desigur aplicatia trebuie sa ruleze pe Vista. Pe un sistme de operare anterior, vor fi afisate vechile dialoguri.

Modificarea este posibila prin adaugarea unui noi parametru la constructorul lui CFileDialog. Inainte constructorul avea prototipul:

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0);

In MFC 9.0 el arata astfel:

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0,
   BOOL bVistaStyle = TRUE);

Pentru a afisa dialogurile din Vista, nu trebuie decat sa instantiati un obiect si sa apelati DoModal:

CFileDialog dlg(TRUE, NULL, NUL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                L"Text files (*.txt)|*.txt||", this);
dlg.DoModal();

Daca specificati FALSE pentru ultimul parametru, veti primi vechiul dialog:

CFileDialog dlg(TRUE, NULL, NUL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                L"Text files (*.txt)|*.txt||", this, 0, FALSE);
dlg.DoModal();

Ascunderea implicita a meniurilor

Aplicatii precum IE7 sau Media Player 11 au meniul asuns in mod default, si este afisat in momentul cand apasati tasta ALT. Aceasta este una din particularitatile Windows Vista Aero. MFC 9.0 ofera suport pentru acest comportament, apeland functia SetMenuBarVisibility din clasa CFrameWnd cu parametrul AFX_MBV_DISPLAYONFOCUS. Acest comportament functioneaza doar pentru aplicatiile SDI.

Intr-o aplicatie SDI, exista o clasa derivata din CFrameWnd, in mod default numita CMainFrame. In functia OnCreate(), dupa apelul lui OnCreate() din clasa de baza, trebuie apelat SetMenuBarVisibility:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1; 

   SetMenuBarVisibility(AFX_MBV_DISPLAYONFOCUS); 

   // other stuff here 

   return 0;
}

Acest stil este definit in afxwin.h:

// Frame window menu bar visibility styles
#define AFX_MBV_KEEPVISIBLE    0x01L // always visible
#define AFX_MBV_DISPLAYONFOCUS 0x02L // toggle state on ALT
#define AFX_MBV_DISPLAYONF10   0x04L // display on F10

Rezultatul este ascunderea automata a meniului, dupa cum se vede mai jos

si afisarea sa in momentul apasarii tastei ALT.

Alte resurse

Pentru mai multe informatii puteti citi:

[phpBB Debug] PHP Warning: in file [ROOT]/phpbb/db/driver/mysqli.php on line 317: mysqli_free_result(): Couldn't fetch mysqli_result