Tải bản đầy đủ (.pdf) (7 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (57.82 KB, 7 trang )

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

×