1. Trang chủ
  2. » Công Nghệ Thông Tin

Kỹ thuật xử lý Clipboard (phần 5) pps

7 358 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 57,82 KB

Nội dung

41 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM81 [3] …-Clipboard Viewer -Chuỗi xích Clipboard Viewer ® Các Clipboard Viewer phải lưu giữ handle của Viewer kề sau nótrong chuỗi xích Clipboard Viewer. (Nhận được khi gọi hàm SetClipboardViewer vàcóthể thay đổi khi 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 nó(ngoại trừ viewer cuối cùng) Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM82 [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 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 trong chuỗi xích Clipboard Viewer 42 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM83 [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 khi cósự thay đổi nội dung Clipboard § Viewer khi nhận thông điệp cần cập nhật lại vùng hiển thị của mình cho phùhợp với nội dung Clipboard mới § Viewer sau khi xử lý thông điệp sẽ gửi thông điệp đến cho Viewer kế Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM84 [3] …-Clipboard Viewer –Các thông điệp liên quan ® Thông điệp WM_CHANGECBCHAIN: § Được gửi đến cho các Clipboard Viewer khi có một Viewer gọi hàm ChangeClipboardChain. § wParam: handle của cửa sổ được gỡ khỏi chuỗi xích § lParam: handle của cửa sổ liền sau cửa sổ được gỡ khỏi chuỗi. § Nếu Viewer nhận ra wParam làhandle của cửa sổ liền sau (hWndNextViewer), nósẽcập nhật lại hWndNextViewer =(HWND) lParam; § …Nếu không, chuyển thông điệp đến cho Viewer kế tiếp. 43 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM85 [3] …-Clipboard Viewer –Vídụ // cài đặt cửa sổ thành Clipboard Viewer // tại thời điểm xử lý thông điệp WM_CREATE int CMainWindow::OnCreate (LPCREATESTRUCT lpCreateStruct) { // tham gia vào Clipboard Viewer chain hWndNextViewer = SetClipboardViewer(); …… return 0; } Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM86 [3] …-Clipboard Viewer –Vídụ // xử lý thông điệp WM_DRAWCLIPBOARD // à hiển thị nội dung Clipboard 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; } 44 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM87 [3] …-Clipboard Viewer –Vídụ // hiển thị nội dung Clipboard bằng cách // xử lý message WM_PAINT // 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(); } } Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM88 [3] …-Clipboard Viewer –Vídụ // xử lý thông điệp WM_CHANGECBCHAIN // khi có1 Clipboard Viewer trong chuỗi xích bị loại void CMainWindow::OnChangeCbChain (HWND hWndRemove, HWND hWndAfter) { // cập nhật lại Viewer kế tiếp // trong chain if (hWndRemove==hWndNextViewer) hWndNextViewer = hWndAfter; else if (hWndNextViewer != NULL) SendMessage(hWndNextViewer, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, (LPARAM)hWndAfter); return 0; } 45 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM89 [3] …-Clipboard Viewer –Vídụ // kết thúc Clipboard Viewer // xử lý thông điệpWM_DESTROY void CMainWindow::OnDestroy() { //gỡbỏViewer khỏi chuỗi xích ChangeClipboardChain(hWndNextViewer); … PostQuitMessage(0); return 0; } Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM90 [3] …-Clipboard Viewer –Owner display ® Một ứng dụng khi đưa dữ liệu vào Clipboard cóthể dùng định dạng CF_OWNERDISPLAY SetClipboardData(CF_OWNERDISPLAY, NULL); ® Khi đó, chủ Clipboardcótrách nhiệm: Xử lý các thông điệp được gửi đến từ Clipboard Viewer để hiển thị vàcập nhật cửa sổ Clipboard Viewer (thay cho Clipboard Viewer) 46 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM91 [3] …-Clipboard Viewer –Owner display // 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)); Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM92 [3] …-Clipboard Viewer –Owner display 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 khi đã sử dụng GlobalFree(hGlobal); } 47 Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM93 Cám ơn -Hỏi & Đáp . tham gia vào Clipboard Viewer chain hWndNextViewer = SetClipboardViewer(); …… return 0; } Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM86 [3] … -Clipboard Viewer –Vídụ // xử lý thông. DT_LEFT); GlobalUnlock(hGlobal); } CloseClipboard(); } } Sprint 2006C4W -Clipboard -Nguyen Tri Tuan -DH.KHTN Tp.HCM88 [3] … -Clipboard Viewer –Vídụ // xử lý thông điệp WM_CHANGECBCHAIN // khi có1 Clipboard Viewer trong. đưa dữ liệu vào Clipboard cóthể dùng định dạng CF_OWNERDISPLAY SetClipboardData(CF_OWNERDISPLAY, NULL); ® Khi đó, chủ Clipboardcótrách nhiệm: Xử lý các thông điệp được gửi đến từ Clipboard Viewer

Ngày đăng: 09/07/2014, 15:21

TỪ KHÓA LIÊN QUAN

w