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