Lập trình trên Windows – 2

Tổng quan MFC
– Dùng Visual C++ 6 hoặc các bản Visual Studio
*THƯ VIỆN MFC:
– Thư viện các lớp, oop.
– Khi báo afxwin.h.
– Có các hàm toàn cục (các hàm có prefix là afx…).
– Gọi các hàm api dùng toán tử định phạm vi (::).

CÁC LOẠI FILE DO APPWIZARD SINH RA
phải có include “stdafx.h” trong mỗi file .cpp
SDI:
Lớp cơ sở:
+ CWinApp
+ CDocument
+ CView
+ CFrameWnd
Lớp dẫn xuất:
+ CBTApp
+ CBTDoc
+ CBTView
+ CMainFrame
File nguồn:
+ BT.cpp
+ BTDoc.cpp
+ BTView.cpp
+ MainFrm.cpp
File header:
+ BT.h
+ BTDoc.h
+ BTView.h
+ MainFrm.h
*MDI:
Lớp cơ sở:
+ CWinApp
+ CDocument
+ CView
+ CMDIFrameWnd
+ CMDIChildWnd
Lớp dẫn xuất:
+ CBTApp
+ CBTDoc
+ CBTView
+ CMainFrm
+ CChildFrm
File nguồn:
+ BT.cpp
+ BTDoc.cpp
+ BTView.cpp
……………
…………
File header:
+ BT.h
+ BTDoc.h
+ BTView.h
…………….
……………

LỚP APPLICATION
– Tên lớp là CWinApp.
khởi động (init) -> chạy (run) -> kết thúc.
– Chứa vòng lặp nhận message loop
– Mỗi ứng dụng có 1 và chì 1 đối tượng dẫn xuất từ lớp CWinApp (đối tượng này thường tên là theApp).
+ InitInstance() (khởi tạo instance). –> Run() (message loop ẩn dưới hàm run)—>exitInstance() (kết thúc ứng dụng).
*hàm updateWindows(): biến vùng client thành invalidate –> sinh ra WM_PAINT
LỚP CDOCUMENT:
– Chức năng là lưu dữ liệu
LỚP VIEW:
– Tên lớp là CView
– Quản lý hiển thị. (hàm onDraw đảm nhiệm cv này)
– Truyền / nhận thông tin sang lớp document.
Lớp FRAME:
– Lóp này mặc định là CMainFrame
– Tạo quản lý cửa sổ, toolbar, menu bar..
– Nó là cửa sổ mức cao nhất.

+SDI: CMainFrame dẫn xuất từ CMainWnd–> Tưởng tượng nếu bỏ phần client ra thì còn lại là main window.
+ MDI: tưởng tượng nếu như tắt cửa sổ con bên trong -> còn lại main frame. ….được dẫn xuất từ CMDIFrameWnd……………. CChildFrame dẫn xuất từ CMDIChildWnd……. gọi là MDI child frame window………….. Các window frame chứa các view.
*KIẾN TRÚC DOCUMENT/VIEW:
– Cốt lõi của ap MFC là:
đối tượng document lo việc lưu và nạp dữ liệu…. đối tượng lo việc trình bày..
– Mối tương quan giữa document và view là quan hệ 1 chiều –> 1 view gắn với 1 document.
– Để gắn chặt document, view và frame. MFC dùng document template

  • Lớp View có thể truy cập tới dữ liệu của document thông qua hàm CView::getDocument().
    thông thường sử dụng qua biến con trỏ CDocument:
    CBTView::onDraw(…){
    CDocument* p;
    p = new ……;
    }
  • Cập nhật lại tất cả các view dùng hàm updateAllView(NULL);
    (1) Tạo project có tên là “BaiTap” dạng SDI
    (2) Thêm biến vào lớp CBaiTapDoc như sau: kiểu CString, tên m_Hello, access modifier là public.

Hiệu chỉnh constructor của lớp CBT01Doc
m_Hello = _T(“xin chao”);
// _T: gọi là macro để tùy biến hoặc asscii hoặc unicode.

Chỉnh hàm onDraw()
pDc->Textout(10, 10, pDc->m_Hello);
XỬ LÝ MESSAGE TRONG MFC
thông qua hàm xử lý message gọi là mesage handler

WM_PAINT: OnPaint()
WM_SIZE: OnSize()
… các message handler có tên prefix là on…..
Mặc định OnPaint() sẽ tự động gọi OnDraw().
LỚP CSCROLLVIEW
chọn lớp cơ sở là CScrollView thay vì CView.
Để xác định kích thước theo đơn vị logic, ta chỉnh hàm ảo OnInitUpdate()

void OnInitUpdate()
SizeTotal có thể set khác 100
để thiết lập lấy vị trí của scrollview: CScrollView::getScrollPosition()….
………..

Lập trình trên Windows – 1

KIẾN THỨC LIÊN QUAN ĐẾN OOP
– Lớp.
– Đối tượng.
– Overloading function (hàm đa chức năng, đa năng hóa hàm + toán tử).
– Override (ghi đè/nạp chồng, thể hiện tính đa hình trong OOP).

sejkhkesrh
Override:
Kế thừa cha – con: muốn thay đổi ở con thì ta cho overriding, VD: Lớp hình tròn: tính diện tích hình tròn, nhưng khi ta muốn tính diện thích hình cầu thì function này không còn phù hợp nữa -> Thay đổi cho phù hợp với hình cầu, vẫn cùng tên hàm nhưng khác phương thức tính toán.

Template: Sử dụng được đa kiểu

TÀI LIỆU
– Teach yourself visual c++ 6 in 21 days.
– Practical visual c++.
– MSDN library.

KIẾN THỨC VÀ YÊU CẦU
– Mảng.
– Con trỏ / con trỏ hàm.
– File.
– Lớp.
– Kế thừa.
– Template.
SO SÁNH GIỮA WINDOWS VÀ DOS
– Xử lý sự kiện dựa vào message / thực hiện tuần tự.
– Multi-tasking / single task.
– Multi CPU / single CPU.
CÁC THƯ VIỆN LẬP TRÌNH
*SDK:
gồm
– Bộ thư viện nền tảng.
– Các công cụ cần thiết.
– Được dùng như một thư viên cơ sở để tạo ra những thư viện cấp cao hơn trong ngôn ngữ lập trình VD: OWL của Borland, MFC (microsoft foundation class) của Microsoft.
*THÀNH PHẦN CỦA SDK:
– Win32 API (giao diện lập trình ứng dụng – application program interface)
– GDI / GDI+ (graphic device interface): điều khiển giao tiếp giữa các thiết bị, VD như điều khiển máy in.
– OpenGL.
– DirectX.
– COM / COM+.
– ADO (activeX data object)
ssrfs
CÁC LOẠI ỨNG DỤNG:
– Win32 Console.
– Win32 GUI.
– Win32 DLL. (động)
– Win32 Lib. (tĩnh)
– MFC EXE.
– MFC DLL.
MỘT SỐ KHÁI NIỆM
*HANDLE:
Vd: cấp mã cho CMND: mã ở đây có chức năng như handle, dùng để định danh một người nào đó. Hoặc mã sinh viên để định danh một sinh viên nào đó trong trường.
=> Handle dùng để định danh một cửa sổ, activity. Là một giá trị 32bit do hệ thống (OS) tạo ra để định danh cho đối tượng (cửa sổ, file, vùng nhớ, menu.).

*ID (Identifer):
=> Giá trị nguyên do ứng dụng tạo ra để định danh cho đối tượng.
*INSTANCE:
Vd: Có 2 cửa sổ notepad đang mở (cùng một chương trình nhưng 2 cửa sổ => Instance).
=>> Có nhiều bản sao của cùng ứng dụng trong bộ nhớ, mỗi bản sao là một instance.
– Dùng giá trị nguyên do OS tạo ra – > định danh instance đang thực thi của ứng dụng.
*CALLBACK:
=> Thuộc tính của hàm, được gọi bởi OS chứ không phải ứng dụng.
*PROCESS (Tiến trình):
=> Quá trình thực thi của một chương trình từ lúc khởi động -> kết thúc.
*THREAD:
Vd1: IDM chia nhỏ file ra khi download.
Vd2: Dẫn nước bằng ống, một ống sẽ không nhanh bằng nhiều ống.
– chạy song song, làm một lúc nhiều công việc.
– Một process có thể 1 hoặc nhiều thread.
LƯU Ý KHI VIẾT ỨNG DỤNG
– Không độc chiếm quyền điều khiển CPU.
– Không truy xuất trực tiếp vào bộ nhớ hay điều khiển thiết bị phần cứng như keyboard, mouse, monitor, các cổng serial và parallel.
– Không dùng các hàm như trên console: printf, scanf…
– Không dùng các hàm quản lý / cấp phát bộ nhớ trên C: malloc, calloc, free..

LẬP TRÌNH SỰ KIỆN
– Lập trình trên windows chính là lập trình giải quyết các sự kiện.
– Sự kiện được phát sinh từ keyboard, mouse đều được OS mã hóa dưới dạng các message và sau đó gửi tới ứng dụng.
– Message là phương tiện liên lạc chủ yếu của ứng dụng.

ghhg

CÁC THÀNH PHẦN (GUI)
*GUI:
– Thành phần quan trọng của windows.
– Tương tác với người dùng. – khác với console.
…..Các dạng GUI cơ bản:
– SDI (single document interface): Một cửa sổ làm việc, có thể thay đổi kích thước….
– MDI (multi document interface): Nhiều cửa sổ con, được maximize/minimize..Vd: Word, excel…
– DialLog-Base: Chứa các controls, kích thước cố định, có một cửa sổ làm việc. Vd: Calculator…

*CỬA SỔ (Windows):
– Cửa sổ: Vùng làm việc trên màn hình, tương tác người dùng / nhập xuất dữ liệu -> khi xây dựng ứng dụng Gui thì tạo cửa sổ trước tiên.
– Nguyên tắc quản lý: + Mô hình phân cấp, mỗi cửa sổ có cửa sổ cha (parent windows). + Tại mỗi thời điểm, chỉ có 1 cửa sổ nhận input từ user (chỉ active/focus window nhận).
– Mỗi cửa sổ làm việc xử lý message riêng
– Phân loại: desktop, standard..
– Các thành phần của một cửa sổ standard:

a
Còn lại là vùng “non-client”.
Lớp cửa sổ windows class.
– Một tập hợp các thuộc tính mà window (Wd) dùng làm khuôn mẫu khi tạo lập cửa sổ.
– Mỗi cửa sổ được đặc trưng bởi một tên (dạng chuỗi).
– Phân loại:
+ Lớp cửa sổ hệ thống: được định nghĩa bởi OS, các ứng dụng không thể hủy bỏ
+ Lớp cửa sổ do ứng dụng địng nghĩa: đăng ký bởi ứng dụng, có thể hủy khi không sử dụng nữa.
– Mỗi cửa sổ thuộc một lớp.
– Nhiều cửa sổ có thể được tạo ra từ 1 lớp.
– Đăng ký lớp cửa sổ: + Cấu trúc dữ liệu: WNDCLASS / WNDCLASSEX (xem MSDN lib).
CẤU TRÚC CỦA MỘT ỨNG DỤNG
– Hàm WinMain() duy nhất cho mỗi ứng dụng, là đầu vào cho mỗi ứng dụng.
+ Prototype:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpstrcmdline,
int nCmdShow);
Trong đó: hInstance là handle của instance hiện tại / hPreInstance là handle của instance trước đó của app, với win32 là NULL / lpstrcmdline chứa cmdline / cCmdShow: mỗi cửa sổ kết hợp với một window procedure (hàm xử lý message).
– Window Procedure: + Tiếp nhận xử lý message được gửi đến cho cửa sổ + dùng cho các cửa sổ cùng class + được gọi bởi Wd + Prototype: tên được đặt tùy ý
LRESVLT CALLBACK WndProc(HWND hWnd,
UINT mesage,
WPARAM wParam,
LPARAM lParam)
Trong đó: hWnd là handle của window nhận message / UINT là ID của message / wParam + lParam: tham số thứ 1/2 của message (mỗi message có 2 tham số).

tham khảo thêm WM_LBUTTONDOWN (left mouse)… wParam dùng kiểm tra xem có kèm theo nhấn phím gì hay không… lParam là địa chỉ chuột.
– Vòng lặp xử lý message (message loop): Wd đảm nhiệm và lưu trữ các message trong một hàng đợi (queue) của hệ thống (system queue) và phân bổ chúng vào các queue của từng ứng dụng. MsgLoop của mỗi ứng dụng lấy các msg từ queue của app và gửi tới Wd procedure, hoặc có những msg được gửi trực tiếp.

Vd khi ta bấm nút E trên bản phím:
E -> system queue -> queue app—– msgloop của ứng dụng—> wd procedure—-> testOut()—-> hiển thị ra cửa sổ.

Khi bấm nút sẽ có một message -> có 2 thông điệp.

Xây dựng một ứng dụng:

– Các thành phần:
+ mã nguồn.
+ resource (bitmap, cursor, dialog, menu..)
+ file phụ trợ (các file hướng dẫn: help/about)

– CÁC BƯỚC:
+ Đăng ký class, khai báo hàm xử lý message tương ứng cho wd class này.
+ Tạo main dialog
+ Cài đặt message loop
+ Cài đặt hàm xử lý message

  • hàm getMessage(x, y): lấy message từ queue app và quăng cho wd procedure xử lý.
  • translateMessage(x):xử lý message cho các phìm có thể in được..
  • WM_DESTROY: đây là message được sinh ra khi click (x) hoặc alt+F4.
  • postQuitMessage(o): sinh ra WM_QUIT. (nếu thấy trong queue có WM_QUIT -> dừng chương trình).
  • Muốn vẽ, xuất -> dùng WM_PAINT:
    BeginPaint();
    TextOut();
    EndPaint();

Nơi xử lý message gọi là message handler.
– WM_PAINT: sinh ra kể cả khi resize cửa sổ (được phát đi bất cứ lúc nào cần được vẽ lại)

Các kiểu dữ liệu cơ sở:
– LP: Long pointer
– LPVOID: kiểu bất kỳ
– LPSTR: kiểu string
– LPTSTR: string unicode
– PINT: pointer trỏ đến kiểu int
* kiểu liên quan đến handle:
– HINSTANCE: handle của instance
– HICON: handle của icon