TÌM HIỂU VỀ MFC VÀ XÂY DỰNG ỨNG DỤNG SỬ DỤNG MFC
Trang 1ĐỀ TÀI: TÌM HIỂU VỀ MFC VÀ XÂY DỰNG ỨNG DỤNG
Trang 2A- MỞ ĐẦU
Ngôn ngữ lập trình C++ được biết đến như là một trong những ngôn ngữ lập trình mạnh nhất nhờ khả năng của nó trong việc triển khai phần mềm ở các mức độ khác nhau, từ mức hệ thống đến mức ứng dụng, từ lập trình cấu trúc đến lập trình hướng đối tượng, từ lập trình dựa trên thuật giải đến lập trình trí tuệ nhân tạo, và từ lập trình cơ sở dữ liệu đến lập trình cơ sở tri thức…Bất
cứ đâu, khi mà người lập trình muốn thể hiện ý tưởng khoa học và nghệ thuật của mình trên máy tính thì C++ là điều nghĩ đến đầu tiên
Và, theo đó, vấn đề cài đặt môi trường cho ứng dụng là điều phải quan tâm.Với xu hướng sử dụng hệ điều hành Microsoft Windows như hiện nay, chúng ta nên nghĩ đến việc cài đặt ứng dụng của mình trong môi trường này
và khai thác nó sao cho ứng dụng hoạt động hiệu quả nhất
Microsoft Visual C++ , sản phẩm của Microsoft với khả năng biên dịch ưu
việt và lối khai thác hệ thống rộng mở nhờ tập hợp lớp thư viện MFC có
đầy đủ các tiện ích xứng đáng là lựa chọn của bạn
Sau đây chúng ta sẽ cùng tìm hiểu về MFC và xây dựng một ứng dụng đơn giản sử dụng ứng dụng này
Trang 3
1.2 Một số lớp cơ bản
1.2.1.Lớp quản lý tiểu trình CwinThread
CwinThread là một lớp của MFC, lớp đối tượng quản lý tiểu trình được tạo
ra trong tiến trình của một ứng dụng đang thực hiện Các dịch vụ cơ bản phục vụ cho quản lý tiểu trình do CwinThread cung cấp thông qua các thuộc tính và hành vi của nó
DWORD m_ nThread ID:thuộc tính lưu số hiệu của tiểu trình
CWND m_pMain Wnd: Lưu con trỏ đối tượng cửa sổ giao diện chính của
tiểu trình Khi cửa sổ giao diện chấm dứt hoạt động, tiểu trình liên quan sẽ kết thúc Nếu tiểu trình thuộc loại tiểu trình xử lý nội thì giá trị này kế thừa
từ tiểu trình giao diện cấp cao hơn
CwinThread(): Hành vi tạo lập đối tượng tiểu trình
Vitual BOOL initinstance(): Khởi tạo thông số cho đối tượng tiểu trình và
đảm nhận các xử lý bổ sung khác của ứng dụng Đối với tiểu trình giao diện, hành vi này dùng để khởi tạo đối tượng cửa sổ giao diện và gán địa chỉ của
đối tượng cửa sổ cho m_pMain Wnd
Virtual int Exitinstance(): Hành vi kết thúc của đối tượng tiểu trình Thông
qua hành vi này, đối tượng quản lý tiểu trình thực hiện hoàn trả các tài nguyên của hệ thống mà nó đã đăng ký sử dụng
Virtual int Run(): Hành vi dành riêng cho tiểu trình giao diện, nó thực hiện
vòng lặp nhận message,chuyển message cho hành vi PreTranslateMessage của lớp Nếu hành vi này trả về giá trị 0 thì message sẽ tiếp tục được chuyển
Trang 4Virtual BOOL preTranslateMessage: Hành vi cho phép can thiệp trước
trên các message nhận được từ message queue của ứng dụng.Thông qua đó, tiểu trình giao diện có thể thực hiện các tiền xử lý message đặc trưng nhằm đáp ứng yêu cầu đặt ra cho ứng dụng
1.2.2 Lớp quản lý tiểu trình giao diện chính CWinApp
CwinApp, kế thừa từ CwinThread, là lớp đối tượng chuyên dùng quản lý tiểu trình giao diện chính của ứng dụng.Ứng dụng Windows chỉ được phép
sử dụng một đối tượng thuộc lớp này Ngoài các thuộc tính, hành vi kế thừa public từ CwinThread, CwinApp có các thuộc tính và hành vi bổ sung sau :
Const char* m_pszAppName : Lưu chuỗi tên của ứng dụng.
LPTSTR m_lpcmdLine : Lưu nội dung chuỗi tham số dòng lệnh Tham số
dòng lệnh là toàn bộ phần nội dung mà người dùng gõ vào ngay sau chuỗi đường dẫn và tên chương trình ứng dụng khi họ thực hiện ứng dụng.Đối với ứng dụng có nhiều chế độ hoạt động khác nhau thì việc sử dụng tham số dòng lệnh là một cơ chế xác lập các giao ước giữa ứng dụng và người dùng
để chọn chế độ sử dụng ứng dụng thích hợp
Int m_nCmdShow : Lưu giá trị thông số đã được dùng để kích hoạt cửa sổ
giao diện chính của ứng dụng
CwinApp() : Tạo lập đối tượng tiểu trình
Hành vi hiển thị hộp thông báo và chờ nhận ý kiến người dùng :
Virtual int DomessageBox {
LPCT STR lpsz prompt// nội dung thông báo
UINT nType // Dạng hộp thông báo
UINT hlpindex = 0 // Số hiệu mục giúp đỡ( Win help)
H/vi DoMessageBox chờ người sử dụng trả lời bằng cách chọn một nút
chọn xác định trong hộp thông báo Hành vi kết thúc với giá trị trả về là số hiệu của một nút được chọn.Kế thừa hành vi này để chặn và thực hiện xử lý
Trang 5- Lớp Cmenu: lớp quản lý Menu thông qua các thuộc tính và hành vi đặc
trưng
- Các lớp đối tượng nhập liệu: Lớp đối tượng nhập liệu, kế thừa từ lớp
CWnd, cho phép quản lý các mục nhập liệu trên cửa sổ giao diện
+ Cstatic: Lớp đối tượng quản lý mục thông báo hoặc ảnh trên cửa sổ giao
diện
+ Cedit: Lớp đối tượng quản lý hộp nhập trên cửa sổ giao diện.Ngoài việc
hỗ trợ xử lý các hoạt động nhập liệu, Cedit còn có khả năng thông tin cho cửa sổ cha của hộp nhập về tình hình nhập liệu đang diễn ra trong hộp
+ Cbutton: Lớp đối tượng quản lý nút chọn trên cửa sổ giao diện.Trong
Windows, các nút chọn có thể hoạt động độc lập hay theo nhóm
+ Lớp đối tượng quản lý hộp nhập chứa danh sách các mục chọn trên cửa
sổ giao diện Tùy theo loại ListBox mà khi sử dụng, người dùng được phép đánh dấu chọn một hoặc nhiều mục trong ListBox.
- Lớp quản lý hộp hội thoại Cdialog: Là lớp đồi tượng kế thừa từ lớp Cwnd,
được sử dụng để quản lý dialog
2 Lập trình Windows với MFC
2.1 Khái quát về lập trình Windows với MFC
Lập trình Windows với MFC là kỹ thuật lập trình sử dụng bộ thư viện MFC của Microsoft để xây dựng các ứng dụng trong windows( windows app) và các ứng dụng khác như DLL, COM,ActiveX
Bản chất của việc lập trình này là làm việc với C++ thông qua các lớp và đối tượng
Kỹ thuật lập trình này có một số ưu nhược điểm sau:
Ưu điểm:
+ Bản chất là lập trình hướng đối tượng với C++
+ Người lập trình đỡ phải nhớ nhiều hàm và cấu trúc vì chúng đã được gói chung vào các lớp cơ bản
+ Thời gian phát triển một ứng dụng nhanh bởi sự hỗ trợ của bộ Wizard với Visual studio
Nhược điểm:
+ Chương trình khi biên dịch ra sẽ khá lớn cỡ độ từ vài MB đến vài chục
MB tùy vào chế độ biên dịch static link ( đưa toàn bộ vào một exe hoặc một dll duy nhất) hoặc chế độ Dynamic linked ( bắt đính kèm mấy tệp dll của MFC)
+ Vẫn phải đính kèm các tệp tin của visual C++ như msvcrtX.dll và msvcppX.dll ( tùy phiên bản của VC++)
Trang 6+ Đối với các ứng dụng MFC lớn, việc làm giảm tốc độ của ứng dụng so với việc xây dựng ứng dụng bằng APIs là không thể tránh khỏi, bởi vì các lớp bao của MFC quá rườm rà và phức tạp
2.2 Môi trường lập trình MS Visual C++
Môi trường lập trình Microsoft Visual C++ bao gồm:
Resource View: cho phép tìm và chọn lọc các tài nguyên khác nhau trong
ứng dụng như thiết kế cửa sổ hội thoại, biểu tượng, menu, toolbar…
Trang 7File View: cho phép xem và điều hành tất cả các file trong ứng dụng
- Cửa sổ xuất ( output pane)
Cửa sổ này nằm ở phần dưới cùng trong cửa sổ ứng dụng Visual C++, thường có thể không hiện trên màn hình khi khởi động ứng dụng Visual C++ lần đầu tiên mà sẽ xuất hiện sau khi thực hiện biên dịch ứng dụng lần đầu tiên Phần của sổ này là nơi cung cấp tất cả thông tin cần thiết cho người dùng như các câu lệnh, lời cảnh báo và thông báo lỗi của trình biên dịch, đồng thời sẽ là nơi chương trình gỡ rối hiển thị tất cả các biến với những giá trị hiện hành trong thời gian thực thi trong mã nguồn
Trang 8
- Vùng soạn thảo:
Đây là vùng bên phải của môi trường để người dùng thực hiện tất cả thao tấc soạn thảo chương trình khi sử dụng Visual C++, nơi các cửa sổ soạn thảo chương trình hiển thị, đồng thời là nơi cửa sổ vẽ hiển thị khi người dùng thiết kế hộp thoại
- Thanh thực đơn ( menu):
Lần đầu tiên chạy Visual C++, có ba thanh công cụ hiển thị ngay dưới thanh menu ( menu Bar) Trong Visual C++ có sẵn nhiều thanh công cụ khác nhau, người dùng có thể tùy biến tạo các thanh công cụ phù hợp nhất cho riêng mình
Trang 9- Thanh công cụ:
2.3 Tạo ứng dụng với MS Visual C++
Từ menu File, người dùng chọn lệnh New để tạo mới một dự án( Project), một tập tin( File) hay một không gian làm việc( Workspace) khi đó hộp thoại xuất hiện như hình sau:
Để tạo ứng dụng dạng hộp thoại dialog, người dùng cần làm như sau:
Bước khởi đầu:
Trang 10- Bước 1:
- Bước 2:
Trang 11- Bước 3:
- Bước 4:
- Bước kết thúc:
Trang 12Để thực hiện được ứng dụng này cần hiểu được các khái niệm:
- Static text: Là một điều khiển được dùng để thông báo dòng văn bản trên
giao diện chương trình Bạn có thể thay đổi văn bản tĩnh này bằng các mã lệnh trong chương trình
- Edit Box: Hộp soạn thảo văn bản cho phép người sử dụng nhập dữ liệu
vào hoặc hiển thị dữ liệu ra màn hình
- Nút điều khiển Radio được sử dụng để chọn duy nhất một trong các lựa
chọn Thông thường các nút Radio được đặt trong các Group Box
- Hộp nhóm Group Box được sử dụng để trang trí, đó là một khung viền
ngoài của Static text
Để xây dựng được ứng dụng này phải tiến hành qua 2 bước sau đây:
- Thiết kế giao diện( Interface)
- Viết mã lệnh
2.2 Ứng dụng nhập dữ liệu và hiển thị kết quả trên hộp soạn thảo Edit
Box.
2.2.1 Thiết kế giao diện
Thiết kế chương trình Area để có giao diện như hình 1 Trong đó có ba hộp
soạn thảo Edit Box, hai nút Command Button, bốn dòng Static Text, một
Group Box và hai nút Radio Button
Khi kích vào nút Rectangle, chương trình sẽ cho phép bạn nhập vào chiều
dài và chiều rộng của hình chữ nhật như hình 1
Trang 13- Khi kích vào nút Circle chương trình sẽ cho phép bạn nhập bán kính của
đường tròn như hình 2
- Để hiển thị kết quả tính diện tích, bạn ấn vào nút Display
- Kích vào nút Clear để xóa dữ liệu trên các Edit Box
- Nút Exit để thoát chương trình
2.2.2 Viết mã lệnh
Các hàm được sử dụng để viết mã lệnh cho ứng dụng
- Hàm UpdateData ( tham_ số) với :
Tham_ số là TRUE: hàm sẽ thực hiện việc cập nhật dữ liệu trong các điều
khiển vào các biến liên kết tương ứng
Tham_ số là FALSE: hàm sẽ thực hiện việc cập nhật dữ liệu từ các biến liên
kết vào trong các điều khiển tương ứng và hiển thị trên giao diện chương trình
Cặp mã lệnh UpdateDate(TRUE) và UpdateData(FALSE) là rất cơ bản và quan trọng trong Visual C++ Nó có tác dụng như cặp mã lệnh Cin>> và
Trang 14Trả về giá trị kiểu BOOL Nếu hàm được thực hiện thì trả về TRUE, nếu không được thực hiện thì hàm trả về FALSE.
Tham số duy nhất của hàm là nCmdShow
+ Nếu nCmdShow = SW_SHOW thì điều khiển được hiển thị
+ Nếu nCmdShow = SW_HIDE thì điều khiển bị ẩn.
- Hàm Void Set WindowText( Cstring text): để đặt tên cho điều khiển.
Đoạn code của ứng dụng:
// AreaDlg.cpp : implementation file
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
Trang 15virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
Trang 16DDX_Control(pDX, IDC_EDIT_LENGTH, m_ediLength);
DDX_Text(pDX, IDC_EDIT_LENGTH, m_dLength);
DDX_Text(pDX, IDC_EDIT_WIDTH, m_dWidth);
DDX_Text(pDX, IDC_EDIT_AREA, m_dArea);
DDX_Radio(pDX, IDC_RADIO_RECT, m_sel);
OnButtonDisplay)
ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)
Trang 17CDialog::OnInitDialog();
// Add "About " menu item to system menu
// IDM_ABOUTBOX must be in the system command range
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}}
// Set the icon for this dialog The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_sel=0;//gan bien dieu khien ve 0
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
Trang 18// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
Trang 19// TODO: Add your control notification handler code here
//hien thi van ban tinh static length
// TODO: Add your control notification handler code here
//an van ban tinh static length
Trang 20// TODO: Add your control notification handler code here
//cap nhat cac bien tu man hinh vao chuong trinh
Trang 21Visual C++ là một ngôn ngữ lập trình dựa trên nền tảng cơ bản của C++ đó
là lập trình hướng đối tượng Nếu các bạn đã lập trình trên C++ thì việc xây
Trang 22Visual C++ thì việc đó khá đơn giản Các bạn chỉ cần sử dụng các điều khiển hay xây dựng hay xây dựng một menu đưa vào ứng dụng của mình mà các mã lệnh cần phải viết không quá dài dòng và phức tạp như trong C/C++
Đó chính là thế mạnh của Visual C++ trợ giúp đắc lực cho người lập trình trong khi xây dựng những đề án chương trình lớn hoặc trong kỹ thuật lập trình hệ thống
Tuy nhiên, để hiểu và sử dụng được các lớp trong thư viện MFC phục vụ cho việc xây dựng các ứng dụng từ đơn giản đến phức tạp thì đòi hỏi thời gian tìm hiểu nghiên cứu kỹ càng Trong khuôn khổ của một bài thảo luận, nhóm chúng tôi mới chỉ kịp tìm hiểu những vấn đề cơ bản nhất về MFC và xây dựng được một ứng dụng tương đối đơn giản
Rất mong nhận được sự góp ý của cô giáo và các bạn để bài thảo luận của nhóm tôi hoàn thiện hơn./
Xin trân thành cảm ơn!
TÀI LIỆU THAM KHẢO Giáo trình
1.Tự học lập trình Visual C++^.O từ cơ bản đến nâng cao Phạm Công
Ngô( Chủ biên)- NXB Thống Kê
Trang 23MỤC LỤC
Trang 24Cộng hòa xã hội chủ nghĩa Việt Nam
Độc lập- Tự do- Hạnh phúc
BIÊN BẢN HỌP NHÓM
1 Thời gian: 15h ngày 10/4/2012
2 Địa điểm: Sân thư viện
3 Thành phần: Nhóm trưởng, thư ký và các thành viên nhóm 5
4 Nội dung:
- Nhóm trưởng phân công nhiệm vụ cho từng thành viên
- Qui định hạn nộp bài cá nhân và hình thức nộp bài ( gửi qua mail cho nhóm trưởng)
Buổi họp kết thúc vào hồi 15h30p cùng ngày
Trang 25ĐÁNH GIÁ HOẠT ĐỘNG CỦA THÀNH VIÊN
1 Trần Thị Hường(NT) Xây dựng ứng dụng
2 Nguyễn Thị Huyên Tìm hiểu về MFC
3 Dương Hiền Huyền Tìm hiểu về MFC
4 Hà Thị Thu Huyền Làm Slide
5 Vũ Thị Lan Xây dựng ứng dụng
6 Vũ Thị Liên(TK) Xây dựng ứng dụng
7 Trần Nhật Linh Tìm hiểu về MFC
Trần Thanh Long