Lập trình C Windows
Lập trình C Windows Các kỹ thuật xử lý Clipboard Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Nội dung Giới thiệu Clipboard Các kiểu định dạng sử dụng Clipboard Các kỹ thuật sử dụng Clipboard C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] Giới thiệu Clipboard Clipboard ? Nhu cầu sử dụng Clipboard Các chế Clipboard Windows Giới thiệu tiện ích Clipboard Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] Giới thiệu Clipboard - Clipboard ? Clipboard vùng nhớ chung Windows mà tất ứng dụng truy cập đến Clipboard phương thức chuyển liệu chuẩn Windows cung cấp, cho phép chia xẻ thông tin ứng dụng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] Giới thiệu Clipboard - Nhu cầu sử dụng Clipboard Clipboard sử dụng để cài đặt cho thao tác thông dụng: Cut, Copy, Paste, Drag and Drop Một ứng dụng có nhu cầu đặt liệu vào Clipboard để sau ứng dụng khác (hoặc nó) truy xuất sử dụng Một ứng dụng nên chuyển liệu vào Clipboard có yêu cầu từ người sử dụng Không sử dụng Clipboard để chuyển liệu mà người sử dụng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] … - Các chế Clipboard Windows Cơ chế Windows Clipboard API chuẩn Cơ chế OLE Clipboard C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] … - Giới thiệu tiện ích Clipboard Viewer Clipboard Viewer cửa sổ hiển thị nội dung thời Clipboard Clipboard Viewer tiện ích hỗ trợ cho người sử dụng không tác động đến chức chuyển giao liệu Clipboard C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] … - Giới thiệu tiện ích Clipboard Viewer Có nhiều Clipboard Viewer chạy Windows thời điểm Tuy nhiên, Windows giữ handle Clipboard Viewer hành Chỉ có Clipboard Viewer hành Windows gửi thơng điệp có thay đổi nội dung Clipboard… …Clipboard Viewer hành có nhiệm vụ gửi thông điệp đến cho Clipboard Viewer khác chuỗi xích Clipboard Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [2] Các kiểu định dạng sử dụng Clipboard Giới thiệu Định dạng chuẩn Định dạng riêng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [2] Các kiểu định dạng … - Giới thiệu Dữ liệu chuyển vào Clipboard cần phải có định dạng định để chương trình sử dụng truy xuất xác Định dạng liệu xác định tham số uFormat hàm : SetClipboardData(UINT uFormat, HANDLE hMem) hMem handle khối nhớ chứa liệu có định dạng tương ứng với uFormat C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 10 [2] Các kiểu định dạng … - Giới thiệu Clipboard API chuẩn cho phép sử dụng kiểu định dạng sau đây: Các định dạng chuẩn Các định dạng riêng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 11 [2] Các kiểu định dạng … - Giới thiệu Lưu ý : Một ứng dụng lúc đặt nhiều đối tượng liệu vào Clipboard (bằng cách gọi liên tiếp hàm SetClipboardData), đối tượng thể nội dung liệu định dạng khác (và đơi có hàm lượng thông tin khác nhau) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 12 [2] Các kiểu định dạng … - Định dạng chuẩn Các định dạng Clipboard chuẩn (Standard Clipboard Formats) định dạng sử dụng cho Clipboard Windows hỗ trợ Định danh định dạng chuẩn định nghĩa Winuser.h C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 13 [2] Các kiểu định dạng … - Định dạng chuẩn Các định dạng sử dụng với liệu text: CF_TEXT: liệu chuỗi ký tự ANSI , dòng kết thúc với ký tự carriage return linefeed (CR,LF) Ký tự NULL báo hiệu kết thúc liệu CF_UNICODETEXT: liệu chuỗi ký tự Unicode, dòng chấm dứt CR,LF Ký tự NULL (2 byte 0) báo hiệu kết thúc liệu Chỉ hỗ trợ môi trường Windows NT/2000/XP CF_OEMTEXT: tương tự CF_TEXT sử dụng cho tập ký tự OEM C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 14 [2] Các kiểu định dạng … - Định dạng chuẩn Định dạng sử dụng với bitmap: CF_BITMAP : handle bitmap (HBITMAP) CF_DIB: khối nhớ định nghĩa Device Independent Bitmap (DIB), bắt đầu cấu trúc BITMAPINFO, theo sau bit bitmap CF_DIBV5: khối nhớ chứa cấu trúc BITMAPV5HEADER, theo sau thông tin bảng màu bit bitmap C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 15 [2] Các kiểu định dạng … - Định dạng chuẩn Định dạng sử dụng cho liệu Metafile: CF_METAFILEPICT: Metafile Picture đuợc định nghĩa cấu trúc METAFILEPICT, dựa hỗ trợ metafile cũ Windows CF_ENHMETAFILE: handle metafile mở rộng (HENHMETAFILE) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 16 [2] Các kiểu định dạng … - Định dạng chuẩn Một số định dạng khác: CF_HDROP: Một danh sách tập tin sử dụng với dịch vụ cắt/dán file, kéo/thả file CF_PALETE: handle bảng màu, thường sử dụng kết hợp liệu đặt vào Clipboard phụ thuộc vào bảng màu Ngoài ra, số định dạng: CF_WAVE, CF_SYLK, CF_DIF, CF_TIFF, CF_PENDATA, CF_RIFF, CF_LOCALE định dạng kết hợp với định dạng liệu riêng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 17 [2] Các kiểu định dạng … - Định dạng chuẩn Hệ thống tự thực việc chuyển đổi định dạng liệu định dạng sau: CF_TEXT, CF_OEMTEXT, CF_UNICODETEXT CF_BITMAP, CF_DIB, CF_DIBV5 Từ CF_DIB CF_DIBV5 sang CF_PALETE CF_METAFILEPICT, CF_ENHMETAFILE C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 18 [2] Các kiểu định dạng … - Định dạng riêng Nhu cầu: Nhiều ứng dụng làm việc với định dạng riêng Nếu chuyển liệu vào Clipboard định dạng chuẩn khơng bảo tồn thơng tin Muốn chuyển liệu bảng tính qua lại ứng dụng Excel phải sử dụng định dạng riêng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 19 [2] Các kiểu định dạng … - Định dạng riêng Phương pháp: Windows cho phép chương trình sử dụng định dạng liệu riêng cho theo cách sau: Cách 1: Đăng ký định dạng (Registered Clipboard Formats) với hàm… … UINT RegisterClipboardFormat (LPCTSTR lpszFormat) lpszFormat: tên định dạng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 20 10 [3] … - Nhận liệu … - Ví dụ (Định dạng chuẩn) VD.1: Nhận text từ Clipboard char *szText; // Chứa liệu if (OpenClipboard()) { // Nhận handle vùng nhớ HANDLE hData = GetClipboardData(CF_TEXT); if (hData != NULL) { // Lấy trỏ tương ứng char *pData = (char *)GlobalLock(hData); szText = new char[strlen(pData)+1]; strcpy(szText, pData); // Copy liệu GlobalUnlock(hData); // Bỏ khố khối } // Đóng Clipboard CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 69 [3] … - Nhận liệu … - Ví dụ (Định dạng chuẩn) Ví dụ 2: Nhận bitmap từ Clipboard // Mở Clipboard if (OpenClipboard()) { // Lấy handle bitmap HBITMAP hBitmap = (HBITMAP) GetClipboardData(CF_BITMAP); if (hBitmap != NULL) { // Tạo chép bitmap ……………… } // Đóng Clipboard CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 70 35 [3] … - Nhận liệu … - Ví dụ (Định dạng chuẩn) VD.3: Nhận liệu định dạng CF_HDROP Khi nhận liệu định dạng CF_HDROP từ Clipboard, sử dụng hàm DragQueryFile để đọc danh sách tên file khối nhớ UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch) hDrop : handle cấu trúc HDROP iFile : số danh sách Giá trị -1: hàm trả số lượng phần tử danh sách lpszFile : lưu chuỗi kết cch : số ký tự lpszFile C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 71 [3] … - Nhận liệu … - Ví dụ (Định dạng chuẩn) Ví dụ 3:…(tt) if (OpenClipboard()) { // Lấy handle khối nhớ HDROP hDrop = (HDROP) GetClipboardData(CF_HDROP); if (hDrop) { // Đếm số tên flle danh sách int nCount = DragQueryFile(hDrop, (UINT) -1, NULL, 0); // Duyệt danh sách tên file if (nCount) { TCHAR szFile[MAX_PATH]; for (int i=0; i < nCount; i++) { DragQueryFile(hDrop, i, szFile, sizeof(szFile)/sizeof(TCHAR)); // Xử lý tương ứng với tên file …………………… } } } CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 72 36 [3] … - Nhận liệu … - Ví dụ (Định dạng riêng) VD.4: Nhận cấu trúc mơ tả hình trịn struct CIRCLE strCircle; // Lưu kết if (OpenClipboard()) { HANDLE hData = GetClipboardData(nID); struct CIRCLE *p = (struct CIRCLE *) GlobalLock(hData); // Sao chép liệu strCircle.center = p center; …… GlobalUnlock(hData); CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 73 [3] Các kỹ thuật … - Truy vấn nhiều định dạng Các hàm thường dùng Các ví dụ C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 74 37 [3] Các kỹ thuật … - Truy vấn nhiều định dạng Xảy Clipboard có nhiều liệu với định dạng khác Các hàm thường sử dụng: Tên hàm Mô tả CountClipboardFormats Đếm số định dạng Clipboard EnumClipboardFormats Duyệt qua định dạng IsClipboardFormatAvailable Xác định định dạng có Clipboard hay khơng GetPriorityClipboardFormat Xác định định dạng có Clipboard từ danh sách ưu tiên định dạng C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 75 [3] Các kỹ thuật … - Truy vấn nhiều định dạng VD.1: Xác định CF_TEXT có Clipboard ? if (OpenClipboard()) { if (IsClipboardFormatAvailable(CF_TEXT)) { // Lấy liệu … …… } CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 76 38 [3] Các kỹ thuật … - Truy vấn nhiều định dạng VD.2: Duyệt qua danh sách định dạng if (OpenClipboard()) { UINT nFormat = 0; // Bắt đầu duyệt từ vị trí while (nFormat = EnumClipboardFormats(nFormat)) { // nFormat chứa ID format // Clipboard … } CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 77 [3] Các kỹ thuật … - Truy vấn nhiều định dạng VD.3: truy xuất liệu Clipboard dựa danh sách định dạng có độ ưu tiên UINT nFormats[3] = { nID, // ưu tiên CF_TEXT, // ưu tiên CF_BITMAP // ưu tiên }; if (OpenClipboard()) { UINT nFormat = GetPriorityClipboardFormat(nFormats, 3); if (nFormat > 0) { // nFormat chứa định dạng liệu // Clipboard trùng với nID, CF_TEXT, CF_BITMAP ………… } CloseClipboard(); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 78 39 [3] Các kỹ thuật … - Xây dựng Clipboard Viewer Chuỗi xích Clipboard Viewer Các thơng điệp liên quan Một số hàm thơng dụng Ví dụ C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 79 [3] … - Clipboard Viewer - Chuỗi xích Clipboard Viewer Các ứng dụng Clipboard Viewer phải tham gia vào “chuỗi xích Clipboard Viewer” Trong chuỗi xích Clipboard Viewer có Clipboard Viewer hành trực tiếp nhận thông điệp từ Windows có thay đổi nội dung Clipboard thay đổi chuỗi xích Clipboard Viewer Các Clipboard Viewer có nhiệm vụ gửi thơng điệp đến cho Clipboard Viewer đứng kề sau chuỗi xích Clipboard Viewer (trừ viewer cuối cùng) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 80 40 [3] … - Clipboard Viewer - Chuỗi xích Clipboard Viewer Ứng dụng tham gia vào chuỗi xích Clipboard Viewer cách gọi hàm SetClipboardViewer: HWND hWndNextViewer = SetClipboardViewer(hWndNewViewer); (MFC) HWND CWnd::SetClipboardViewer() hWndNewViewer: handle cửa sổ đưa vào chuỗi xích Clipboard Viewer Cửa sổ thêm vào Clipboard Viewer hành Trả handle cửa sổ Clipboard Viewer liền sau chuỗi xích, NULL cửa sổ Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 81 [3] … - Clipboard Viewer - Chuỗi xích Clipboard Viewer Các Clipboard Viewer phải lưu giữ handle Viewer kề sau chuỗi xích Clipboard Viewer (Nhận gọi hàm SetClipboardViewer thay đổi có thơng điệp WM_CHANGECBCHAIN) Các Clipboard Viewer sử dụng hàm SendMessage để gửi thơng điệp đến cho Clipboard Viewer liền sau (ngoại trừ viewer cuối cùng) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 82 41 [3] … - Clipboard Viewer - Chuỗi xích Clipboard Viewer Khi chương trình muốn gỡ khỏi Clipboard Viewer chain, gọi hàm ChangeClipboardChain: BOOL ChangeClipboardChain(HWND hWndRemove, HWND hWndNext); (MFC) BOOL CWnd::ChangeClipboardChain (HWND hWndNext); hWndRemove: handle cửa sổ muốn gỡ khỏi chuỗi xích Clipboard Viewer hWndNext: handle cửa sổ nằm liền sau hWndRemove chuỗi xích Clipboard Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 83 [3] … - Clipboard Viewer – Các thông điệp liên quan Thông điệp WM_DRAWCLIPBOARD: Được gửi đến cho cửa sổ Clipboard Viewer có thay đổi nội dung Clipboard Viewer nhận thông điệp cần cập nhật lại vùng hiển thị cho phù hợp với nội dung Clipboard Viewer sau xử lý thông điệp gửi thông điệp đến cho Viewer kế C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 84 42 [3] … - Clipboard Viewer – Các thông điệp liên quan Thông điệp WM_CHANGECBCHAIN: Được gửi đến cho Clipboard Viewer có Viewer gọi hàm ChangeClipboardChain wParam: handle cửa sổ gỡ khỏi chuỗi xích lParam: handle cửa sổ liền sau cửa sổ gỡ khỏi chuỗi Nếu Viewer nhận wParam handle cửa sổ liền sau (hWndNextViewer), cập nhật lại hWndNextViewer =(HWND) lParam; …Nếu không, chuyển thông điệp đến cho Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 85 [3] … - Clipboard Viewer – Các thông điệp liên quan Các thông điệp: WM_ASKCBFORMATNAME WM_PAINTCLIPBOARD WM_SIZECLIPBOARD WM_VSCROLLCLIPBOARD WM_HSCROLLCLIPBOARD Được cửa sổ Clipboard Viewer gửi đến chủ Clipboard cần hiển thị liệu có định dạng CF_OWNERDISPLAY C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 86 43 [3] … - Clipboard Viewer – Một số hàm thông dụng HWND GetClipboardOwner(void): Trả handle cửa sổ chủ Clipboard Nếu Clipboard khơng có chủ, trả NULL (Clipboard có liệu khơng có chủ) UINT EnumClipboardFormats(UINT uFormat): Liệt kê định dạng có Clipboard Thực việc liệt kê với tham số uFormat =0 cho lần gọi hàm đầu tiên, lần gọi sau uFormat định dạng trả từ lần gọi trước Nếu thành công, trả định dạng Clipboard Nếu trả hàm GetLastError trả ERROR_SUCCESS, khơng cịn định dạng Clipboard C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 87 [3] … - Clipboard Viewer – Một số hàm thông dụng int GetClipboardFormatName(UINT uFormat, LPSTR lpszFormatName, int iMaxLength): Hàm lấy tên định dạng đăng ký uFormat: định danh định dạng lpszFormatName: trỏ buffer nhận tên định dạng iMaxLength: chiều dài tối đa buffer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 88 44 [3] … - Clipboard Viewer – Ví dụ // xử lý thơng điệp WM_CREATE int CMainWindow::OnCreate (LPCREATESTRUCT lpCreateStruct) { // tham gia vào Clipboard Viewer chain hWndNextViewer = SetClipboardViewer(); …… return 0; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 89 [3] … - Clipboard Viewer – Ví dụ // xử lý thông điệp WM_CHANGECBCHAIN void CMainWindow::OnChangeCbChain (HWND hWndRemove, HWND hWndAfter) { // cập nhật lại handle window // chain if (hWndRemove==hWndNextViewer) hWndNextViewer = hWndAfter; else if (hWndNextViewer != NULL) SendMessage(hWndNextViewer, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, (LPARAM)hWndAfter); return 0; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 90 45 [3] … - Clipboard Viewer – Ví dụ // xử lý thông điệp WM_DESTROY void CMainWindow::OnDestroy() { // gỡ khỏi chuỗi xích ChangeClipboardChain(hWndNextViewer); … PostQuitMessage(0); return 0; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 91 [3] … - Clipboard Viewer – Ví dụ // xử lý thông điệp WM_DRAWCLIPBOARD void CMainWindow::OnDrawClipboard() { if (hWndNextViewer != NULL ) SendMessage(hWndNextViewer, WM_DRAWCLIPBOARD, 0, 0L); // cập nhật lại vùng hiển thị: InvalidateRect(NULL, TRUE); return 0; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 92 46 [3] … - Clipboard Viewer – Ví dụ // xử lý message WM_PAINT với định dạng // uFormat = CF_TEXT void CMainWindow::OnPaint() { RECT rc; CPaintDC dc(this); if (OpenClipboard()) { HGLOBAL hGlobal = GetClipboardData(uFormat); if (hGlobal != NULL) { LPSTR lpstr= (LPSTR) GlobalLock(hGlobal); GetClientRect(&rc); dc.DrawText(lpstr, -1, &rc, DT_LEFT); GlobalUnlock(hGlobal); } CloseClipboard(); } } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 93 [3] … - Clipboard Viewer – Ví dụ Xử lý thơng điệp WM_PAINT với định dạng CF_OWNERDISPLAY: Một ứng dụng đưa liệu vào Clipboard dùng định dạng CF_OWNERDISPLAY SetClipboardData(CF_OWNERDISPLAY, NULL); Khi đó, chủ Clipboard có trách nhiệm: Xử lý thông điệp gửi đến từ Clipboard Viewer để hiển thị cập nhật cửa sổ Clipboard Viewer C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 94 47 [3] … - Clipboard Viewer – Ví dụ // Xử lý thông điệp WM_PAINT với định dạng // CF_OWNERDISPLAY void CMainWindow::OnPaint() { CPaintDC dc(this); HWND hWndOwner = GetClipboardOwner(); // chuẩn bị thông tin cấu trúc PAINTSTRUCT // để gởi cho cửa sổ chủ Clipboard HGLOBAL hGlobal = GlobalAlloc(MEM_MOVEABLE, sizeof(PAINTSTRUCT)); LPPAINTSTRUCT lpps = GlobalLock(hGlobal); CopyMemory(lpps, &dc.m_ps, sizeof(PAINTSTRUCT)); C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 95 [3] … - Clipboard Viewer – Ví dụ GlobalUnlock(hGlobal); // gửi thông điệp cho cửa sổ chủ Clipboard // yêu cầu vẽ SendMessage(hWndOwner, WM_PAINTCLIPBOARD, (WPARAM) m_hWnd, (LPARAM) hGlobal); // huỷ khối nhớ toàn cục sau sử dụng GlobalFree(hGlobal); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 96 48 Cám ơn - Hỏi & Đáp C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 97 49 ... DH.KHTN Tp.HCM 13/06/2003 38 19 [3] … - Chuyển liệu … – C? ?c bư? ?c C? ?c bư? ?c cần th? ?c để chuyển liệu vào Clipboard: Bư? ?c 1: Mở Clipboard với hàm OpenClipboard Bư? ?c 2: Loại bỏ liệu c? ? Clipboard với... WM_RENDERALLFORMATS: Windows gởi cho chủ Clipboard trư? ?c ứng dụng chủ Clipboard kết th? ?c Khi đó, Clipboard c? ??n chứa handle liệu NULL Chủ Clipboard c? ??n: mở Clipboard, xóa Clipboard, chuyển tất liệu vào Clipboard... Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] … - C? ?c chế Clipboard Windows C? ? chế Windows Clipboard API chuẩn C? ? chế OLE Clipboard C4 W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13/06/2003 [1] …