Lập trình windows với MFC Micrisoft visual C++6.0- P10
lượt xem 46
download
Lập trình windows với MFC và MicroSoft Visual C++ 6.0 (VC) đạt được hiệu quả cao bởi không chỉ khai thác được phiên bản mới nhất của MFC mà còn nhận được
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- P10
- - Hoäp nhaäp giaù trò muïc MyName Edit IDC_WRITE_NAME Taskbar laø thanh coâng cuï ñaëc bieät cuûa öùng duïng desktop trong windows. - Hoäp nhaäp giaù trò muïc MyVer Edit IDC_WRITE_VERSION Noäi dung cuûa taskbar ñöôïc chia thaønh 4 thaønh phaàn chính: - Hoäp hieån thò muïc MyName - Start menu: Static IDC_READ_NAME Muïc kích hoaït heä thoáng menu caùc öùng duïng. - Hoäp hieån thò muïc MyVer - Quick Launch Bar: Danh muïc caùc öùng duïng thöôøng duøng. Static IDC_READ_VERSION - Nuùt choïn thöïc hieän ghi - Taskbar Buttons: Button IDC_WRITE Danh saùch caùc öùng duïng ñang chaïy. - Nuùt choïn thöïc hieän ñoïc - Status Area: Button IDC_READ Chöùa icon giao dieän cuûa caùc öùng duïng ñang chaïy. - Haønh vi OnWrite öùng vôùi nuùt IDC_WRITE löu giaù trò caùc muïc: ÖÙng duïng coù theå nhaän ñöôïc tín hieäu nhaäp cuûa ngöôøi duøng khi hoï duøng phím hoaëc chuoät taùc void CIniRegDlg::OnWrite() ñoäng leân icon cuûa öùng duïng treân status area. { Vieäc caøi ñaët hoaëc huûy boû icon giao dieän cuûa öùng duïng treân status area CWinApp* pApp = AfxGetApp(); ñuôïc thöïc hieän thoâng quan haøm sau: CString myName; BOOL Shell_NotifyIcon ( UINT myVer; DWORD dwMessage, // Taùc vuï thöïc hieän GetDlgItemText(IDC_WRITE_NAME, myName); PNOTIFYICONDATA lpdata // Caáu truùc chöùa thoâng soá lieân quan myVer = GetDlgItemInt(IDC_WRITE_VERSION); ); Traû veà giaù trò TRUE neáu taùc vuï thöïc hieän thaønh coâng. pApp->WriteProfileString("MY_TEST", "MyName", myName); pApp->WriteProfileInt("MY_TEST", "MyVer", myVer); dwMessage : AÁn ñònh taùc vuï thöïc hieän. } NIM_ADD : Taïo icon giao dieän cuûa öùng duïng treân status area. - Haønh vi OnRead öùng vôùi nuùt IDC_READ ñoïc giaù trò caùc muïc: NIM_MODIFY : Thay ñoåi thoâng soá lieân quan icon giao dieän. NIM_DELETE : Xoùa icon giao dieän cuûa öùng duïng treân status area. void CIniRegDlg::OnRead() lpdata : Ñòa chæ caáu truùc NOTIFYICONDATA chöùa caùc thoâng soá. { CWinApp* pApp = AfxGetApp(); Caùc tröôøng trong caáu truùc NOTIFYICONDATA coù yù nghóa nhö sau: CString myName; typedef struct _NOTIFYICONDATA { UINT myVer; DWORD cbSize; // Kích thuôùc caáu truùc myName = pApp->GetProfileString( "MY_TEST", HWND hWnd; // Handle cuûa cöûa soå xöû lyù message töø icon "MyName", "NoName" ); UINT uID; // Soá hieäu cuûa icon treân status area myVer = pApp->GetProfileInt( "MY_TEST", "MyVer", 0 ); UINT uFlags; // Qui ñònh caùc thoâng soá coù yù nghóa SetDlgItemText( IDC_READ_NAME, myName ); UINT uCallbackMessage; // Soá hieäu message cuûa icon göûi cöûa soå. SetDlgItemInt( IDC_READ_VERSION, myVer ); HICON hIcon; // Handle cuûa icon ñöôïc söû duïng } Bieân dòch vaø chaïy öùng duïng. TCHAR szTip[64]; // Noäi dung chuù thích cuûa icon giao dieän. } NOTIFYICONDATA, *PNOTIFYICONDATA; 12.3 VUØNG STATUS AREA TREÂN TASKBAR: uFlags : Qui ñònh tröôøng thoâng soá trong caáu truùc coù yù nghóa söû duïng. NIF_MESSAGE : Tröôøng uCallbackMessage ñöôïc söû duïng. : Tröôøng hIcon ñöôïc söû duïng. NIF_ICON : Tröôøng szTip ñöôïc söû duïng. NIF_TIP uCallbackMessage : Soá hieäu message seõ göûi traû veà töø icon giao dieän. 162 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 163
- Khi ngöôøi duøng taùc ñoäng leân icon giao dieän cuûa öùng duïng, heä thoáng göûi Caùc böôùc thöïc hieän döï aùn cuûa öùng duïng: moät message ñeán cöûa soå xöû lyù lieân quan icon vôùi noäi dung nhö sau: Duøng MFC Wizard taïo öùng duïng TaskbarIcon coù giao dieän laø dialog. - message : Soá hieäu message cuûa icon (trong uCallbackMessage). Thöïc hieän caùc boå sung sau ñaây cho lôùp dialog CTaskbarIconDlg: - wParam : Soá hieäu cuûa icon. - Môû dialog resource, caøi ñaët caùc control sau: - lParam - Hoäp thoâng baùo traïng thaùi icon Static : Chöùa caùc traïng thaùi cuûa chuoät hoaëc phím maø ngöôøi IDC_ICON_INFO - Nuùt thöïc hieän ñaët icon duøng ñaõ söû duïng ñeå taùc ñoäng leân icon giao dieän. Button IDC_ICON_SET - Nuùt thöïc hieän xoùa icon Haønh vi WindowProc cuûa cöûa soå xöû lyù lieân quan seõ tuøy nghi xöû lyù: Button IDC_ICON_REMOVE - Khai baùo thuoäc tính protected m_isIconShow kieåu luaän lyù, ñeå ghi LRESULT CTaskbarIconDlg::WindowProc ( UINT message, nhaän tình traïng ñaët icon; m_isIconShow = FALSE : icon chöa ñöôïc WPARAM wParam, LPARAM lParam ) ñaët, m_isIconShow = TRUE : icon ñaõ ñöôïc ñaët. { if ( message == Icon_uCallbackMessage ) { - Haønh vi OnInitDialog chuaån bò caùc thoâng soá: switch ( lParam ) { BOOL CTaskbarIconDlg::OnInitDialog() // Xöû lyù bieán coá phím / chuoät trong lParam … { } CDialog::OnInitDialog(); return 0 ; // Baét ñaàu, icon chöa ñöôïc ñaët. m_isIconShow = FALSE; } return TRUE; return CDialog::WindowProc(message, wParam, lParam); } } - Haønh vi OnIconSet öùng vôùi nuùt choïn IDC_ICON_SET thöïc hieän caøi Giaû söû caàn thöïc hieän öùng duïng nhö sau: icon giao dieän leân status area: void CTaskbarIconDlg::OnIconSet() { if ( m_isIconShow ) return; NOTIFYICONDATA dt; memset(&dt, 0, sizeof( NOTIFYICONDATA ) ); dt.cbSize = sizeof(NOTIFYICONDATA); dt.uID = 100; dt.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); dt.hWnd = this->GetSafeHwnd(); dt.uCallbackMessage = WM_USER + 10; dt.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; strcpy(dt.szTip,"Mr.Emp, hello world !"); if ( Shell_NotifyIcon( NIM_ADD, &dt ) ) // Ñaët icon thaønh coâng m_isIconShow = TRUE; - Set Icon: Caøi icon cuûa öùng duïng leân status area. } - Remove Icon: Xoùa icon cuûa öùng duïng khoûi status area. - Haønh vi OnIconRemove öùng vôùi nuùt choïn IDC_ICON_REMOVE - Hoäp thoâng baùo cho bieát caùc bieán coá nhaäp taùc ñoäng leân icon. thöïc hieän xoùa icon giao dieän khoûi status area: 164 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 165
- 12.4 ÖÙNG DUÏNG SCREEN SAVER: void CTaskbarIconDlg::OnIconRemove() ScreenSaver laø öùng duïng ñöôïc löu trong taäp tin chöông trình coù phaàn môû { roäng .SCR. Ñeå söû duïng öùng duïng ScreenSaver, ta cheùp taäp tin chöông trình if ( !m_isIconShow ) return; NOTIFYICONDATA dt; cuûa öùng duïng vaøo thö muïc heä thoáng, sau ñoù söû duïng chöùc naêng Desktop cuûa memset(&dt, 0, sizeof(NOTIFYICONDATA)); Control Panel (Desktop Properties) caøi ñaët öùng duïng ScreenSaver cho heä dt.cbSize = sizeof(NOTIFYICONDATA); thoáng thoâng qua trang Screen Saver: dt.uID = 100; dt.hWnd = this->GetSafeHwnd(); if ( Shell_NotifyIcon( NIM_DELETE, &dt ) ) // Xoùa icon thaønh coâng m_isIconShow = FALSE; } - Haønh vi WindowProc xöû lyù thoâng tin nhaäp taùc ñoäng leân icon: LRESULT CTaskbarIconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if ( message == WM_USER + 10 ) { // WM_USER + 10 : soá hieäu messge ñaêng kyù cho icon. // Xöû lyù caùc thao taùc baám nuùt chuoät (BT) cuûa ngöôøi duøng. switch (lParam) { case WM_MOUSEMOVE: SetDlgItemText(IDC_ICON_INFO, "Mouse moves!"); break; case WM_LBUTTONDOWN: SetDlgItemText(IDC_ICON_INFO, "Left BT down !"); break; case WM_LBUTTONUP: SetDlgItemText(IDC_ICON_INFO, "Left BT up !"); break; case WM_RBUTTONDOWN: SetDlgItemText(IDC_ICON_INFO, "Right BT down !"); break; case WM_RBUTTONUP: SetDlgItemText(IDC_ICON_INFO, "Right BT up !"); break; } Teân taäp tin chöông trình cuûa öùng duïng ScreenSaver ñöôïc duøng laøm teân return 0; ScreenSaver trong danh saùch löïa choïn caùc ScreenSaver. Neáu ta khai baùo } moät haèng chuoãi vôùi soá hieäu laø 1 trong StringTable resource cuûa öùng duïng return CDialog::WindowProc(message, wParam, lParam); thì noäi dung haèng chuoãi naøy (khoâng ñöôïc nhieàu hôn 64 kyù töï) ñöôïc duøng } laøm teân ScreenSaver trong danh saùch noùi treân. Bieân dòch vaø chaïy öùng duïng. 166 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 167
- (a) Chaïy minh hoïa tröïc tieáp ScreenSaver: Vuøng chaïy maãu laø cöûa soå con Khi khoaûng thôøi gian maø ngöôøi duøng ngöøng töông taùc vôùi heä thoáng vöôït quaù giaù trò aán ñònh Wait thì heä thoáng töï ñoäng thöïc hieän öùng duïng trong hoäp hoäi thoaïi Display Properties. Handle cuûa cöûa soå naøy laø moät ScreenSaver. giaù trò trong tham soá doøng leänh coù noäi dung nhö sau: "/p xxxx" 12.4.1 Ñaëc ñieåm: Trong ñoù: Khaùc vôùi caùc öùng duïng thoâng thöôøng khaùc, öùng duïng ScreenSaver phaûi coù - /p (hoaëc /P): Giaù trò phaûn aùnh tình huoáng thöïc hieän. khaû naêng öùng xöû khaùc nhau trong caùc tình huoáng khaùc nhau maø öùng duïng - xxxx : Caùc chöõ soá phaûn aùnh giaù trò handle cuûa cöûa soå con. ñöôïc thöïc hieän. Caùc tình huoáng thöïc hieän coù theå xaûy ra ñoái vôùi moät öùng duïng Caùch laáy giaù trò handle naøy töø tham soá doøng leänh nhö sau: ScreenSaver laø: // Bieán chöùa handle (a) Chaïy minh hoïa tröïc tieáp ScreenSaver trong maøn hình con cuûa hoäp hoäi HWND parent; thoaïi: Khi ngöôøi duøng click choïn öùng duïng ScreenSaver trong danh sscanf(m_lpCmdLine+3, "%d", &parent); ÔÛ cheá ñoä naøy, ScreenSaver ñöôïc thieát keá theo kieåu öùng duïng coù saùch caùc ScreenSaver cuûa hoäp hoäi thoaïi Display Properties / Screen maøn hình giao dieän chính laø cöûa soå vôùi noäi dung hoaït ñoäng nhö chaïy Saver. thöïc. Cöûa soå naøy ñöôïc loàng vaøo vò trí cuûa cöûa soå con noùi treân. (b) Thöïc hieän chöùc naêng aán ñònh thoâng soá cuûa ScreenSaver: Khi ngöôøi (b) Thöïc hieän chöùc naêng aán ñònh thoâng soá: Noäi dung tham soá doøng leänh duøng click choïn muïc Setting... sau khi ñaõ choïn öùng duïng ScreenSaver nhö sau: trong danh saùch caùc ScreenSaver. "/c xxxx" (c) Thöïc hieän chöùc naêng ñaët Password cuûa ScreenSaver: Khi ngöôøi duøng Trong ñoù: click choïn muïc Password Setting... sau khi ñaõ choïn öùng duïng - /c (hoaëc /C) : Giaù trò phaûn aùnh tình huoáng thöïc hieän. ScreenSaver trong danh saùch caùc ScreenSaver. Chæ söû duïng cho caùc - xxxx : Handle cuûa hoäp hoäi thoaïi (dialog). phieân baûn Win9x trôû veà tröôùc. ÔÛ cheá ñoä naøy, ScreenSaver ñöôïc thieát keá theo kieåu öùng duïng coù (d) Chaïy minh hoïa ScreenSaver trong maøn hình thöïc: Khi ngöôøi duøng maøn hình giao dieän chính laø dialog vôùi caùc muïc nhaäp cho pheùp ñieàu click choïn muïc Preview sau khi ñaõ choïn öùng duïng ScreenSaver trong chænh thoâng soá lieân quan ñeán caùch thöùc hoaït ñoäng cuûa ScreenSaver danh saùch caùc ScreenSaver. Cheá ñoä chaïy naøy töông töï cheá ñoä chaïy ôû cheá ñoä thöïc. Dialog giao dieän laø dialog khoùa (modal dialog) vaø ñoái thöïc nhaèm giuùp ngöôøi duøng hình dung ñöôïc hoaït ñoäng thöïc cuûa töôïng cöûa soå cha cuûa noù laø hoäp hoäi thoaïi noùi treân. ScreenSaver. (c) Thöïc hieän chöùc naêng ñaët Password: Noäi dung tham soá doøng leänh nhö (e) Chaïy ScreenSaver: Khi khoaûng thôøi gian maø heä thoáng ngöøng töông sau: taùc vôùi ngöôøi duøng lôùn hôn khoaûng thôøi gian chôø cho pheùp. Ñaây laø "/a xxxx" cheá ñoä chaïy thöïc cuûa ScreenSaver. Trong ñoù: 12.4.2 Tham soá doøng leänh (Command Line Parameters): - /a (hoaëc /A): Giaù trò nhaän dieän tình huoáng thöïc hieän. Moãi khi thöïc hieän öùng duïng ScreenSaver, heä thoáng cung caáp thoâng tin veà - xxxx : Handle cuûa cöûa soå hoäi thoaïi. tình huoáng cuï theå maø öùng duïng ñöôïc thöïc hieän thoâng qua noäi dung tham soá ÔÛ cheá ñoä naøy, ScreenSaver ñöôïc thieát keá theo kieåu öùng duïng coù doøng leänh göûi ñeán cho chöông trình cuûa öùng duïng. ÖÙng duïng ScreenSaver maøn hình giao dieän chính laø dialog. Dialog giao dieän coù theå laø dialog phaûi laáy thoâng tin naøy töø tham soá doøng leänh nhaèm löïa choïn xöû lyù phuø hôïp. duøng ñaët password cuûa heä thoáng (thö vieän MPR.DLL) hoaëc dialog Thuoäc tính m_lpCmdLine cuûa ñoái töôïng quaûn lyù tieåu trình chính trong öùng cuûa ngöôøi duøng. duïng chöùa chuoãi tham soá doøng leänh truyeàn cho öùng duïng. Noäi dung cuûa thuoäc (d) Chaïy minh hoïa ScreenSaver: Noäi dung tham soá doøng leänh nhö sau: tính naøy khaùc nhau tuøy theo tình huoáng thöïc hieän öùng duïng khaùc nhau. Töông "/s" öùng caùc tröôøng hôïp (12.4.1), noäi dung tham soá doøng leänh coù theå laø: 168 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 169
- Trong ñoù: Giaû söû caàn thöïc hieän öùng duïng ScreenSaver vôùi noäi dung hoaït ñoäng laø - /s (hoaëc /S): Giaù trò nhaän dieän tình huoáng thöïc hieän. hieån thò caâu chaøo "Hello !". Caùc böôùc thöïc hieän nhö sau: ÔÛ cheá ñoä naøy, ScreenSaver thöïc hieän xöû lyù nhö chaïy thöïc. Taïo döï aùn ScreenSaver töông töï döï aùn VD01. (e) Chaïy ScreenSaver: ÔÛ cheá ñoä naøy, ScreenSaver ñöôïc thieát keá theo Boå sung lôùp CEmpScreenSaverWnd keá thöøa töø lôùp CWnd cho döï aùn. kieåu öùng duïng coù maøn hình giao dieän chính laø cöûa soå vôùi noäi dung Thöïc hieän caøi ñaët cho lôùp CEmpScreenSaverWnd nhö sau: hoaït ñoäng. Cöûa soå naøy thöôøng coù cuøng kích thöôùc vaø vò trí vôùi cöûa soå - Haønh vi OnPaint hieån thò thoâng baùo "Hello !" ôû chính giöõa vuøng desktop cuûa heä thoáng. client cuûa cöûa soå. Phaàn löïa choïn trình huoáng xöû lyù cuûa öùng duïng ScreenSaver ñöôïc caøi void CEmpScreenSaverWnd::OnPaint() ñaët trong haønh vi InitInstance cuûa ñoái töôïng quaûn lyù öùng duïng. { // device context ñeå veõ CPaintDC dc(this); 12.4.3 Ñaëc ñieåm giao taùc vôùi ngöôøi duøng: Caùc öùng duïng ScreenSaver coù ñaëc ñieåm chung laø chaám döùt hoaït ñoäng khi // Do ScreenSaver's works here : nhaän ñöôïc tín hieäu nhaäp cuûa ngöôøi duøng (goõ phím, click hay di chuyeån chuoät). LOGFONT lf; Do ñoù, chöông trình ScreenSaver phaûi xöû lyù caùc message lieân quan vieäc nhaäp CFont font, *oldFont; lieäu: - Caùc message do taùc ñoäng leân baøn phím: memset(&lf, 0, sizeof(LOGFONT)); WM_KEYDOWN, WM_KEYUP strcpy(lf.lfFaceName, "Arial"); lf.lfHeight = 50; lf.lfWidth = 14; - Caùc message do taùc ñoäng leân chuoät: // Taïo font chöõ ñeå söû duïng font.CreateFontIndirect(&lf); WM_MOUSEMOVE, oldFont = dc.SelectObject(&font); // vaø löu font chöõ cuõ. WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, RECT rect; WM_MBUTTONUP, WM_MBUTTONDOWN // Xoùa neàn DC dc.GetClipBox(&rect); Thoâng thöôøng, khi nhaän ñöôïc moät trong caùc message naøy thì öùng dc.FillRect(&rect, &CBrush(RGB(0, 128,128))); duïng töï ñoäng keát thuùc. Trong luùc ScreenSaver hoaït ñoäng, caàn ngaên caám caám ngöôøi duøng goõ phím dc.SetBkMode(TRANSPARENT); Ctrl+Alt+Del ñeå ‘qua maët’ öùng duïng. Vieäc ngaên caám naøy thöïc hieän nhö sau: rect.top += 3; rect.left+= 3; dc.SetTextColor(RGB(0, 0, 128)); // Duøng baûo löu traïng thaùi UINT oldval; dc.DrawText("Hello !", 7, &rect, // Baét ñaàu, caám phím: DT_CENTER | DT_VCENTER | DT_SINGLELINE); SystemParametersInfo ( SPI_SETSCREENSAVERRUNNING, rect.top -= 3; rect.left -= 3; 1 , &oldval, 0 ); rect.bottom -= 3; rect.right -= 3; ... // Phaàn thöïc hieän cuûa ScreenSaver dc.SetTextColor(RGB(255, 255, 0)); dc.DrawText("Hello !", 7, &rect, // Cuoái cuøng, thoâi caám phím: DT_CENTER | DT_VCENTER | DT_SINGLELINE); SystemParametersInfo ( SPI_SETSCREENSAVERRUNNING, // Khoâi phuïc laïi font chöõ cuõ dc.SelectObject(oldFont); 0, &oldval, 0); } 12.4.4 Thöïc hieän öùng duïng ScreenSaver ñôn giaûn: 170 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 171
- - Caùc haønh vi xöû lyù message cuûa chuoät vaø baøn phím: OnKeyDown, case 'a': OnLButtonDown, OnMouseMove, OnRButtonDown thöïc hieän göûi case 'A': // Ñaët Password (khoâng duøng cho WinNT-Win2000) message ñoùng cöûa soå: // Söû duïng hoäp Password cuûa heä thoáng cho töông thích. PostMessage( WM_CLOSE, 0, 0 ); typedef VOID (WINAPI *PWDCHANGEPASSWORD) ( Taïo môùi dialog resource vaø lôùp CEmpScreenSaverDlg keá thöøa töø LPCSTR lpcRegkeyname, CDialog söû duïng dialog resource naøy. Dialog CEmpScreenSaverDlg HWND hwnd,UINT uiReserved1, cho pheùp ngöôøi duøng chænh söûa caùc thoâng soá lieân quan ñeán hoaït ñoäng UINT uiReserved2 ); cuûa öùng duïng ScreenSaver. Coù theå löu caùc thoâng soá aán ñònh bôûi ngöôøi PWDCHANGEPASSWORD PwdChangePassword; duøng vaøo system registry (12.2). HINSTANCE hmpr; Boå sung vaø chænh söûa lôùp quaûn lyù öùng duïng CEmpApp nhö sau: hmpr = ::LoadLibrary("MPR.DLL"); - Boå sung caùc thuoäc tính protected quaûn lyù hoaït ñoäng ScreenSaver: if (hmpr == NULL) return FALSE; BOOL m_bFullDemo; PwdChangePassword = (PWDCHANGEPASSWORD) ::GetProcAddress(hmpr, "PwdChangePasswordA"); UINT Ctrl_Alt_Del_State; if (PwdChangePassword != NULL) - Haønh vi InitInstance löïa choïn xöû lyù ñeå thöïc hieän moät caùch phuø hôïp PwdChangePassword("SCRSAVE",parent,0,0); vôùi caùc tình huoáng hoaït ñoäng cuûa öùng duïng: FreeLibrary(hmpr); BOOL CEmpApp::InitInstance() return FALSE; { case 'p': // Löu cheá ñoä minh hoïa case 'P': m_bFullDemo = FALSE; // Xem minh hoïa trong maøn hình con // Handle cöûa soå cha HWND parent; // Vò trí cöûa soå öùng duïng style = WS_CHILD | WS_VISIBLE | WS_DISABLED ; RECT rect; // Daïng cöûa soå öùng duïng break; DWORD exstyle = 0, style; default: sscanf(m_lpCmdLine + 3, "%d", &parent); // Cheá ñoä chaïy thöïc cuûa ScreenSaver switch (m_lpCmdLine[1]) { m_bFullDemo = TRUE; case 'c': parent = GetDesktopWindow(); case 'C': exstyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST; // Chöùc naêng aán ñònh thoâng soá style = WS_POPUP | WS_VISIBLE; CEmpScreenSaverDlg* main; } // Xaùc ñònh cheá ñoä chaïy cuï theå CWnd* pr; pr = new CWnd(); CEmpScreenSaverWnd* main; pr->Attach(parent); main = new CEmpScreenSaverWnd; main = new CEmpScreenSaverDlg(pr); m_pMainWnd = main; m_pMainWnd = main; // Goùc traùi treân, phaûi döôùi POINT p1, p2; main->DoModal(); GetWindowRect (parent, &rect); // Xaùc ñònh vò trí cöûa soå cha pr->Detach(); p1.x = rect.left; p1.y = rect.top; delete main; p2.x = rect.right; p2.y = rect.bottom; delete pr; return FALSE; 172 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 173
- 12.5 ÖÙNG DUÏNG SÖÛ DUÏNG NHIEÀU TIEÅU TRÌNH: if (!m_bFullDemo) { // Chaïy trong cöûa soå con : Vieäc thieát laäp caùc tieåu trình con hoã trôï cho tieåu trình chính trong chöông // Xaùc ñònh toïa ñoä cöûa soå con trong hoäp Display Properties trình cuûa öùng duïng cho pheùp öùng duïng ñoàng thôøi ñaùp öùng nhieàu yeâu caàu cuûa ngöôøi duøng. Caùc tieåu trình hoã trôï coù theå thöïc hieän caùc xöû lyù beân trong (tieåu ScreenToClient ( parent, &p1 ); trình xöû lyù noäi – worker thread) hoaëc tröïc tieáp nhaän vaø thöïc hieän caùc yeâu caàu ScreenToClient ( parent, &p2 ); } cuûa ngöôøi duøng (tieåu trình giao dieän– user interface thread). // Cöûa soå giao dieän chính coù toïa ñoä vaø kích thöôùc thích hôïp 12.5.1 Tieåu trình xöû lyù noäi: Tieåu trình xöû lyù noäi ñaûm nhaän caùc xöû lyù tính toaùn beân trong, khoâng tröïc main->CreateEx(exstyle, _T("STATIC"),"Emp.ScreenSaver", style, p1.x, p1.y, p2.x, p2.y, parent, NULL); tieáp töông taùc vôùi ngöôøi duøng. Vieäc thieát laäp tieåu trình xöû lyù noäi trong chöông // Daáu con chuoät vaø khoùa phím neáu chaïy ScreenSaver thöïc trình ñöôïc thöïc hieän thoâng qua caùc noäi dung sau ñaây: if (m_bFullDemo) { Xaây döïng haøm ñaûm nhaän vieäc ñieàu khieån toaøn boä hoaït ñoäng xöû lyù cuûa ShowCursor(FALSE); tieåu trình (Thread Procedure). Haøm naøy coù khai baùo nhö sau: main->SetCapture(); UINT MyThreadProc ( LPVOID pParam ); SystemParametersInfo ( pParam : Tham soá duy nhaát maø haøm ñieàu khieån nhaän ñöôïc khi SPI_SETSCREENSAVERRUNNING, tieåu trình ñöôïc kích hoaït. 1,&Ctrl_Alt_Del_State, 0 ); Khi keát thuùc xöû lyù, haøm phaûi traûveà moät giaù trò soá nguyeân phaûn aùnh } tình traïng keát thuùc cuûa haøm. Thoâng thöôøng, giaù trò 0 traû veà cho moät keát main->UpdateWindow(); thuùc thaønh coâng, caùc giaù trò khaùc 0 laø caùc qui öôùc veà hieän töôïng loãi. return TRUE; Thöïc hieän khôûi ñoäng tieåu trình xöû lyù noäi thoâng qua haøm sau: } CWinThread* AfxBeginThread ( - Haønh vi ExitInstance thöïc hieän gôõ boû caùc caøi ñaët: AFX_THREADPROC pfnThreadProc, // Haøm ñieàu khieån LPVOID pParam, // Tham soá cuûa haøm. int CEmpApp::ExitInstance() int nPriority = THREAD_PRIORITY_NORMAL, { UINT nStackSize = 0, if (m_bFullDemo) { DWORD dwCreateFlags = 0, ReleaseCapture(); LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ShowCursor(TRUE); SystemParametersInfo ( ); SPI_SETSCREENSAVERRUNNING, Sau ñaây laø boá cuïc thöïc hieän toaøn boä coâng vieäc treân: 0, &Ctrl_Alt_Del_State, 0 UINT MyThreadProc( LPVOID pParam ) { ); … // Khai thaùc noäi dung cuûa pParam } … // Thöïc hieän caùc xöû lyù caàn thieát. return CWinApp::ExitInstance(); } return ( coù_loãi ) ? 1 : 0; Taïo haèng chuoãi tuøy yù coù soá hieäu laø 1 trong StringTable resource. } // Chuaån bò khôûi ñoäng tieåu trình Bieân dòch öùng duïng. Cheùp taäp tin chöông trình (.exe) vaøo thö muïc heä … pInfo = new MyInfo ; // Chæ ñeán vuøng chöùa caùc giaù trò thoâng soá thoáng vaø ñoåi teân taäp tin vôùi phaàn môû roäng laø .SCR. AfxBeginThread( MyThreadProc, pInfo ); Söû duïng Control Panel / Display / ScreenSaver kieåm tra keát quaû. 174 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 175
- Giaû söû caàn thöïc hieän öùng duïng sau: void CWorkerThreadDlg::OnOK() { if (m_isTextScrolled) { SetDlgItemText( IDOK, "Start Text Scrolling" ); // Ñaët giaù trò thoâng baùo tieåu trình chaïy chöõ chaám döùt m_isTextScrolled = FALSE; } else { SetDlgItemText(IDOK, "Stop Text Scrolling"); // Ñaët giaù trò cho pheùp cho tieåu trình chaïy chöõ thöïc hieän - Tieåu trình xöû lyù noäi caøi ñaët bôûi moät haøm coù nhieäm vuï thöïc hieän chaïy m_isTextScrolled = TRUE; // Khôûi ñoäng tieåu trình vôùi tham soá laø dialog giao dieän doøng chöõ trong hoäp thoâng baùo cho ñeán khi coù tín hieäu ngöøng. - Tieåu trình giao dieän quaûn lyù dialog nhaän yeâu caàu ngöôøi duøng: AfxBeginThread( TextScrolling, this ); Muïc Start Text Scrolling khôûi ñoäng tieåu trình thöïc hieän chaïy chöõ. } } Muïc choïn naøy sau ñoù ñoåi thaønh Stop Text Scrolling ñeå ñieàu khieån TextScrolling laø haøm xöû lyù cuûa tieåu trình chaïy chöõ. Haøm nhaän tham soá ngöøng tieåu trình noùi treân. Muïc Close chaám döùt öùng duïng. void* laø con troû chæ ñeán ñoái töôïng dialog giao dieän. Coù theå khai baùo haøm trong phaàn caøi ñaët cuûa lôùp CWorkerThreadDlg ñeå tieän söû duïng. Döï aùn cuûa öùng duïng ñöôïc thöïc hieän nhö sau: Taïo döï aùn WorkerThread vôùi giao dieän chính laø dialog. UINT TextScrolling(void* pParam) { Thöïc hieän caùc caøi ñaët sau cho lôùp CWorkerThreadDlg laøm giao dieän: // Con troû pParam thöïc chaát laø con troû ñoái töôïng dialog giao dieän - Môû dialog resource, caøi ñaët caùc control sau: CWorkerThreadDlg* pDlg = (CWorkerThreadDlg*)pParam; - Hoäp chöùa doøng chöõ chaïy Static IDC_INFO static CString info = " Welcome to multi-thread programming"; - Nuùt leänh cho pheùp chöõ chaïy | ngöøng Button IDOK while (pDlg->m_isTextScrolled) { - Thuoäc tính public m_isTextScrolled kieåu BOOL ghi nhaän thoâng tin // Giaù trò thoâng baùo cho pheùp tieåu trình tieáp tuïc thöïc hieän: veà hoaït ñoäng chaïy chöõ. info = info.Mid(1) + info.Left(1); - Haønh vi OnInitDialog khôûi ñoäng caùc thoâng soá: pDlg->SetDlgItemText(IDC_INFO, info); // Taïm nghæ Sleep(100); BOOL CWorkerThreadDlg::OnInitDialog() } { // Keát thuùc tieåu trình xöû lyù noäi return 0; CDialog::OnInitDialog(); } SetIcon(m_hIcon, TRUE); // Set big icon Bieân dòch vaø chaïy thöû öùng duïng. SetIcon(m_hIcon, FALSE); // Set small icon m_isTextScrolled = FALSE; // Chöa thöïc hieän chaïy chöõ 12.5.2 Tieåu trình giao dieän: Tieåu trình giao dieän coù khaû naêng tröïc tieáp nhaän vaø xöû lyù yeâu caàu cuûa return TRUE; ngöôøi duøng moät caùch ñoäc laäp vôùi tieåu trình chính (cuõng laø tieåu trình giao dieän) } cuûa öùng duïng. Vieäc thieát laäp tieåu trình giao dieän trong chöông trình ñöôïc thöïc - Haønh vi OnOK öùng vôùi nuùt leänh IDOK thöïc hieän khôûi ñoäng hoaëc hieän thoâng qua caùc noäi dung sau ñaây: thoâng baùo ngöøng tieåu trình xöû lyù chaïy chöõ: 176 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 177
- Chuaån bò giao dieän (cöûa soå hoaëc dialog) cuûa tieåu trình giao dieän. BOOL CSubUserThread::InitInstance() Xaây döïng lôùp keá thöøa töø CWinThread ñeå quaûn lyù tieåu trình giao dieän. { Söû duïng giao dieän treân cho lôùp thoâng qua haønh vi InitInstance cuûa lôùp. CSubUserDlg dlg; m_pMainWnd = &dlg; Thöïc hieän khôûi ñoäng tieåu trình giao dieän thoâng qua haøm sau: dlg.DoModal(); CWinThread* AfxBeginThread ( return TRUE; CRuntimeClass* pThreadClass, } int nPriority = THREAD_PRIORITY_NORMAL, Thöïc hieän caùc caøi ñaët sau cho lôùp dialog CUserIntThreadDlg: UINT nStackSize = 0, - Môû dialog resource, caøi ñaët caùc control sau: DWORD dwCreateFlags = 0, - Nuùt leänh kích hoaït tieåu trình giao dieän con Button IDOK LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL - Nuùt leänh keát thuùc öùng duïng Button IDCANCEL ); - Haønh vi OnOK cho nuùt choïn IDOK kích hoaït tieåu trình giao dieän: pThreadClass : Con troû ñeán caáu truùc quaûn lyù thoâng tin thi haønh cuûa lôùp void CUserIntThreadDlg::OnOK() ñoái töôïng quaûn lyù tieåu trình giao dieän ñöôïc kích hoaït. Xem (11.4). { Giaû söû coù yeâu caàu thöïc hieän öùng duïng vôùi hai giao dieän hoaït ñoäng ñoàng AfxBeginThread( RUNTIME_CLASS(CSubUserThread) ); haønh; giao dieän Sub Interface of program ñöôïc kích hoaït khi ngöôøi duøng } click choïn muïc Run the sub user-interface thread dialog treân dialog giao Bieân dòch vaø chaïy thöû öùng duïng. dieän cuûa tieåu trình giao dieän chính. 12.5.3 Caùc haøm hoã trôï: void AfxEndThread ( UINT nExitCode // Giaù trò keát thuùc tieåu trình }; Chaám döùt hoaït ñoäng cuûa tieåu trình. Haøm chæ ñöôïc söû duïng trong phaàn caøi ñaët xöû lyù cuûa tieåu trình. BOOL GetExitCodeThread ( HANDLE hThread, // Handle cuûa tieåu trình LPDWORD lpExitCode // Con troû ñeán bieán chöùa keát quaû. ); Laáy giaù trò keát thuùc cuûa moät tieåu trình. Traû veà giaù trò TRUE neáu taùc vuï thöïc hieän thaønh coâng. hThread cuûa moät tieåu trình coù theå laáy töø thuoäc tính m_hThread cuûa ñoái Caùc böôùc thöïc hieän nhö sau: töôïng CWinThread quaûn lyù tieåu trình. Taïo döï aùn UserIntThread vôùi giao dieän chính laø dialog. 12.6 LAÄP TRÌNH MULTIMEDIA VÔÙI MCI: Thieát keá dialog resource cho giao dieän con. Treân dialog resource naøy, MCI (Media Control Interface) cung caáp boä leänh cô baûn coù tính thích nghi caøi nuùt thoaùt vôùi soá hieäu IDCANCEL. cao vôùi nhieàu thieát bò media trong vieäc thöïc hieän caùc noäi dung multimedia. Boå sung lôùp CSubUserDlg keá thöøa töø CDialog söû duïng resource treân. Moãi thieát bò media söû duïng cho vieäc thöïc hieän noäi dung multimedia ñöôïc Boå sung lôùp ñoái töôïng CSubUserThread keá thöøa töø CWinThread cho MCI quaûn lyù thoâng qua cöûa soå giao dieän MCI thuoäc lôùp MCIWnd. Ñaây laø lôùp pheùp quaûn lyù caùc tieåu trình giao dieän con. Ñoái töôïng CSubUserThread cöûa soå do MCI ñaêng kyù tröôùc nhaèm phuïc vuï cho muïc ñích naøy. nhaän ñoái töôïng CSubUserDlg laøm cöûa soå giao dieän chính thoâng qua Cöûa soå giao dieän MCI nhö sau: haønh vi InitInstance cuûa noù. 178 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 179
- - Môû dialog resource, caøi caùc control sau: - Hoäp nhaäp ñöôøng daãn, teân taäp tin Edit IDC_FILE - Nuùt leänh thöïc hieän Play Button IDC_PLAY - Nuùt leänh thöïc hieän Stop Button IDC_STOP - Boå sung thuoäc tính protected m_mciWnd kieåu HWND duøng quaûn lyù Sau ñaây laø caùc haøm MCI söû duïng phoå bieán (Vfw.h): thieát bò media ñöôïc söû duïng. HWND MCIWndCreate ( - Haønh OnInitDialog khôûi ñoäng thieát bò media: HWND hwndParent, // Handle cöûa soå cha cuûa cöûa soå MCI BOOL CMCIDlg::OnInitDialog() HINSTANCE hInstance, // Handle cuûa öùng duïng { DWORD dwStyle, // Daïng cöûa soå giao dieän MCI CDialog::OnInitDialog(); LPSTR szFile // Ñöôøng daãn, teân taäp tin media. SetDlgItemText(IDC_FILE, "HappyNewYear.rmi"); ); Môû thieát bò media vaø söû duïng noäi dung multimedia trong taäp tin töông m_mciWnd = MCIWndCreate ( this->GetSafeHwnd(), öùng. Haøm traû veà con troû cöûa soå MCI quaûn lyù thieát bò ñöôïc môû. AfxGetInstanceHandle(), Thoâng soá dwStyle cuûa cöûa soå MCI ñöôïc keát hôïp töø caùc giaù trò sau: /*invisible*/ ~WS_VISIBLE, NULL ); MCIWNDF_SHOWALL : Hieån thò caùc muïc cuûa cöûa soå. return TRUE; MCIWNDF_NOMENU : Khoâng hieån thò nuùt choïn menu. } MCIWNDF_NOPLAYBAR : Khoâng hieån thò progressbar. - Haønh vi OnPlay öùng vôùi nuùt IDC_PLAY thöïc hieän noäi dung media: LONG MCIWndOpen ( // Traû veà giaù trò 0 neáu thaønh coâng. void CMCIDlg::OnPlay() HWND hwnd, // Handle cöûa soå MCI { LPSTR szFile // Ñöôøng daãn, teân taäp tin media. // Laáy teân taäp tin multimedia char fName[1024]; DWORD dwStyle = 0 GetDlgItemText(IDC_FILE, fName, 1023); ); Môû noäi dung multimedia môùi cho thieát bò media quaûn lyù bôûi hwnd. if ( MCIWndOpen( m_mciWnd, fName, 0 ) == 0 ) { LONG MCIWndClose( HWND hwnd ); Ñoùng noäi dung multimedia. MCIWndPlay( m_mciWnd ); LONG MCIWndPlay( HWND hwnd ); Thöïc hieän. } LONG MCIWndStop( HWND hwnd ); Ngöøng thöïc hieän. } LONG MCIWndPause( HWND hwnd ); Taïm ngöøng. - Haønh vi OnStop ngöøng thöïc hieän: LONG MCIWndResume( HWND hwnd ); Tieáp tuïc. void CMCIDlg::OnStop() VOID MCIWndDestroy( HWND hwnd ); Ñoùng thieát bò media. { Giaû söû thieát keá öùng duïng cho pheùp choïn taäp tin multimedia; muïc Play thöïc MCIWndStop( m_mciWnd ); hieän noäi dung taäp tin, muïc Stop ngöøng thöïc hieän. } Bieân dòch vaø chaïy thöû öùng duïng. Caùc böôùc tieán haønh nhö sau: Duøng MFC Wizard taïo döï aùn MCI vôùi giao dieän chính laø dialog. 12.7 AÁN ÑÒNH MOÄT SOÁ TÍNH NAÊNG CUÛA WINDOWS: Khai baùo söû duïng thö vieän MCI trong taäp tin STDAFX.H: Moâi tröôøng windows cho pheùp ngöôøi duøng aán ñònh moät soá tính naêng tieän ích nhö cheá ñoä töï ñoäng ngaét nguoàn, taét maùy,…. Caùc tính naêng naøy coù theå #include ñöôïc caøi ñaët thoâng qua chöông trình tieän ích hoaëc laäp trình töï ñoäng vôùi haøm #pragma comment (lib, "Vfw32.lib") // MCI library sau: Trong lôùp dialog giao dieän chính: CMCIDlg 180 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - lntmail@yahoo.com Moät soá vaán ñeà trong Windows 181
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- 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- P5
10 p | 168 | 33
-
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