Điều khiển ActiveX cung cấp cỏc giao diện cú sẵn những tớnh năng khỏc nhau , một số được dựng để kớch hoạt những sự kiện điều khiển trong điều khiển hay trong ứng dụng.
Vớ dụ sau đõy sẽ sử dụng ActiveX Window Media Player để tạo ra một ứng dụng nghe nhạc với cỏc nỳt điều khiển
Hỡnh 3.57.Giao diện chương trỡnh thiết kế.
Tạo một ứng dụng MFC AppWizard mụi trường ứng dụng Dialog Based cú tờn là
WMA. Giao diện được thiết kế với cỏc nỳt bấm :
-Nỳt bấm Browse : (ID :IDC_BROWSE ,Caption : &Browse , Extended Styles :Modal
Frame ), nỳt bấm này cú tỏc dụng lấy đường dẫn tới cỏc file nhạc và thờm vào list box .
-Nỳt Stop: (ID: IDC_STOP, Caption :&Stop , Extended Styles :
Modal Frame), khi bấm nỳt này file nhạc sẽ dừng lại .
-Play : (ID: IDC_PLAY, Caption: &Play, Extended Styles :Modal Frame ), khi chọn một file trong list box và bấm Play thỡ Media sẽ chơi.
khi chọn một file nhạc và bấm nỳt này sẽ bị xoỏ khỏi danh sỏch .
-Remove All (ID :IDC_REMOVEALL, Caption :&Remove All, Extended Styles :Modal Frame ), sẽ xoỏ toàn bộ list file trong Listbox.
-List Box (ID :IDC_LIST, Extended Styles :Static Edge ) sẽ chứa danh sỏch cỏc file nhạc được đưa vào.
-Picture (ID :IDC_STATIC, Type :Frame, Style :Bunken (đỏnh dấu chọn ),
Border(đỏnh dấu chọn ).
-ActiveX Window Media Player (ID :IDC_WND ).
Ngoài ra cũn sử dụng cỏc Static với Caption là :Hour, Minute, Second và cỏc edit box
IDC_HOUR, IDC_MINUTE,IDC_SECOND để hiển thị giờ hệ thống .
Chốn một ActiveX: Project >Add to Project >Components and Controls…>Registered
ActiveX Controls > Window Media Player > Insert
Hệ thống sẽ hiện ra hộp thoại hỏi xem đưa những thành phần của Active này vào trong ứng dụng .
Hỡnh 3.58. Chọn lớp cần thiết đưa vào trong ứng dụng .
Chỉ chọn CWMPPlayer4 .Sau khi chọn trong Classes View sẽ cú sự xuất hiện của lớp .
Hỡnh 81 .Tạo ra lớp CWMPPlayer4 .
Trong Files View xuất hiện cỏc file wmpplayer4.cpp và wmpplayer4.h . Để sử dụng được cỏc nú cũng như những ActiveX khỏc đều xem cỏc hàm được khai bỏo và định nghĩa như thế nào để cú thể sử dụng được nú trong ứng dụng .
Trong phần bố trớ cỏc thành phần trong giao diện sử dụng cỏc chức năng của menu
Layout để căn chỉnh cho đẹp .
Sử dụng một hàm Draw(CDC*pDC) để tạo ra dũng chữ dịch chuyển trong màn hỡnh (tạo thờm vẻ bắt mắt ) .Khai bỏo hàm này trong WMADlg.h :
private:
void Draw(CDC*pDC);
Quay trở lại Source Files để viết hàm trong WMADlg.cpp :
void CWMADlg::Draw(CDC*pDC) {
CBrush Brush(RGB(192,192,192)); //Tạo ra bỳt vẽ khung hỡnh chữ //nhật sẽ làm nền cho chương trỡnh.
CBrush* OldBrush=pDC->SelectObject(&Brush);// pDC->Rectangle(12,12,524,473); //Vẽ khung nền
CFont font; //Khởi tạo Font chữ
font.CreateFont(30,0,0,0,600,1,0,0,ANSI_CHARSET, DEFAULT_CHARSET,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH,".Time New Romance");
//Định dạng cho Font này
CFont*pOldFont=pDC->SelectObject(&font);
pDC->SetBkMode(TRANSPARENT); //Đặt kiểu nền nơi viết chữ
pDC->SetTextColor(RGB(0,0,255)); // Đặt mầu chữ //Thờm biến trong WMADlg.h
// Public :
// Cstring m_DichChuyen ;
//Trở lại với hàm Draw :
pDC->TextOut(100,440,m_DichChuyen); //Viết chữ ra màn hỡnh
pDC->SelectObject(pOldFont); //Giải phúng con trỏ .
}
Để tiện cho việc căn chỉnh giao diện nờn tạo hiển thị toạ độ chuột bằng cỏch hiển thị lờn 2 static toạ độ x,y .Thờm 2 static vào trong Dialog (đủ dài để hiện đủ kớ tự ) . Ấn Ctrl
Hỡnh 3.59 .Tạo sự kiện WM_MOUSEMOVE để lưu giữ toạ độ chuột
Add Function >Edit code để viết mó cho sự kiện này :
void CWMADlg::OnMouseMove(UINT nFlags, CPoint point) {
CString s1,s2; //Tạo ra 2 chuỗi kớ tự để lưu giữ toạ độ chuột
s1.Format("Toa do x:%d",point.x); // Gỏn toạ độ x lờn chuỗi s1.
s2.Format("Toa do y:%d",point.y); // Gỏn toạ độ y lờn chuỗi s2.
SetDlgItemText(IDC_X,s1); // Đưa cỏc chuỗi này lờn màn hỡnh thụng //qua cỏc Static
SetDlgItemText(IDC_Y,s2);
UpdateData(FALSE); //Cập nhật dữ liệu ra màn hỡnh
CDialog::OnMouseMove(nFlags, point);}
Việc sử dụng toạ độ chuột trờn màn hỡnh sẽ khiến cho việc trỡnh bày dễ dàng hơn ,sau khi sử dụng xong cú thể xoỏ phần hiển thị toạ độ chuột ).Căn chỉnh khung chương trỡnh nằm trong khung chữ nhật cú toạ độ cỏc đỉnh đối diện (12,12) ,(524,473) .
Khởi động chế độ đồ hoạ để hiển thị bằng sự kiện OnInitDialog ( ) ,trước đú thờm cỏc biến trong WMADlg.h như sau :
public:
CDC m_pdcMemory; private:
void Draw(CDC*pDC); CBitmap m_pBitmap;
Và viết mó cho sự kiện OnInitDialog ( ) :
{
CDialog::OnInitDialog( ); ……….
m_DichChuyen="Keep Moving Forward !";// Gỏn giỏ trị cho chuỗi
SetTimer(1,1000,NULL); // Đặt bộ đếm thời gian để hiển thị sự dịch //chuyển
CRect rectWin; //Tạo ra khung hiển thị
GetClientRect(rectWin); CClientDC dc(this); m_pdcMemory.CreateCompatibleDC(&dc); m_pBitmap.CreateCompatibleBitmap(&dc, rectWin.Width(), rectWin.Height()); ………… return TRUE; }
Trong sự kiện WM_PAINT gọi hàm Draw(CDC*pDC) để hiển thị khung nền và dũng chữ : void CWMADlg::OnPaint( ) { ……….. else { CPaintDC dc(this);
Draw(&dc); /Gọi hàm Draw với tham số lỳc này là &dc
UpdateData(FALSE); CDialog::OnPaint(); }
}
Ở đõy cú sử dụng đến bộ đếm thời gian nờn cú thờm sự kiện WM_TIMER đối với lớp
CWMADlg (Ấn Ctrl +W và thờm Message là WM_TIMER cho lớp CWMADlg ) :
void CWMADlg::OnTimer(UINT nIDEvent) {
CString DichChuyen;
DichChuyen=m_DichChuyen.Left(1); m_DichChuyen.Delete(0.1);
m_DichChuyen=m_DichChuyen+DichChuyen;
InvalidateRect(CRect(12,430,524,473),FALSE); //khung này sẽ //hiển thị được sự thay đổi của dũng chữ “ Keep Moving Forward ” trờn màn //hỡnh
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent); }
Ấn F5 để cho chạy chương trỡnh sẽ thấy dũng chữ chạy như mong muốn .
-Cập nhật giờ hệ thống lờn cỏc edit box : Ấn Ctrl + W và chọn tab Member Variables để thờm cỏc biến như bảng dưới :
Hỡnh 3.60 .Thờm cỏc biến
Thờm biến thời gian ( mở WMADlg.h )
public:
int m_gio,m_phut,m_giay;
và viết sự kiện cho hàm OnTimer ( ) :
void CWMADlg::OnTimer(UINT nIDEvent) {………. m_giay++; if(m_giay>=60) { m_giay%=60; m_phut++; if(m_phut>=60) { m_phut%=60; m_gio++; if(m_gio>=24) m_gio%=24; } }
//Cập nhật giờ hệ thống lờn cỏc biến int m_gio, m_phut,m_giay sau do cho //chỳng tăng sau mỗi giõy tương ứng với bộ đếm SetTimer(1,1000,NULL) .
m_h=m_gio;// Đưa cỏc giỏ trị giờ, phỳt, giõy lờn cỏc cỏc editbox .
m_s=m_giay;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent); }
Đến đõy cho biờn dịch chương trỡnh thỡ vẫn chưa thấy giờ hệ thống được hiển thị mà phải dựng tới sự kiện WM_INITDIALOG để lấy giờ hệ thống , thờm đoạn code này vào trong sự kiện : BOOL CWMADlg::OnInitDialog( ) { ……… CDialog::OnInitDialog(); CTime GioHienTai=CTime::GetCurrentTime( ); m_gio=GioHienTai.GetHour( ); m_phut=GioHienTai.GetMinute( ); m_giay=GioHienTai.GetSecond( ); ……….. return TRUE; }
Lỳc này cho chạy chương chỡnh sẽ cú giờ hệ thống được cập nhật và tăng sau mỗi giõy :
Hỡnh 3.61 .Kết quả của việc cập nhật giờ hệ thống .
Viết sự kiện cho cỏc nỳt bấm . Ấn Ctrl +W và tạo sự kiện BN_CLICKED cho tất cả cỏc nỳt bấm :
Hỡnh 3.62 .Tạo sự kiện BN_CLICKED cho cỏc nỳt bấm.
Với nỳt bấm BROWSE , với ActiveX Window Media Player sẽ chạy cỏc file bằng cỏch lấy đường dẫn của chỳng vỡ vậy nỳt bấm Browse sẽ cú tỏc dụng lấy đường dẫn đưa lờn
ListBox được điều khiển bởi biến Control là m_CtrlList đưa list file vào trong List box
sau đú lấy làm URL cho ActiveX:
Thờm một biến để chứa đường dẫn tới file được chọn
public:
CString ListDuongDan;
Mó cho cỏc sự kiện này được viết tiếp vào trong WMADlg.cpp
void CWMADlg::OnBrowse( ) {
POSITION ViTriFile; // Tạo ra biến vị trớ để lưu giữ thứ tự cỏc File //trong List
static char BASED_CODE szFilter[]="Music file(*.*)|*.*||";
// Thao tỏc mở File
CFileDialog pFile(TRUE
,"*.*",ListDuongDan,OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,szFilter);
// Tạo ra pFile Thuộc lớp CFileDialog
// OFN_ALLOWMULTISELECT là Flag chỉ ra hoạt động cho phộp chọn //nhiều File ViTriFile=pFile.GetStartPosition( ); //Lấy vị trớ của file đầu tiờn trong
//List file, sẽ là NULL khi tới cuối danh sỏch
if(pFile.DoModal( )==IDOK) //Kiểm tra xem cú đồng ý mở cỏc file hay //khụng
{
while(ViTriFile!=NULL) //Tạo ra vũng lặp lấy cỏc vị trớ của List trong
//khi chưa chưa hết danh sỏch file
{
ListDuongDan=pFile.GetNextPathName(ViTriFile); //Lưu lại //đường dẫn tại vị trớ tiếp theo của list
m_CtrlList.AddString(ListDuongDan); //Thờm đường dẫn vào //trong ListBox
} } }
Ấn F5 để biờn dịch chương trỡnh và khi ấn Browse chọn File sẽ thấy hiển thị trờn
ListBox cỏc file được chọn (ở trờn trỡnh bày thuật toỏn mở chọn nhiều file và hay được
sử dụng trong VC ++) .
Hỡnh 3.63 .Hiển thị được List File lờn List Box
Nỳt bấm Remove , khi chọn vị trớ đường dẫn File trong List (Tạo ra một biến lưu giữ vị trớ con trỏ ) sau đú tỏc động lờn list tại vị trớ đú bằng hàm xoỏ chuỗi kớ tự :
void CWMADlg::OnRemove( ) { int ViTriDuocChon; ViTriDuocChon=m_CtrlList.GetCurSel( ); m_CtrlList.DeleteString(ViTriDuocChon); UpdateData(FALSE); }
Với nỳt bấm Remove All đơn giản hơn vỡ khụng phải truy nhập tới vị trớ con trỏ nào, chỉ cần khi cú sự kiện bấm nỳt thỡ biến điều khiển Listbox tự động truy nhập vào cỏc đường dẫn trong danh sỏch và xoỏ toàn bộ chỳng :
void CWMADlg::OnRemoveall( ) {
m_CtrlList.ResetContent( ); //Xoỏ hết
}
Với cỏc nỳt bấm cũn lại đều liờn quan đến lớp ActiveX(ActiveX Window Media Player này được điều khiển bởi biến m_ctrl) đưa vào và phải xem cỏc hàm liờn quan tới nú được khai bỏo và định nghĩa như thế nào .Trong
header file wmpplayer4.h cú hàm close( )sử dụng để đúng media đang chạy, SetFullScreen( ) để điều khiển chức năng phúng to màn hỡnh và hàm SetUrl( ) để đưa
đường dẫn cho ActiveX Window Media Player. Vỡ vậy với sự kiện cỏc nỳt bấm cũn lại được viết tiếp như sau :
void CWMADlg::OnFullgreen( ) { m_ctrl.SetFullScreen(TRUE); //Phúng to màn hỡnh. } void CWMADlg::OnPlay( ) { int ViTriDuocChon=m_CtrlList.GetCurSel( );
//Lấy vị trớ trong ListBox được chọn
m_CtrlList.GetText(ViTriDuocChon,Url);
// Lấy đường dẫn trong ListBox tại vị trớ con trỏ được chon
m_ctrl.SetUrl(Url); //Cho Url lờn ActiveX
}
Trong hàm OnPlay( ) biến Url được khai bỏo trong WMADlg.h như sau :
public: