11.07.2015 Views

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M EWin<strong>do</strong>ws API / 4. èas: Basic ElementsV tejto èasti sa pozrieme <strong>na</strong> základné elementy vo WTL, s ktorými sa v oblasti GUI bude−te stretáva zrejme <strong>na</strong>jèastejšie. Ide o commandbar, toolbar, rebar a statusbar. Keïe<strong>do</strong> pre<strong>do</strong>šlej èasti sa mi u nezmestil praktický príklad, nájdete ho <strong>na</strong> <strong>na</strong>sledujúcichriadkoch. Zdrojové kódy k tejto èasti nájdete <strong>na</strong> stránke <strong>www</strong>.pcrevue.sk v sekcii Prog−ramujeme.MINMAX WINDOW. Niekedy je potrebné obmedzi minimálne a maximálne zväèšu−júcu sa ve¾kos ok<strong>na</strong> a aj pozíciu a ve¾kos maximalizovaného ok<strong>na</strong>. Riešenie je pomernejednoduché a mono ho zrealizova spracovaním správy WM_GETMINMAXINFO a zme−nou štruktúry MINMAXINFO.Správa WM_GETMINMAXINFO je poslaná oknu, keï sa zmení jeho ve¾kos alebo pozí−cia. Aplikácia môe poui túto správu <strong>na</strong> anulovanie štandardnej maximalizovanej ve¾−kosti a pozície ok<strong>na</strong> alebo štandardnej, minimálne a maximálne sa zväèšujúcej ve¾kosti ok<strong>na</strong>.WM_GETMINMAXINFOlpmmi = (LPMINMAXINFO) lParam; // address of structurelpmmi – hodnota lParam. Ukazovate¾ <strong>na</strong> štruktúru MINMAXINFO, ktorá obsahuje štan−dardnú maximálnu pozíciu a rozmery a štandardnú minimálne a maximálne zväèšujúcusa ve¾kos ok<strong>na</strong>. Aplikácia môe anulova štandardné <strong>na</strong>stavenia èlenov tejto štruktúry.typedef struct tagMINMAXINFO { // mmiPOINT ptReserved;POINT ptMaxSize;POINT ptMaxPosition;POINT ptMinTrackSize;POINT ptMaxTrackSize;} MINMAXINFO;ptReserved – rezervované; nepouíva sa.ptMaxSize – urèuje maximálnu šírku (point.x) a maximálnu výšku (point.y) ok<strong>na</strong>.ptMaxPosition – urèuje pozíciu ¾avej strany maximalizovaného ok<strong>na</strong> (point.x) a pozíciuvrchnej èasti maximalizovaného ok<strong>na</strong> (point.y).ptMinTrackSize – urèuje minimálnu, zmenšujúcu sa šírku (point.x) a minimálnu,zmenšujúcu sa výšku (point.y) ok<strong>na</strong>.ptMaxTrackSize – urèuje maximálnu, zväèšujúcu sa šírku (point.x) a maximálnu, zväèšu−júcu sa výšku (point.y) ok<strong>na</strong>.V <strong>na</strong>šom príklade spracujeme správu WM_GETMINMAXINFO takto:LRESULT CMainFrame::OnMinMaxWin<strong>do</strong>w(UINT uMsg, WPARAM wParam, LPARAMlParam, BOOL& bHandled){ LPMINMAXINFO minmax;switch ( uMsg ){case WM_GETMINMAXINFO:minmax = (LPMINMAXINFO) lParam;minmax−>ptMaxSize.x = 500;minmax−>ptMaxSize.y = 500;minmax−>ptMaxPosition.x = 200;minmax−>ptMaxPosition.y = 200;minmax−>ptMaxTrackSize.x = 500;minmax−>ptMaxTrackSize.y = 500;minmax−>ptMinTrackSize.x = 310;minmax−>ptMinTrackSize.y = 220;break;}if (IsWin<strong>do</strong>wVisible()) {RECT r;GetWin<strong>do</strong>wRect(&r);CString str;str.Format("position.x=%i, position.y=%i, width=%i,height=%i",r.left, r.top, r.right−r.left, r.bottom−r.top);m_wndStatusBar.SetPaneText(ID_DEFAULT_PANE, str);}return DefWin<strong>do</strong>wProc(uMsg, wParam, lParam);}Obr. 1 Spracovanie správyWM_GETMINMAXINFONa obrázku 1 môete vidie spraco−vanie správy WM_GETMINMAXINFO.Minimál<strong>na</strong> ve¾kos ok<strong>na</strong> je ve¾kos, zaktorú u nie je moné dané okno zmen−ši (pozri ptMinTrackSize.x a ptMinTrack−Size.y). Naopak, maximál<strong>na</strong> ve¾kos ok<strong>na</strong>je ve¾kos, za ktorú u nie je monédané okno zväèši (pozri ptMaxTrackSi−ze.x a ptMaxTrackSize.y). Do tohto prí−kladu som zapracoval aj zobrazovaniepozície a ve¾kosti ok<strong>na</strong>. Tieto informá−cie sa vypisujú <strong>do</strong> tzv. stavového riad−ka aplikácie (angl. StatusBar). Keïeo òom budeme hovori v nie−ktorej z <strong>na</strong>sledujúcich èastí,nebudem to tu teraz zvláš vy−svet¾ova. Samozrejme, niè vámnebráni preskúma kód týkajúcisa vypisovania údajov o okne<strong>do</strong> tohto ovládacieho prvku. Kódpre výpis údajov som umiestnil<strong>do</strong> funkcie <strong>na</strong> spracovanie sprá−vy WM_GETMINMAXINFO z to−ho dôvodu, e táto funkcia saObr. 2 Základné elementy WTLvykoná vdy, keï okno zmenísvoju pozíciu alebo ve¾kos. Musíme však myslie <strong>na</strong> to, e informácie o pozícii a ve¾kostiok<strong>na</strong> sa môu zobrazi, a keï je okno vidite¾né. To <strong>do</strong>siahneme pomocou funkcieIsWin<strong>do</strong>wVisible(). Keby sme tak neurobili, dôjde k chybe.BASIC ELEMENTS. Ako som u v úvode spomenul, základnými GUI prvkami vo WTLsú CommandBar, ToolBar, ReBar a StatusBar (pozri obrázok 2). Všetky tieto prvky sa dajúpomocou ATL/WTL AppWizarda prida <strong>do</strong> vašej aplikácie (pozri prvú èas – PCR è. 4/2003– obrázok 4). CommandBar vyzerá rov<strong>na</strong>ko ako menu Win<strong>do</strong>ws s bitmapovými obrázka−mi pri jednotlivých polokách. Pouitie triedy CCommandBarCtrl vo vašom WM_CREATEmôe by takéto:LRESULT CMainFrame::OnCreate(UINT, WPARAM, LPARAM, BOOL&){// m_CmdBar is of type CCommandBarCtrl, defined in AtlCtrlw.hHWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault,0, ATL_SIMPLE_CMDBAR_PANE_STYLE);// Let command bar replace the current menum_CmdBar.AttachMenu(GetMenu());m_CmdBar.LoadImages(IDR_MAINFRAME);SetMenu(NULL);// First create a simple toolbarHWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,IDR_MAINFRAME,FALSE,ATL_SIMPLE_TOOLBAR_PANE_STYLE);// Set m_hWndToolBar memberCreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);// Add a band to the rebar represented by m_hWndToolBarAddSimpleReBarBand(hWndCmdBar);// Add another band to the m_hWndToolBar rebarAddSimpleReBarBand(hWndToolBar, NULL, TRUE);// Create the usual statusbarCreateSimpleStatusBar();return 0;}CCommandBarCtrl je trieda WTL, ktorá zapuzdruje funkcio<strong>na</strong>litu komponentu Com−mandBar. Trieda CCommandBarCtrl dedí z <strong>na</strong>dradenej triedy CCommandBarCtrlImpl. K dis−pozícii máte <strong>na</strong>sledujúci zoz<strong>na</strong>m metód:CCOMMANDBARCTRLIMPL METHODSpublic:CCommandBarCtrlImpl() //constructor~CCommandBarCtrlImpl() //destructor AtribútyDWORD GetCommandBarExtendedStyle() constDWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)CMenuHandle GetMenu() constCOLORREF GetImageMaskColor() constCOLORREF SetImageMaskColor(COLORREF clrMask)bool GetImagesVisible() constbool SetImagesVisible(bool bVisible)void GetImageSize(SIZE& size) constbool SetImageSize(SIZE& size)HWND GetCmdBar() const MetódyHWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWin<strong>do</strong>wName = NULL,DWORD dwStyle = 0, DWORD dwExStyle = 0,UINT nID = 0, LPVOID lpCreateParam = NULL)BOOL AttachToWin<strong>do</strong>w(HWND hWnd)BOOL LoadMenu(_U_STRINGorID menu)BOOL AttachMenu(HMENU hMenu)BOOL LoadImages(_U_STRINGorID image)BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap =NULL, int nMapSize = 0)BOOL _LoadImagesHelper(_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCO−LORMAP lpColorMap = NULL, int nMapSize = 0)BOOL AddBitmap(_U_STRINGorID bitmap, int nCommandID)BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)BOOL AddIcon(HICON hIcon, UINT nCommandID)BOOL ReplaceBitmap(_U_STRINGorID bitmap, int nCommandID)118 PC REVUE 7/2003

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!