intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

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

Chia sẻ: Nguyen Kien | Ngày: | Loại File: PDF | Số trang:7

86
lượt xem
13
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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)

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật xử lý Clipboard (phần 5)

  1. [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) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 81 [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 C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 82 41
  2. [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ế C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 83 [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. C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 84 42
  3. [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; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 85 [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; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 86 43
  4. [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(); } } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 87 [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; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 88 44
  5. [3] … - Clipboard Viewer – Ví dụ // kết thúc Clipboard Viewer // xử lý thông điệp WM_DESTROY void CMainWindow::OnDestroy() { // gỡ bỏ Viewer khỏi chuỗi xích ChangeClipboardChain(hWndNextViewer); … PostQuitMessage(0); return 0; } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 89 [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ủ Clipboard có 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) C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 90 45
  6. [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)); C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 91 [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); } C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 92 46
  7. Cám ơn - Hỏi & Đáp C4W - Clipboard - Nguyen Tri Tuan - DH.KHTN Tp.HCM Sprint 2006 93 47
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2