Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
236,87 KB
Nội dung
Lập trình Windows Ôn tập kỹ thuật xử lý Winform Các vấn đề cần nắm Trao đổi liệu Form Attribute ngôn ngữ C# Sử dụng hàm thư viện dll C++ C# Trao đổi liệu Form Với ứng dụng WinForms, số trường hợp cần phải trao đổi liệu từ form sang form khác Dựa vào kiến thức C# đề suất phương pháp sau: Sử dụng phương thức khởi tạo (Constructor) Sử dụng đối tượng tham chiếu (reference object) Sử dụng thuộc tính lớp đối tượng (properties) Sử dụng delegates Sử dụng events Trao đổi liệu Form (tt) Sử dụng phương thức khởi tạo (Constructor) Ưu điểm: đơn giản, dễ sử dụng, cần tạo phương thức khởi tạo cho Form cần nhận liệu có tham số phù hợp Nhược điểm: truyền liệu lúc khởi tạo Form Trao đổi liệu Form (tt) Sử dụng đối tượng tham chiếu (reference object) Cách thức cài đặt: Form cần nhận liệu gán tham chiếu đến Form truyền liệu, đồng thời phải public thành phần cần lấy liệu Nhược điểm: liệu cần truyền gồm nhiều thành phần cài đặt dài dòng tính đóng gói lớp Trao đổi liệu Form (tt) Sử dụng thuộc tính lớp đối tượng (properties) Cách thức cài đặt: tạo Properties liệu cần truyền Nhược điểm: cài đặt dài dòng phụ thuộc việc cài đặt hành động Form truyền Trao đổi liệu Form (tt) Sử dụng delegates Cách thức cài đặt: form truyền liệu khai báo delegate với liệu tương ứng, form nhận tạo hàm tiếp nhận delegate Ưu điểm: việc hành xử cụ thể Form nhận định Nhược điểm: cài đặt cần kiến thức delegates Cần nắm giữ đối tượng delegate Trao đổi liệu Form (tt) Sử dụng events Hoàn toàn tương tự phương pháp sử dụng delegates, điểm khác thay events Ưu điểm: hành động Form nhận định đồng thời việc cài đặt thời điểm xảy phương thức tùy ý Attribute ngôn ngữ C# Attribute dùng để đánh dấu (marker) cho phương thức hay lớp chí đối số riêng phương thức nhằm cung cấp thông tin thêm mục Để áp dụng attribute đến mục ta cung cấp tên attribute ngoặc vuông trước định nghĩa mục Các attribute có thông số, thông số cung cấp bên dấu ngoặc theo sau tên attribute Attribute Conditional: đánh dấu phương thức với attribute Conditional để ngăn ngừa trình biên dịch biên dịch phương thức hay dòng lệnh tham chiếu đến tên biểu tượng không định nghĩa Thường dùng cho điều kiện biên dịch Ví dụ: //hàm thực có define TEST [Conditional("TEST")] void doTest(ref string str) { str = "doTest"; } Attribute (Dllimport) Bảng kiểu liệu thông dụng tương ứng Kiểu native code Kiểu managed code (.NET) bool System.Boolean char System.Sbyte Unsigned char System.Byte int System.Int32 double System.Double short System.Int16 pointer System.IntPtr LPTSTR (chuỗi thay đổi) System.Text.StringBuilder Attribute (Dllimport) Truyền kiểu liệu cấu trúc (struct) Sử dụng Attribute StructLayout với thuộc tính thông thường là: LayoutKind.Sequential (truyền struct kiểu tuần tự, đầy đủ) LayoutKind.Explicit (chỉ sử dụng vài trường struct, kết hợp với Attribute FieldOffset) Dùng Attribute MarshalAs mảng kích thước cố định Truyền kiểu liệu trỏ hàm: sử dụng delegate CallBack Attribute (Dllimport) Ví dụ Hàm C++ (gói “dllCPlus.dll”): int Test(int a, int b) { return a + b; } Import hàm vào C#: [DllImport("dllCPlus.dll", EntryPoint = "Test")] public static extern int Test(int a, int b); Ví dụ Hàm C++ struct PhanSo { int tu, mau; }; PhanSo GetPhanSo(int tu, int mau) { PhanSo ps; ps.tu = tu; ps.mau = mau; return ps; } Import hàm vào C# [StructLayout(LayoutKind.Sequential)] public struct PhanSo { public int tu; public int mau; } [DllImport("dllCPlus.dll")] public static extern PhanSo GetPhanSo(int tu, int mau); Ví dụ Hàm C++ int SoLonNhat(int a, int b, int c, int (*funcSoSanh)(int, int)) { int kq = a; if (funcSoSanh(kq, b) < 0) { kq = b; } if (funcSoSanh(kq, c) < 0) { kq = c; } return kq; } Import hàm vào C# //khai báo delegate để làm tham số trỏ hàm public delegate int FuncSoSanh(int a, int b); //import hàm [DllImport("dllCPlus.dll", CallingConvention = CallingConvention.StdCall)] public static extern int SoLonNhat(int a, int b, int c, FuncSoSanh func); Sử dụng hàm thư viện dll C++ C# Trong lập trình WinForm NET tất hàm hỗ trợ tương tác hệ thống từ WinAPI Đôi với nhu cầu cần tương tác sâu với hệ thống như: lấy thông tin file hệ thống đầy đủ nhất, lấy thông tin sổ bất kỳ, truyền thông điệp,… cần phải sử dụng hàm WinAPI (các dll chủ yếu “user32.dll”, “kernel.dll”, “shell32.dll”,…) Giải pháp sử dụng DllImport Lấy thông tin icon file/folder hệ thống Cần sử dụng hàm WinAPI Shell Thư viện cần quan tâm “shell32.dll” Các hàm cần quan tâm SHGetFileInfo SHGetSpecialFolderLocation Hàm SHGetFileInfo DWORD_PTR SHGetFileInfo( _In_ LPCTSTR pszPath, DWORD dwFileAttributes, _Inout_ SHFILEINFO *psfi, UINT cbFileInfo, UINT uFlags ); pszPath: chuỗi đường dẫn file/folder dwFileAttributes: thường set psfi: trỏ trỏ tới struct SHFILEINFO cbFileInfo: kích thước SHFILEINFO uFlags: cờ để chọn cách lấy thông tin (kiểu SHGFI_xxx) typedef struct _SHFILEINFO { HICON hIcon; int iIcon; DWORD dwAttributes; TCHAR szDisplayName[MAX_PATH]; TCHAR szTypeName[80]; } SHFILEINFO; Hàm SHGetSpecialFolderLocation HRESULT SHGetSpecialFolderLocation( _In_ HWND hwndOwner, _In_ int nFolder, _Out_ PIDLIST_ABSOLUTE *ppidl ); hwndOwner: handle sổ cha nFolder: kiểu CSIDL định lựa chọn SpecialFolder (.NET có kiểu tương tự Environment.SpecialFolder) ppidl: kiểu PIDLIST_ABSOLUTE, lưu giá trị trả SpecialFolder để truyền vào SHGetFileInfo Ví dụ cách lấy icon hệ thống Import hàm cần dùng vào C# Struct SHFILEINFO [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct SHFILEINFO { public IntPtr hIcon; public int iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; Flags SHGFI [Flags] enum SHGFI : int { Icon = 0x000000100, DisplayName = 0x000000200, TypeName = 0x000000400, Attributes = 0x000000800, IconLocation = 0x000001000, ExeType = 0x000002000, SysIconIndex = 0x000004000, LinkOverlay = 0x000008000, Selected = 0x000010000, Attr_Specified = 0x000020000, LargeIcon = 0x000000000, SmallIcon = 0x000000001, OpenIcon = 0x000000002, ShellIconSize = 0x000000004, PIDL = 0x000000008, UseFileAttributes = 0x000000010, AddOverlays = 0x000000020, OverlayIndex = 0x000000040, } Hàm SHGetFileInfo [DllImport("shell32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SHGetFileInfo(IntPtr pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, SHGFI uFlags); Hàm SHGetSpecialFolderLocation [DllImport("shell32.dll", SetLastError = true)] static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, Environment.SpecialFolder nFolder, ref IntPtr ppidl); Hàm DetroyIcon [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DestroyIcon(IntPtr hIcon); [...]... Trong lập trình WinForm trên nền NET không có tất cả các hàm hỗ trợ tương tác hệ thống từ WinAPI Đôi khi với nhu cầu cần tương tác sâu với hệ thống như: lấy thông tin file hệ thống đầy đủ nhất, lấy thông tin của sổ bất kỳ, truyền thông điệp,… thì cần phải sử dụng các hàm của WinAPI (các dll chủ yếu “user32.dll”, “kernel.dll”, “shell32.dll”,…) Giải pháp là sử dụng DllImport Lấy thông tin icon file/folder... dữ liệu thông dụng tương ứng Kiểu của native code Kiểu của managed code (.NET) bool System.Boolean char System.Sbyte Unsigned char System.Byte int System.Int32 double System.Double short System.Int16 pointer System.IntPtr LPTSTR (chuỗi thay đổi) System.Text.StringBuilder Attribute cơ bản (Dllimport) Truyền kiểu dữ liệu cấu trúc (struct) Sử dụng Attribute StructLayout với 2 thuộc tính thông thường... (struct) Sử dụng Attribute StructLayout với 2 thuộc tính thông thường là: LayoutKind.Sequential (truyền struct kiểu tuần tự, đầy đủ) hoặc LayoutKind.Explicit (chỉ sử dụng một vài trường trong struct, luôn kết hợp với Attribute FieldOffset) Dùng Attribute MarshalAs đối với các mảng kích thước cố định Truyền kiểu dữ liệu con trỏ hàm: sử dụng delegate CallBack Attribute cơ bản (Dllimport) Ví dụ 1...Attribute cơ bản Obsolete: attribute này được dùng để đánh dấu 1 phương thức được xem như obsolete ( không dùng nữa) Tuỳ thuộc vào việc thiết lập trên attribute này, trình biên dịch sẽ sinh ra 1 cảnh báo hay lỗi nếu nó gặp bất kỳ dòng lệnh nào cố gắng dùng phương thức này Ví dụ: //sẽ báo lỗi biên dịch... UINT uFlags ); pszPath: chuỗi đường dẫn file/folder dwFileAttributes: thường set là 0 psfi: con trỏ trỏ tới struct SHFILEINFO cbFileInfo: kích thước SHFILEINFO uFlags: cờ để chọn cách lấy thông tin (kiểu SHGFI_xxx) typedef struct _SHFILEINFO { HICON hIcon; int iIcon; DWORD dwAttributes; TCHAR szDisplayName[MAX_PATH]; TCHAR szTypeName[80]; } SHFILEINFO; Hàm SHGetSpecialFolderLocation HRESULT ... Form Attribute ngôn ngữ C# Sử dụng hàm thư viện dll C++ C# Trao đổi liệu Form Với ứng dụng WinForms, số trường hợp cần phải trao đổi liệu từ form sang form khác Dựa vào kiến thức C# đề... SoLonNhat(int a, int b, int c, FuncSoSanh func); Sử dụng hàm thư viện dll C++ C# Trong lập trình WinForm NET tất hàm hỗ trợ tương tác hệ thống từ WinAPI Đôi với nhu cầu cần tương tác sâu với