Lập trình windows với MFC Micrisoft visual C++6.0- P5
lượt xem 33
download
Từ các lớp này, MFC xác lập nền tảng hình thành ứng dụng của windows, bao gồm việc định nghĩa bộ khung ứng dụng, các công cụ chuẩn và phổ biến để bổ sung vào bộ khung nói trên nhằm tạo ra ứng dụng hoàn chỉnh.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Lập trình windows với MFC Micrisoft visual C++6.0- P5
- Haønh vi OnCreate cuûa CEmpWnd thöïc hieän caùc chuaån bò nhö sau: { if (CWnd::OnCreate(lpCreateStruct) == -1) int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct ) return -1; { // TODO: Add your specialized creation code here if (CWnd::OnCreate(lpCreateStruct) == -1) SetTimer( IDD_TIMER, 250, NULL ); return -1; m_myPict.LoadBitmap( IDB_MYPICT ); // TODO: Add your specialized creation code here // Animation objects by EX10 SetTimer(IDD_TIMER, 250, NULL); m_butterBmp.LoadBitmap( IDB_ANIMATION ); m_mypict.LoadBitmap(IDB_MYPICT); m_butterDC.CreateCompatibleDC( NULL ); // animation object by EX10 m_butterOldBmp = butterDC.SelectObject( &m_butterBmp ); m_butterImg.Create(IDB_ANIMATION,32,4,RGB(255,255,255)); m_pictNo = 0; m_pictNo = 0; return 0; return 0; } } Haønh vi OnPaint veõ hình vaø töï taêng vò trí choïn hình cho laàn veõ sau ñoù: Haønh vi OnPaint söû duïng haønh vi Draw cuûa m_butterImg veõ aûnh: memDrawDC.StretchBlt( 20, 50, 32, 28, &m_butterDC, m_butterImg.Draw( &memDrawDC, m_pictNo, CPoint(30, 170), m_pictNo*32 , 0 , 32 , 28 , SRCCOPY ); ILD_NORMAL); // Choïn aûnh keá tieáp m_pictNo++; m_pictNo++; if (m_pictNo >= 4) m_pictNo = 0; if (m_pictNo >= 4) m_pictNo = 0; Haønh vi OnDestroy huûy boû caùc thuoäc tính GDI: Haønh vi OnDestroy huûy boû ñoái töôïng CImageList: m_butterDC.SelectObject(m_butterOldBmp); m_butterImg.DeleteImageList(); m_butterBmp.DeleteObject(); m_butterDC.DeleteDC(); 6.7 CRgn – CÖÛA SOÅ COÙ HÌNH DAÏNG TUØY YÙ: Nhaän xeùt: Phaàn neàn cuûa aûnh hoaït hình che khuaát aûnh neàn. Ñeå khaéc Khuoân daïng cuûa region coù theå duøng laøm khuoân daïng cuûa cöûa soå thoâng qua phuïc ta söû duïng moät aûnh bitmap laøm maët naï cho aûnh hoaït hình ñeå aán haønh vi SetWindowRgn cuûa ñoái töôïng cöûa soå. Phaàn sau ñaây minh hoïa cho vaán ñònh phaàn noäi dung ñöôïc veõ treân aûnh hoaït hình. ñeà treân vaø ñöôïc caøi ñaët trong haønh vi OnCreate cuûa cöûa soå (VD12). Haønh vi MaskBlt cuûa CDC cho pheùp duøng monochrome bitmap laøm löôùi CRgn newShape; loïc aûnh ñieåm phaàn noåi cuûa aûnh khi cheùp aûnh töø DC nguoàn leân DC ñích newShape.CreateEllipticRgn( 0, 0, 200, 100 ); (95/98/Me unsupported). Baïn haõy thöû thöïc hieän vôùi VD10 nhö baøi taäp. SetWindowRgn( newShape, TRUE ); 6.6 CImageList - COÂNG CUÏ QUAÛN LYÙ BOÄ AÛNH CUØNG CÔÕ: THÖÏC HAØNH: Xaây döïng döï aùn VD11 treân cô sôû caûi tieán VD10; boä aûnh hoaït hình seõ ñöôïc 1. Vieát öùng duïng vôùi cöûa soå giao dieän chính coù hình tam giaùc. quaûn lyù bôûi ñoái töôïng CImageList: 2. Vieát öùng duïng vôùi cöûa soå giao dieän chính coù hình ngoâi sao naêm caùnh. Taïo döï aùn VD11 töông töï döï aùn VD10. 3. Vieát öùng duïng hieån thò noäi dung cuûa nhieàu aûnh theo thöù töï luaân phieân. Söï Boå sung ñoái töôïng thuoäc tính m_butterImg kieåu CImageList laøm nhieäm chuyeån tieáp giöõa hai aûnh baát kyø ñöôïc thöïc hieän baèng kyõ thuaät pha troän aûnh. vuï quaûn lyù caùc aûnh. Xoùa caùc thuoäc tính m_butterBmp, m_butterDC vaø 4. Vieát öùng duïng hieån thò aûnh cuoän (scroll) töø traùi sang phaûi. m_butterOldBmp vì khoâng coøn caàn thieát. Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com ÖÙng duïng coâng cuï GDI 66 67
- 5. Vieát öùng duïng hieån thò aûnh zoom töø beù ñeán lôùn vaø ngöôïc laïi. 6. Vieát öùng duïng hieån thò moät doøng chöõ baát kyø theo hình aûnh cuoän (scroll). 7. Vieát öùng duïng vôùi hình aûnh chuù böôùm bay thô thaån trong vuøng client. 8. Vieát öùng duïng ScreenSaver vaø söû duïng noù cho maùy tính cuûa baïn. 9. Vieát öùng duïng vôùi maøn hình chính chöùa caùc doøng chöõ troâi töø ñaùy leân ñænh maøn hình, lieân tuïc ñeán khi keát thuùc öùng duïng. HD: Taïo DC aûo vaø vieát caùc doøng chöõ leân DC naøy. Sau ñoù cheùp phaàn noäi dung thích hôïp cuûa DC aûo sang DC thöïc. - Chieàu roäng DC aûo baèng chieàu roäng DC thöïc. Chieàu cao DC aûo baèng chieàu cao DC thöïc + 2 laàn chieàu cao moät doøng chöõ treân DC. - Vieát caùc doøng chöõ hôïp leä (toïa ñoä hieån thò naèm trong giôùi haïn DC aûo) leân DC aûo. Sau moãi laàn hieån thò, tònh tieán vò trí veõ leân phía treân moät ñoaïn tuøy yù, neáu vò trí tònh tieán laøm taát caû caùc doøng chöõ rôi ra ngoaøi DC aûo thì aán ñònh laïi vò trí aáy ôû cuoái DC aûo. 10. Chænh söûa baøi taäp 9 nhö sau: - Hieån thò caùc doøng chöõ vôùi ñoä saùng giaûm daàn töø doøng döôùi leân doøng treân ñeå taïo hieäu öùng 3 chieàu. - Taùc vuï cheùp söû duïng haøm StretchBlt treân töøng doøng pixel ñeå aûnh xaï aûnh chöõ nhaät töø DC aûo thaønh aûnh tam giaùc caân treân DC thöïc. Keát quaû nhaän ñöôïc laø hình aûnh troâi caùc doøng chöõ theo chieàu thöù 3. 11. Vieát öùng duïng vôùi maøn hình chính hieån thò "thieân thaïch vuõ truï". HD: Moãi ‘thieân thaïch’ ñöôïc quaûn lyù baèng toïa ñoä 3 giaù trò (x, y, z). - Toïa ñoä z tieán daàn veà phía ngöôøi duøng sau moãi laàn hieån thò. - Toïa ñoä x, y töông öùng thay ñoåi theo z: x = Hoaønh ñoä taâm vuøng Client + x * 100 / z; y = Tung ñoä taâm vuøng Client + y * 100 / z; - Ñoä saùng phuï thuoäc vaøo z. - Duøng haønh vi Circle cuûa DC ñeå veõ caùc ‘thieân thaïch’. 12. Keát hôïp hai baøi taäp 10 vaø 11 ñeå coù moät öùng duïng vôùi maøn hình chính nhö maøn hình StarWar. 13. Duøng lôùp ñoái tuôïng CTime cuûa MFC ñeå laáy giôø hieän haønh cuûa heä thoáng. Thöïc hieän öùng duïng hieån thò moät chieác ñoàng hoà analog (ñoàng hoà kim) chaïy theo thôøi gian. Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 68
- CHÖÔNG 7: MENU & PHÍM TAÉT 7.1 ÑÒNH NGHÓA: Menu laø heä thoáng caùc muïc choïn töông öùng vôùi caùc xöû lyù xaùc ñònh. Thoâng qua menu, ngöôøi duøng coù theå deã daøng aán ñònh thöïc hieän xöû lyù mong muoán. Xem moät öùng duïng vôùi heä thoáng menu nhö sau: - Caption: Noäi dung thoâng baùo. & duøng ñaët tröôùc kyù töï phím taét. - Ñaùnh daáu choïn muïc Pop-up. Cuoái cuøng, goõ Enter keát thuùc. • Caøi ñaët muïc leänh: Thöïc hieän töông töï nhö treân nhöng phaàn aán ñònh trong hoäp Menu Item Properties nhö sau: - Game vaø Exit laø caùc muïc choïn cuûa menu bar. - Muïc choïn Game gaén vôùi moät menu popup coù ba muïc choïn: Start, Option, About vaø daáu ngaên caùch muïc (separator). - Prompt: Noäi dung giaûi thích (ñöôïc hieån thò treân StatusBar) vaø noäi dung giaûi thích vaén taét (Tiptext treân thanh coâng cuï). Giöõa hai noäi 7.2 MENU RESOURCE: dung naøy ñöôïc ngaên caùch baèng kyù töï \n. Ñeå tieän vieäc söû duïng vaø chænh söûa menu trong chöông trình, VC cho pheùp - ID: Soá hieäu cuûa muïc choïn (menu-ID). Neân ñaët teân gôïi nhôù. soaïn thaûo vaø löu caáu truùc menu vaøo resource cuûa öùng duïng moät caùch ñoäc laäp, • Caøi ñaët daáu ngaên caùch: Thöïc hieän töông töï nhö treân. Ñaùnh daáu choïn phaàn chöông trình seõ duøng caùc leänh caàn thieát ñeå naïp vaø söû duïng menu. Separator trong hoäp Menu Item Properties. Caùch taïo menu trong resource: • Cheøn muïc vaøo giöõa caùc muïc choïn ñaõ coù: Ñöa veät saùng ñeán vò trí Taïo môùi menu resource: Thöïc hieän töông töï vieäc taïo môùi icon (2.8). cheøn, sau ñoù nhaán phím Insert. Löu yù: Choïn Resource Type laø Menu. • Xoùa muïc caøi ñaët: Ñöa veät saùng ñeán vò trí xoùa, goõ phím Delete. Ñaët soá hieäu cho menu (ví duï IDR_MAINFRAME vôùi menu chính). Thieát keá menu thoâng qua maøn hình thieát keá maø ta vöøa nhaän ñöôïc töø Taïo môùi döï aùn VD13 nhö VD12, sau ñoù thieát keá menu resource vôùi soá böôùc treân. Caùc thao taùc cô baûn nhö sau: hieäu IDR_MAINFRAME. Soá hieäu caùc muïc choïn laàn löôït laø: • Caøi ñaët muïc popup: Double-click (hoaëc goõ phím - Start = ID_GAME_START Enter) treân vò trí döï ñònh caøi ñaët muïc popup: - Option = ID_GAME_OPTION Ta nhaän ñöôïc hoäp hoäi thoaïi Menu Item Properties: - About = ID_GAME_ABOUT - Exit = ID_EXIT Menu & Phím taét Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 69 70
- 7.3 SÖÛ DUÏNG MENU RESOURCE: 7.4 MUÏC XÖÛ LYÙ COMMAND MESSAGE TÖØ MUÏC CHOÏN CUÛA MENU: Menu resource laø cô sôû khôûi taïo heä thoáng menu duøng trong öùng duïng. Heä Ñeå muïc choïn cuûa menu coù yù nghóa söû duïng ta phaûi caøi xöû lyù cho chuùng. thoáng menu coù theå ñöôïc gaén vaøo cöûa soå giao dieän ñeå tieän söû duïng. Quaù trình Khi ngöôøi duøng choïn moät muïc treân menu, heä thoáng laäp töùc göûi WM_COMMAND ñeán öùng duïng vôùi tham soá wParam chöùa soá hieäu (ID) cuûa naøy ñöôïc thöïc hieän thoâng qua caùc böôùc sau: Naïp menu resource vaøo boä nhôù: muïc menu ñöôïc choïn. Baát cöù ñoái töôïng naøo trong öùng duïng coù chöùc naêng xöû HMENU LoadMenu ( lyù mesage ñeàu coù theå ñaûm nhaän vieäc xöû lyù caùc message naøy. HINSTANCE hInstance, // Handle cuûa öùng duïng Tieáp theo, ta xaây döïng öùng duïng vôùi heä thoáng menu nhö VD13. Muïc choïn LPCTSTR lpMenuName // Chuoãi teân resource cuûa menu About hieån thò hoäp thoâng baùo giôùi thieäu taùc giaû vaø saûn phaåm. ); Haøm traû veà handle cuûa menu trong boä nhôù. Taïo döï aùn VD14 nhö VD13. - Giaù trò handle cuûa öùng duïng nhaän ñöôïc töø haøm sau: Duøng lôùp CEmpWnd caøi ñaët HINSTANCE AfxGetInstanceHandle( ); muïc xöû lyù message: - Moãi ñoái töôïng trong resource ñöôïc nhaän dieän baèng moät soá hieäu hoaëc - Trong maøn hình Workspace, chuoãi teân. Haøm sau ñaây giuùp chuyeån soá hieäu cuûa ñoái töôïng resource choïn ClassView. Right-click sang chuoãi teân töông öùng: treân tieâu ñeà lôùp CEmpWnd: LPTSTR MAKEINTRESOURCE( UINT resourceID ); - Choïn Add Windows Message Handler... Gaén menu vôùi cöûa soå giao dieän: Duøng handle cuûa menu laøm tham soá cho haønh vi khôûi taïo thoâng soá CreateEx cuûa ñoái töôïng cöûa soå. Haønh vi InitInstance cuûa ñoái töôïng quaûn lyù öùng duïng ñaûm nhaän vieäc naøy: BOOL CEmpApp::InitInstance() { CEmpWnd *main = new CEmpWnd; HICON myIcon = LoadIcon(IDR_MAINFRAME); HCURSOR myCursor = LoadCursor(IDC_MAINFRAME); CBrush myBrush; CString myClassName = "Emp.WndClassName"; myBrush.CreateSolidBrush(RGB(190, 190, 0)); m_pMainWnd = main; main->CreateEx( WS_EX_TOPMOST, AfxRegisterWndClass( CS_VREDRAW | CS_HREDRAW, myCursor, myBrush, myIcon ), _T("Emp.Example 13"), WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX | WS_THICKFRAME, 100, 100, 300, 200, NULL, LoadMenu( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDR_MAINFRAME )) ); main->ShowWindow(SW_SHOW); - Choïn soá hieäu ID_GAME_ABOUT, click choïn COMMAND. Sau ñoù return TRUE; } // Xem VD13 (heä thoáng menu chöa coù xöû lyù) choïn muïc Add and Edit. Menu & Phím taét Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 71 72
- - ID : Soá hieäu muïc menu söû duïng phím taét. - Key : Phím taét. - Modifier : Caùc phím heä thoáng phoái hôïp. - Type : ASCII Phím kyù töï ; VirtKey Phím baát kyø. Sau khi aán ñònh xong goõ phím Enter. • Chænh söûa ñònh nghóa phím taét: Double-click treân doøng phím taét, ñieàu chænh caùc thoâng tin caàn thieát. Goõ phím Enter ñeå keát thuùc. - Ñaët teân haønh vi xöû lyù message WM_COMMAND. Choïn OK. • Xoùa ñònh nghóa phím taét: Choïn doøng ñònh nghóa phím, goõ phím Del. - Noäi dung caøi ñaët cuûa haønh vi naøy nhö sau: Löu noäi dung baûng phím taét vaø ñoùng maøn hình soaïn thaûo phím taét. Söû duïng phím taét trong chöông trình: Thöïc hieän tuaàn töï hai böôùc sau: void CEmpWnd::OnGameAbout() • Naïp baûng phím taét vaøo boä nhôù: { HACCEL LoadAccelerators ( MessageBox( "The program was written by Mr.EMP\n" HINSTANCE hInstance, // Handle cuûa öùng duïng "This product is a not-licensed one.", LPCTSTR lpTableName // Chuoãi teân resource "About", MB_OK | MB_ICONINFORMATION ); ); Haøm traû veà handle cuûa baûng phím taét trong boä nhôù. } • Dòch phím taét treân message nhaän ñöôïc töø haøng chôø cuûa öùng duïng: Xem baûng MessageMap cuûa lôùp CEmpWnd, muïc ID_GAME_ABOUT ? int TranslateAccelerator ( HWND hWnd, // Handle cöûa soå giao dieän duøng phím taét 7.5 PHÍM TAÉT (HOT KEY) CHO MUÏC CHOÏN TREÂN MENU: HACCEL hAccTable, // Handle cuûa baûng phím taét Phím taét laø toå hôïp phím cho pheùp thöïc hieän nhanh moät muïc choïn xaùc ñònh LPMSG lpMsg // Con troû bieán chöùa message ñieàu phoái treân heä thoáng menu. Caùc phím taét ñöôïc ñònh nghóa trong phaàn resource cuûa ); Haøm naøy phaûi ñöôïc thöïc hieän treân taát caû caùc message maø öùng öùng duïng. Chöông trình seõ duøng leänh ñeå naïp baûng phím taét khi caàn. duïng nhaän ñöôïc. Do ñoù, noù ñöôïc loàng vaøo voøng laëp MessageLoop Trong phaàn naøy, ta vieát öùng duïng töông töï VD14 vôùi caùc phím taét Ctrl+S, cuûa öùng duïng. Lôùp CWinThread (xem 2.4) cho pheùp caøi ñaët ñaëc tính Ctrl+P, Ctrl+A vaø Ctrl+E cho caùc muïc menu: Start, Option, About vaø Exit. naøy thoâng qua haønh vi sau cuûa lôùp: Taïo döï aùn VD15 töông töï VD14. BOOL CWinThread::PreTranslateMessage( MSG *pMsg ); Taïo môùi baûng phím taét trong resource (Accelerator resource): Thöïc Trong caùc lôùp keá thöøa CWinThread, caøi ñaët naøy coù boá cuïc nhö sau: hieän töông töï vieäc taïo môùi icon (2.8). Resource Type = Accelerator. Ñaët soá hieäu cho Accelerator ( giaû söû laø IDR_MAINFRAME ). BOOL CEmpApp::PreTranslateMessage (MSG *pMsg) Thieát keá baûng phím taét. Caùc thao taùc cô baûn nhö sau: { // CEmpApp laø lôùp keá thöøa CWinApp (töø CWinThread) • Boå sung ñònh nghóa phím taét: Double-click treân doøng roãng: // Thöïc hieän haøm dòch treân message nhaän ñöôïc. TranslateAccelerator( m_pMainWnd->m_hWnd, m_hAccel, pMsg ); // m_hAccel : Handle cuûa baûng phím taét. return CWinApp::PreTranslateMessage( pMsg ); } • AÙp duïng cho döï aùn VD15: Boå sung moät soá thuoäc tính vaø haønh vi cho lôùp CEmpApp: Menu & Phím taét Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 73 74
- - Thuoäc tính m_hAccel kieåu HACCEL löu handle baûng phím taét. UINT nCheck // Caùch thöùc ñaùnh daáu muïc choïn - Haønh vi InitInstance: Boå sung leänh naïp baûng phím taét vaø giöõ giaù ); Ñaùnh daáu hoaëc huûy boû ñaùnh daáu muïc choïn treân menu. trò handle cuûa noù vaøo bieán m_hAccel ñeå söû duïng sau naøy: nCheck laø giaù trò keát hôïp cuûa hai noäi dung: - Caùch ñaùnh daáu muïc: = MF_CHECKED : Ñaùnh daáu m_hAccel = LoadAccelerators( AfxGetInstanceHandle(), = MF_UNCHECKED : Boû ñaùnh daáu MAKEINTRESOURCE( IDR_MAINFRAME ) ); - Caùch chæ ñònh muïc: = MF_BYPOSITION : Theo vò trí - Haønh vi keá thöøa PreTranslateMessage coù caøi ñaët nhö treân. = MF_BYCOMMAND : Theo soá hieäu muïc nIDCheckItem töông öùng chöùa soá hieäu hoaëc vò trí cuûa muïc choïn. 7.6 LÔÙP QUAÛN LYÙ MENU - CMenu: Ñeå tieän thao taùc treân menu, MFC cung caáp lôùp ñoái töôïng CMenu cho pheùp UINT EnableMenuItem ( UINT nIDEnableItem, quaûn lyù menu thoâng qua caùc thuoäc tính vaø haønh vi ñaëc tröng sau: // Soá hieäu | vò trí muïc choïn (nhö treân) UINT nEnable CMenu( ); Haønh vi taïo laäp ñoái töôïng menu. // Caùch thöùc aán ñònh muïc choïn. BOOL LoadMenu( UINT nIDResource ); Khôûi taïo thoâng soá cho ñoái ); Caám hoaëc cho pheùp muïc choïn hoaït ñoäng. nIDEnableItem laø giaù trò keát hôïp cuûa hai noäi dung: töôïng menu töø menu resource. - Caùch ñònh vò muïc choïn: Nhö treân. BOOL DestroyMenu( ); Huûy boû ñoái töôïng menu. BOOL DeleteMenu( UINT nPosition, UINT nFlags ); Xoùa moät muïc - Traïng thaùi muïc: = MF_ENABLED : Cho pheùp muïc hoaït ñoäng. choïn trong menu. Boä giaù trò (nPosition, nFlags) xaùc ñònh muïc choïn. = MF_DISABLED : Caám muïc hoaït ñoäng. nFlags = MF_BYCOMMAND : nPosition laø soá hieäu cuûa muïc choïn = MF_GRAYED : Che môø muïc choïn. (menu-ID). int GetMenuString ( = MF_BYPOSITION : nPosition laø vò trí thöù töï cuûa muïc UINT nIDItem, // Soá hieäu muïc choïn CString& rString, choïn (ñeám töø 0). // Tham bieán nhaän keát quaû UINT nFlags BOOL AppendMenu ( // Caùch ñònh vò muïc choïn UINT nFlags, // Ñaëc ñieåm muïc choïn ); Laáy noäi dung thoâng baùo cuûa moät muïc choïn. UINT nIDNewItem = 0, // Soá hieäu muïc choïn BOOL ModifyMenu ( LPCTSTR lpszNewItem=NULL UINT nPosition, // Chuoãi thoâng baùo cuûa muïc // Soá hieäu | vò trí cuûa muïc choïn UINT nFlags, ); Theâm muïc choïn vaøo cuoái heä thoáng menu. // Caùch ñònh vò muïc choïn nFlags = MF_SEPARATOR : Caùc tham soá khaùc khoâng coù yù nghóa. UINT nIDNewItem = 0, // Soá hieäu | vi trí môùi cuûa muïc choïn LPCTSTR lpszNewItem = NULL // Thoâng baùo môùi cuûa muïc choïn = MF_STRING : Caùc thoâng soá ñöôïc hieåu nhö treân. = MF_POPUP : nIDNewItem laø handle cuûa menu popup. ); Thay ñoåi caùc thoâng soá lieân quan ñeán muïc choïn. BOOL InsertMenu ( Löu yù: Haønh vi GetMenu cuûa CWnd traû veà con troû ñeán ñoái töôïng menu UINT nPosition, // Vò trí ñöôïc cheøn. gaén vôùi cöûa soå. Giaù trò traû veà = NULL neáu cöûa soå khoâng gaén vôùi menu naøo. UINT nFlags, // Caùc thoâng tin khaùc Giaû söû coù yeâu caàu vieát öùng duïng VD16 töông töï VD15; trong ñoù muïc choïn UINT nIDNewItem = 0, // töông töï AppendMenu(). Start töï ñoäng chuyeån thaønh Stop vaø ngöôïc laïi moãi khi ngöôøi duøng choïn LPCTSTR lpszNewItem = NULL muïc naøy. Coâng vieäc treân ñöôïc thöïc hieän thoâng qua muïc xöû lyù command ); Cheøn theâm muïc choïn vaøo tröôùc muïc ñöôïc chæ bôûi nPosition. message ID_GAME_START. Baïn haõy thöû thöïc hieän öùng duïng naøy (xem UINT CheckMenuItem ( VD16). UINT nIDCheckItem, // Soá hieäu | vò trí muïc choïn 7.7 XÖÛ LYÙ ÑIEÀU KHIEÅN MUÏC CHOÏN CUÛA MENU: Menu & Phím taét Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com 75 76
- Trong phaàn naøy, ta xaây döïng öùng duïng nhö VD16. Khi choïn muïc Start (Star Stop), öùng duïng khoâng cho pheùp ngöôøi duøng choïn muïc Option. Caùch thöù nhaát: Caøi ñaët xöû lyù cho muïc choïn Start ( Stop ) ñeå thöïc hieän caám hoaëc cho pheùp muïc choïn Option moät caùch phuø hôïp. Caùch thöù hai: Duøng traïng thaùi hieän haønh cuûa muïc choïn Start ñeå quyeát ñònh cho pheùp hay caám hoaït ñoäng cuûa muïc Option. Caùch laøm naøy döïa treân cô cheá xöû lyù ñieàu khieån ñoái töôïng phaùt sinh command message laø muïc Option. Thoâng tin traïng thaùi cuûa muïc Start ñöôïc löu trong thuoäc tính m_isStop. Thoâng qua giaù trò naøy, haønh vi xöû lyù ñieàu khieån choïn giaù trò tham soá thích hôïp duøng cho haønh vi Enable cuûa ñoái töôïng CCmdUI chæ bôûi con troû laøm tham soá; TRUE (cho pheùp) , FALSE (caám). Caùc böôùc thöïc hieän döï aùn theo caùch thöù hai nhö sau: Taïo döï aùn VD17 töông töï VD16. Chænh söûa lôùp CEmpWnd nhö sau: Boå sung thuoäc tính protected m_isStop kieåu BOOL cho lôùp CEmpWnd. Khoâng duøng bieán cuïc boä isStop nhö VD16, thay theá bieán naøy baèng m_isStop, chænh söûa caùc leänh lieân quan. Thoâng qua haønh vi OnCreate, gaùn giaù trò khôûi ñaàu cho m_isStop laø FALSE. Khai baùo xöû lyù ñieàu khieån cho muïc Option: Thöïc hieän töông töï muïc (7.4). Löu yù choïn soá hieäu muïc choïn ID_GAME_OPTION, sau ñoù choïn UPDATE_COMMAND_UI. Cuoái cuøng choïn Add and Edit. Ñaët teân cho haønh vi xöû lyù ñieàu khieån. Caøi ñaët cuûa haønh vi naøy nhö sau: void CEmpWnd::OnUpdateGameOption (CCmdUI* pCmdUI) { // pCmdUI con troû tham soá. pCmdUI->Enable( !m_isStop ); } THÖÏC HAØNH: 1. Töø VD15, boå sung haønh vi PreTranslateMessage vaø caøi ñaët xöû lyù söû duïng baûng phím taét cho lôùp CEmpWnd. 2. Caøi ñaët haønh vi xöû lyù muïc choïn thoaùt (Exit) cho lôùp CEmpWnd. HD: Ñeå chaám döùt öùng duïng, ta duøng haønh vi PostMessage maø CEmpWnd keá thöøa töø CWnd ñeå göûi WM_QUIT ñeán cöûa soå cuûa noù nhö sau: PostMessage( WM_QUIT, 0, 0 ); 3. Thöïc hieän yeâu caàu muïc (7.7) baèng caùch thöù nhaát. Menu & Phím taét 77
- UINT nID = 0xFFFF CHÖÔNG 8: // Soá hieäu muïc thoâng baùo, duy nhaát. ); Khôûi taïo thoâng soá cho ñoái töôïng muïc thoâng baùo. dwStyle: Phaûi chöùa caùc thoâng soá qui ñònh ñoái vôùi control: Caùc lôùp ñoái Töôïng nhaäp lieäu WS_CHILD | WS_VISIBLE [ | WS_DISABLED ] vaø caùc thoâng soá boå sung cho ñaëc tröng cuûa muïc nhö sau: Lôùp ñoái töôïng nhaäp lieäu, keá thöøa töø lôùp CWnd, cho pheùp quaûn lyù caùc muïc SS_BITMAP : Coù chöùc naêng hieån thò aûnh bitmap. nhaäp lieäu (controls) treân cöûa soå giao dieän. Cöûa soå chöùa caùc control goïi laø cöûa SS_ICON : Coù chöùc naêng hieån thò aûnh icon hoaëc cursor. soå cha. Hình aûnh sau laø moät cöûa soå cha vôùi moät soá loaïi control phoå bieán: SS_xxx : Moät soá thoâng soá khaùc, xem MSDN. Maøu neàn ñoái töôïng CStatic do MFC ñaêng kyù, muoán thay ñoåi phaûi xaây döïng lôùp keá thöøa CStatic, caøi ñaët haønh vi PreCreateWindow. HBITMAP SetBitmap ( HBITMAP hBitmap // Handle cuûa aûnh bitmap ); Duøng aûnh bitmap laøm noäi dung cuûa muïc thoâng baùo. HBITMAP GetBitmap ( ); Traû veà handle cuûa aûnh bitmap ñang duøng. HICON SetIcon ( HICON hIcon // Handle cuûa icon ); Duøng icon laøm noäi dung cuûa muïc thoâng baùo. HICON GetIcon( ); Traû veà handle cuûa icon ñang duøng. HCURSOR SetCursor ( HCURSOR hCursor // Handle cuûa cursor ); Choïn cursor cho muïc thoâng baùo. Windows laáy cursor naøy laøm hình daïng con chuoät khi noù di chuyeån vaøo vuøng giôùi haïn cuûa muïc. HCURSOR GetCursor( ); Traû veà handle cuûa cursor ñang duøng. Coù theå duøng haønh vi CreateEx (lôùp CStatic keá thöøa töø CWnd) khôûi taïo thoâng soá muïc thoâng baùo vôùi daïng môû roäng (WS_EX_xxx). Trong tröôøng hôïp naøy, giaù trò cho tham soá lpszClassName laø _T("STATIC"). Phaàn naøy, ta thöïc hieän öùng duïng VD18 töông töï VD15; caøi ñaët hai muïc thoâng baùo treân cöûa soå giao dieän chính: muïc thöù nhaát coù noäi dung "My Icon 8.1 CStatic: is", muïc thöù hai hieån thò icon cuûa öùng duïng. CStatic laø lôùp ñoái töôïng quaûn lyù muïc thoâng baùo hoaëc aûnh treân cöûa soå giao Duøng hai ñoái töôïng thuoäc lôùp CStatic ñeå taïo vaø quaûn lyù hai muïc thoâng dieän. Caùc thuoäc tính vaø haønh vi ñaëc tröng cuûa lôùp naøy nhö sau: baùo. Ñoái töôïng CEmpWnd laáy chuùng laøm thuoäc tính ñeå tieän quaûn lyù. CStatic( ); Taïo laäp ñoái töôïng roãng. Döï aùn ñöôïc thöïc hieän qua caùc böôùc sau: BOOL Create ( Taïo döï aùn VD18 töông töï VD15. Chænh söûa lôùp CEmpWnd nhö sau: LPCTSTR lpszText, // Noäi dung thoâng baùo cuûa muïc Boå sung hai ñoái töôïng thuoäc tính protected: m_staticIcon vaø DWORD dwStyle, // Thoâng soá daïng muïc thoâng baùo m_staticText coù kieåu CStatic. const RECT& rect, // Toïa ñoä, kích thöôùc cuûa muïc Haønh vi OnCreate thöïc hieän khôûi taïo thoâng soá cho hai ñoái töôïng naøy: CWnd* pParentWnd, // Con troû ñoái töôïng cöûa soå cha Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Caùc lôùp ñoái töôïng nhaäp lieäu 78 79
- void SetMargins ( int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) UINT nLeft, // Leà traùi vaø { UINT nRight // leà phaûi tính baèng pixel if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; ); AÁn ñònh bieân traùi vaø bieân phaûi cuûa hoäp nhaäp. m_staticText.Create( _T("This is my Icon:"), DWORD GetMargins( ); Traû veà giaù trò chöùa thoâng tin bieân traùi (WORD WS_CHILD|WS_VISIBLE, thaáp) vaø bieân phaûi (WORD cao) cuûa hoäp nhaäp. CRect(10, 15, 120, 35), this ); void GetSel ( m_staticIcon.Create( _T(""), int& nStartChar, // Bieán chöùa vò trí kyù töï ñaàu tieân vaø WS_CHILD | WS_VISIBLE | SS_ICON, int& nEndChar // kyù töï cuoái cuøng cuûa ñoaïn vaên baûn. CRect( 125,7,157,39 ), this ); ); Laáy thoâng tin veà ñoaïn vaên baûn ñang ñöôïc ñaùnh daáu trong hoäp nhaäp. m_staticIcon.SetIcon ( void SetSel ( AfxGetApp()->LoadIcon(IDR_MAINFRAME) ); int nStartChar, return 0; // Vò trí kyù töï ñaàu tieân } int nEndChar, // Vò trí kyù töï cuoái cuøng cuûa ñoaïn vaên baûn Bieân dòch vaø chaïy thöû öùng duïng. BOOL bNoScroll = FALSE ); Ñaùnh daáu moät ñoaïn vaên baûn trong hoäp nhaäp. 8.2 CEdit: BOOL SetReadOnly( BOOL bReadOnly = TRUE ); Xaùc laäp traïng thaùi CEdit laø lôùp ñoái töôïng quaûn lyù hoäp nhaäp treân cöûa soå giao dieän. Ngoaøi vieäc chæ xem ñoái vôùi döõ lieäu cuûa hoäp nhaäp. hoã trôï xöû lyù caùc hoaït ñoäng nhaäp lieäu, CEdit coù khaû naêng thoâng tin cho cöûa soå void Copy( ); Cheùp noäi dung ñoaïn vaên baûn ñang ñöôïc ñaùnh daáu trong cha cuûa hoäp nhaäp veà tình hình nhaäp lieäu ñang dieãn ra trong hoäp. hoäp nhaäp vaøo vuøng nhôù heä thoáng (clipboard). CEdit( ); Taïo laäp ñoái töôïng roãng. void Paste( ); Cheøn noäi dung vaên baûn trong clipboard vaøo hoäp nhaäp baét BOOL Create ( ñaàu töø vò trí ñang choïn (hoaëc vò trí daáu carret). DWORD dwStyle, // Thoâng soá daïng hoäp nhaäp void Clear( ); Xoùa noäi dung ñoaïn vaên baûn ñang ñöôïc ñaùnh daáu. const RECT& rect, // Toïa ñoä vaø kích thöôùc hoäp nhaäp void Cut( ); Thöïc hieän caùc thao taùc Copy vaø Clear. CWnd* pParentWnd, // Con troû ñoái töôïng cöûa soå cha void SetPasswordChar ( UINT nID // Soá hieäu hoäp nhaäp, phaûi duy nhaát TCHAR ch // Kyù töï ñöôïc choïn ); Khôûi taïo thoâng soá cho ñoái töôïng hoäp nhaäp lieäu. ); Ñaët kyù töï ‘che’ cho noäi dung cuûa password trong hoäp nhaäp. dwStyle: Goàm thoâng soá qui ñònh ñoái vôùi control vaø caùc daïng boå sung: int GetLineCount( ); Traû veà soá doøng vaên baûn trong hoäp nhaäp. ES_MULTILINE : Hoäp nhaäp cho pheùp nhieàu doøng. int GetLine ( ES_PASSWORD : Hoäp nhaäp duøng nhaäp password. int nIndex, // Chæ soá doøng vaên baûn trong hoäp nhaäp ES_READONLY : Hoäp nhaäp chæ xem noäi dung. LPTSTR lpszBuffer, // Vuøng ñeäm chöùa keát quaû ES_xxx : Xem thoâng tin trong MSDN. int nMaxLength // Chieàu daøi vuøng ñeäm void GetRect ( ); Laáy noäi dung moät doøng vaên baûn trong hoäp nhaäp. LPRECT lpRect // Con troû ñeán bieán RECT chöùa keát quaû int GetFirstVisibleLine( ); Traû veà chæ soá doøng vaên baûn ñöôïc nhìn thaáy ); Laáy thoâng tin veà toïa ñoä, kích thöôùc hoäp nhaäp. ñaàu tieân trong hoäp. Caùc doøng ôû tröôùc doøng naøy trong noäi dung vaên baûn BOOL GetModify( ); Traû veà TRUE neáu noäi dung hoäp nhaäp thay ñoåi. laø bò che khuaát. void SetModify( BOOL bModified = TRUE ); Xaùc laäp hoaëc xoùa côø hieäu ghi nhaän söï thay ñoåi noäi dung trong hoäp nhaäp. Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Caùc lôùp ñoái töôïng nhaäp lieäu 80 81
- int LineFromChar ( Thöïc haønh 1: Vieát öùng duïng vôùi muïc thoâng baùo "Enter your name:" vaø hoäp int nIndex = -1 // Chæ soá kyù töï. –1 laø kyù töï cuoái cuøng. nhaäp döõ lieäu beân caïnh treân maøn hình giao dieän chính. ); Traû veà chæ soá doøng vaên baûn chöùa kyù töï (Hoäp nhaäp coù nhieàu doøng). Taïo döï aùn VD19 töông töï VD18. Chænh söûa CEmpWnd nhö sau: Boå sung hai thuoäc tính protected: m_staticName kieåu CStatic vaø int LineIndex ( int nLine = -1 m_editName kieåu CEdit. // Chæ soá doøng vaên baûn, -1 laø doøng cuoái cuøng ); Traû veà chæ soá cuûa kyù töï ñaàu tieân trong doøng vaên baûn laøm tham soá. Trong haønh vi OnCreate, thöïc hieän khôûi taïo hai ñoái töôïng naøy: int LineLength ( int CEmpWnd::OnCreate (LPCREATESTRUCT lpCreateStruct) int nLine = -1 // Chæ soá doøng. –1 laø doøng ñang chöùa carret. { ); Traû veà soá kyù töï trong noäi dung cuûa doøng vaên baûn. if (CWnd::OnCreate(lpCreateStruct) == -1) CPoint PosFromChar ( return -1; UINT nChar // Chæ soá kyù töï trong hoäp nhaäp m_staticName.Create( _T("Enter your name:" ), WS_CHILD | WS_VISIBLE, ); Traû veà toïa ñoä ñieåm ôû goùc traùi treân cuûa kyù töï. CRect(10, 75, 130, 95), this ); int CharFromPos ( m_editName.Create( WS_CHILD | WS_VISIBLE | WS_BORDER, CPoint pt // Toïa ñoä cuûa ñieåm CRect(135, 75, 280, 95), this, -1 ); ); Traû veà chæ soá cuûa kyù töï gaàn ñieåm ñang xeùt nhaát. return 0; void LineScroll ( } int nLines, // Soá doøng cuoän doïc, < 0 laø cuoän xuoáng. Thöïc haønh 2: Chænh söûa öùng duïng ñeå khi ngöôøi duøng söûa teân trong hoäp int nChars = 0 // Soá kyù töï cuoän ngang, < 0 laø cuoän traùi. nhaäp thì noäi dung naøy laäp töùc chuyeån leân laøm tieâu ñeà cuûa cöûa soå chính. ); Cuoän noäi dung vaên baûn ñang hieån thò trong hoäp nhaäp. HD: Cöûa soå cha coù haønh vi xöû lyù message thoâng baùo söï thay ñoåi döõ lieäu Hoäp nhaäp vaø cöûa soå cha: Ñoái töôïng hoäp nhaäp coù theå göûi message ñeán cöûa trong hoäp nhaäp thoâng qua muïc xöû lyù message ON_EN_CHANGE. soå cha ñeå thoâng baùo tình hình nhaäp lieäu trong hoäp. Cöûa soå cha ñònh höôùng Taïo döï aùn VD20 töông töï VD19, Chænh söûa lôùp CEmpWnd nhö sau: xöû lyù caùc message thoâng qua muïc xöû lyù message coù daïng nhö sau: Boå sung haønh vi xöû lyù: afx_msg void OnYourNameChange() ON_Notification ( ID, memberFxn ) void CEmpWnd::OnYourNameChange () Trong ñoù: - ID : Soá hieäu muïc ñoái töôïng edit { - memberFxn : Teân haønh vi xöû lyù message, khai baùo nhö sau: CString yourname; afx_msg void memberFxn( void ); m_editName.GetWindowText(yourname); ON_Notification coù theå laø moät trong caùc muïc xöû lyù cuï theå sau: SetWindowText(yourname); } Muïc xöû lyù message YÙ nghóa cuûa message ñöôïc xöû lyù ON_EN_CHANGE Noäi dung edit ñang thay ñoåi. Taïo môùi soá hieäu resource: IDC_YOURNAME, duøng giaù trò naøy laøm soá hieäu cho ñoái töôïng m_editName. Trong haønh vi OnCreate: ON_EN_HSCROLL Ngöôøi duøng click choïn thanh tröôït ngang. ON_EN_VSCROLL Ngöôøi duøng click choïn thanh tröôït doïc. int CEmpWnd::OnCreate ( LPCREATESTRUCT lpCreateStruct ) ON_EN_KILLFOCUS Edit chaám döùt hoaït ñoäng. { ON_EN_MAXTEXT Noäi dung vöôït quaù chieàu daøi cho pheùp. if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; ON_EN_SETFOCUS Edit baét ñaàu hoaït ñoäng. m_staticName.Create ( _T("Enter your name:"), WS_CHILD | WS_VISIBLE, ON_EN_UPDATE Döõ lieäu nhaäp ñang ñöôïc caäp nhaät cho edit. CRect( 10, 75, 130, 95 ), this ); Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Caùc lôùp ñoái töôïng nhaäp lieäu 82 83
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Lập trình windows với MFC Micrisoft visual C++6.0- P1
10 p | 273 | 96
-
Lập trình windows với MFC Micrisoft visual C++6.0- P2
10 p | 216 | 69
-
Lập trình windows với MFC Micrisoft visual C++6.0- P10
10 p | 165 | 46
-
Lập trình windows với MFC Micrisoft visual C++6.0- P3
10 p | 203 | 45
-
Lập trình windows với MFC Micrisoft visual C++6.0- P13
10 p | 161 | 40
-
Lập trình windows với MFC Micrisoft visual C++6.0- P9
10 p | 139 | 33
-
Lập trình windows với MFC Micrisoft visual C++6.0- P6
10 p | 157 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P4
10 p | 104 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P11
10 p | 123 | 30
-
Lập trình windows với MFC Micrisoft visual C++6.0- P8
10 p | 108 | 25
-
Lập trình windows với MFC Micrisoft visual C++6.0- P12
10 p | 144 | 22
-
Lập trình windows với MFC Micrisoft visual C++6.0- P7
10 p | 101 | 19
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn