5.3- Ảnh & biểu tượngB1 Nạp biểu tượng vào chương trình B2 Thay đổi tham số lớp cửa sổ AfxGetApp là lệnh lấy đối tượng chương trình HICON a = AfxGetApp -> LoadIcon ID-icon ; HCURSOR b
Trang 1Chương 5- Lập trình tài nguyên
Trang 25.1- Tài nguyên & cách tổ chức
ứng dụng.
án chương trình.
có thể dùng tệp resource.h để định nghĩa.
#define NAME
resource.h
5
Use
*.cpp
tài nguyên
*.rc
Trang 35.2- Thực đơn (menu)
Cách tạo: VC tool / script
language
có ID, Popup,
Caption,…
đối tượng Cmenu, gồm
các thao tác:
ID-menu MENU { POPUP “tên-mục”
{ MENUITEM “tên-mục” , ID-item
}
.
MENUITEM “tên-mục” , ID-item
}
Trang 45.2- Thực đơn (menu)…
thông điệp, mỗi item là một hàm xử lý & được ánh
xạ bằng:
CMenu a;
a.LoadMenu( ID-menu );
SetMenu( &a );
ON_COMMAND( ID-item, tên-hàm )
CMenu :: TrackPopupMenu( flags, x,y, parent );
flags = { TPM_LEFTALIGN, }
Trang 55.2- Thực đơn (menu)…
CMenu * CWnd :: GetSystemMenu( 0 );
Trang 65.3- Ảnh & biểu tượng
B1) Nạp biểu tượng vào chương trình
B2) Thay đổi tham số lớp cửa sổ
AfxGetApp() là lệnh lấy đối tượng chương trình
HICON a = AfxGetApp() -> LoadIcon( ID-icon );
HCURSOR b = AfxGetApp() -> LoadCursor( ID-cursor );
SetClassLong( HWND , kiểu , (long) định-danh );
where : kiểu là GCL_HICON/HCURSOR; định-danh từ bước 1
Trang 75.3- Ảnh & biểu tượng…
CBitmap a ;
a LoadBitmap( ID-bitmap );
CDC b ; b.CreateCompatibleDC( );
b.SelectObject( &a );
BitBlt (x,y,w,h, &b, x’, y’, mode );
CImageList :: Create( bitmapID, cx, num_Img, mask_color );
CImageList :: Draw( CDC *dc, int img, POINT pt, UINT style);
where : style=ILD_NORMAL,
Trang 85.3- Ảnh & biểu tượng…
bằng lệnh
CMenu :: SetMenuItemBitmaps( ID-pos , flag , Cbitmap *b1, Cbitmap *b2);
where : ID-pos là ID hoặc vị trí mục chọn, flag = MF_BYCOMMAND/BYPOSITION, b1 là ảnh uncheck, b2 là ảnh check
Trang 95.4 Hộp thoại & lớp CDialog
Hộp thoại là một dạng cửa sổ đặc biệt, nó được tạo sẵn trong tài nguyên chương trình và định danh bằng số hiệu (ID-Dialog)
Trên hộp thoại là các đối tượng điều khiển như: static, editbox, button,
Ví dụ một hộp thoại:
Các điều khiển có thể tạo Hộp thoại đã được tạo
Số hiệu hộp thoại
Trang 105.4 Hộp thoại & lớp CDialog
Hộp thoại được định nghĩa như sau, hoặc tạo bằng công cụ VC
số-hiệu-dialog DIALOG
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION “title”
FONT size,name
{
tên_điều_khiển “text / caption” , số-hiệu , x,y, w,h, style }
Các đối tượng điều khiển đơn giản gồm
Tên điều khiển Ý nghĩa Tham số kiểu - style
LTEXT Văn bản tĩnh SS_CENTER, SS_ICON,
EDITTEXT Nhập văn bản ES_MULTILINE, ES_PASSWORD,
PUSHBUTTON Nút bấm BS_PUSHBUTTON, BS_CHECKBOX, BS_RADIOBUTTON, LISTBOX Danh sách LBS_SORT, LBS_STANDARD, LBS_MULTIPLESEL,
COMBOBOX Ô chọn CBS_DROPDOWN, CBS_SIMPLE,
Trang 115.4 Hộp thoại & lớp CDialog
Hộp thoại được quản lý bởi đối tượng lớp CDialog, gồm các phương thức xử lý sau:
CDialog( số-hiệu-dialog );
int CDialog :: DoModal();
void CDialog :: OnOk(); hoặc OnCancel()
Để xác định các đối tượng điều khiển và xử lý ta sử dụng hàm sau, ép kiểu về đối tượng tương ứng
biến_trỏ = (Kiểu_lớp *) CDialog :: GetDlgItem( số_hiệu_điều_khiển );
Các lớp tương ứng các điều khiển đơn giản: CStatic, CEdit, CButton, CListBox, CComboBox
Cách lập trình hộp thoại và các điều khiển trên đó
B1) Xây dựng lớp hộp thoại kế thừa CDialog (nếu cần)
B2) Tạo đối tượng hộp thoại và đặt vào số hiệu hộp thoại đã định nghĩa
B3) Lập trình các phương thức trong lớp hộp thoại và sử dụng các biến trỏ lớp ứng với các điều khiển để xác định dữ liệu trên các điều khiển của hộp thoại.
Trang 125.4 Hộp thoại & lớp CDialog
Minh họa cho ví dụ
Lớp hộp thoại CD (kế thừa CDialog)
CString name, pass;
void OnOk() {
CEdit *edit1 = (CEdit*)GetDlgItem(IDC_EDIT1); CEdit *edit2 = (CEdit*)GetDlgItem(IDC_EDIT2); edit1->GetWindowText(name);
edit2->GetWindowText(pass);
CDialog::OnOK();
}
Trang 135.4 Các lớp xử lý control objects
Các thư viện <afxext.h> & <afxcmn.h> & <afxdtctl.h>
CMonthCalCtrl Chọn ngày tháng
CButton Nút lệnh, đánh dấu, chọn
CListBox Danh sách chọn
CComboBox Danh sách chọn
CScrollBar Thanh cuộn
CSpinButtonCtrl Hộp tăng giảm
CProgressCtrl Thanh chỉ báo
CSliderCtrl Thanh trượt
CListCtrl Danh sách các mục
CTreeCtrl Cây các mục
CTabCtrl Thẻ chọn
Trang 145.? LT biểu tượng khay hệ thống
Câu lệnh:
Shell_NotifyIcon ( NIM_ADD , NOTIFYICONDATA * );
NOTIFYICONDATA { cbSize, hIcon, hWnd, szTip,
uCallbackMessage, uFlags, uID }
uFlags = NIF_ICON+NIF_MESSAGE+NIF_TIP
Xử lý thông điệp trên biểu tượng: ánh xạ thông điệp tới một hàm lớp cửa sổ
ON_MESSAGE ( uCallbackMessage, tên_hàm )
Mẫu hàm xử lý cho thông điệp trên
void tên_hàm ( WPARAM t1, LPARAM t2 ) { … }
t2 = thông điệp trên biểu tượng (WM_RBUTTONDOWN )
Trang 155.5 Đối tượng thanh công cụ
Lớp xử lý là CToolBar (hoặc CToolBarCtrl), các bước tạo thanh công cụ như sau:
B1) Tạo một tài nguyên các nút lệnh của ToolBar
B2) Khai báo một đối tượng lớp CToolBar (thuộc lớp cửa sổ)
B3) Tạo một thanh công cụ cho đối tượng trên bằng lệnh
CToolBar :: Create( cửa-sổ-chứa );
B4) Nạp các nút lệnh từ tài nguyên vào đối tượng toolbar bằng lệnh
CToolBar :: LoadToolbar( số-hiệu );
B5) Hiển thị lên cửa sổ bằng các lệnh sau:
CToolBar :: EnableDocking( kiểu={CBRS_ALIGN_ANY, } );
CFrameWnd :: EnableDocking( kiểu={CBRS_ALIGN_ANY, } );
CFrameWnd :: DockControlBar( đối-tượng-toolbar );
Xử lý thông điệp khi chọn nút lệnh tương tự như thực đơn, có thể ánh xạ xử lý từng nút lệnh hoặc nhiều nút lệnh:
Trang 165.6 Đối tượng thanh trạng thái
Lớp xử lý là CStatusBar (hoặc CStatusBarCtrl), các bước tạo như sau:
B1) Tạo danh sách xâu ký tự trong tài nguyên để hiển thị trên trạng thái (nếu cần)
B2) Khai báo một đối tượng lớp CStatusBar (thuộc lớp cửa sổ)
B3) Tạo một thanh công cụ cho đối tượng trên bằng lệnh
CStatusBar :: Create( cửa-sổ-chứa );
B4) Đặt các thành phần trên thanh trạng thái
CStatusBar :: SetIndicators( UINT* p, int n );
CStatusBar :: SetPaneText ( index, xâu-ký-tự );
CStatusBar :: SetPaneInfo ( index, id, style, width );
style = {SBPS_NORMAL, }
Các bước trên thực hiện sau lệnh Create() tạo cửa sổ và trước lệnh hiển thị cửa sổ.