25/05/2018, 08:12

Giới thiệu về Clipboard

Trong ví dụ sau đây chúng ta sẽ thử nghiệm làm việc với các chuỗi text trên Clipboard bằng ví dụ sau đây : Chương trình sẽ hoạt động như sau : Người dùng sẽ gõ nội dung vào h ộp C o p ...

Trong ví dụ sau đây chúng ta sẽ thử nghiệm làm việc với các chuỗi text trên Clipboard bằng ví dụ sau đây :

Chương trình sẽ hoạt động như sau :

Người dùng sẽ gõ nội dung vào hộpCopysau đó nhấn vào tCopy. Toàn bộ nội dung trong hộp Copy sẽ đưa vào trong Clipboard. (Chúng ta có thể Paste vào bất kỳ ứng dụng có soạn thảo nào để thử nghiệm).

Người dùng sẽ nhấn vào nútPaste. Toàn bộ nội dung có trong Clipboard hiện hành sẽ được hiển thị vào hộpPaste. (Chúng ta có thể Copy từ bất kỳ ứng dụng có soạn thảo nào để thử nghiệm).

Thiết lập thuộc tính cho hai hộp Copy và Paste như sau :

Đặt tên biến

Lần lượt đặt tên biến cho hộp Copy và hộp Paste với tên biến lần lượt như hình dưới đây (sử dụng ClassWizard).

Cài đặt

Viết hàm xử lý sự kiện cho nút nhấn Copy :

UpdateData();
        if (OpenClipboard())
        {
          HGLOBAL clipbuffer; char *buffer; EmptyClipboard();
          clipbuffer = GlobalAlloc(GMEM_DDESHARE, m_strCut.GetLength()+1);
          buffer = (char*)GlobalLock(clipbuffer);
          strcpy(buffer, LPCSTR(m_strCut)); 
          GlobalUnlock(clipbuffer); 
          SetClipboardData(CF_TEXT,clipbuffer); 
          CloseClipboard();
         }

Viết hàm xử lý sự kiện cho việc nhấn nút Paste.

char * buffer = NULL; CString fromClipboard; 
if ( OpenClipboard() )
  {
    HANDLE hData = GetClipboardData( CF_TEXT ); 
    char * buffer = (char*)GlobalLock( hData ); 
    fromClipboard = buffer;
    GlobalUnlock( hData );
   }
m_strPaste = fromClipboard;
UpdateData(FALSE);

Copy

Đoạn code dưới đây cho phép chúng ta copy một vùng màn hình trong chương trình từ vị trí (0,0) và có kích thước (200,200).

Để thực hiện việc copy, chúng ta phải cấp phát một vùng nhớ cho một con trỏ kiểu CBitmap (gắn liền với một Device Context ảo).

Sau đó chúng ta sẽ copy vùng màn hình mong muốn lên DC ảo. Trong ví dụ dưới đây, vùng màn hình được sao chép là một vùng hình chữ nhật có kích thước (0,0,200,200).

Đưa vùng màn hình trên DC ảo (nhờ vào con trỏ Bitmap) thông qua hàm SetClipboardDatavới tham số CF_BITMAP.

Sau khi đã đưa vùng màn hình mong muốn vào trong Clipboard rồi, chúng ta có thể huỷ con trỏ CBitmap được cấp phát lúc đầu.

void CBt10View::OnEditCopy()
{
  // TODO: Add your command handler code here 
  if ( OpenClipboard() )
    {
      EmptyClipboard();
       // Tạo DC ảo cùng với một Bitmap gắn với nó  
      CBitmap * junk = new CBitmap(); CClientDC cdc(this);
      CDC dc; 
      dc.CreateCompatibleDC(&cdc); 
      CRect client(0,0,200,200); junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
      dc.SelectObject(junk);
       //Chép vùng màn hình (0,0,200,200)lên DC ảo  
      dc.BitBlt(0,0,client.Width(), client.Height(),&m_VDC1, 0,0,SRCCOPY);
      SetClipboardData(CF_BITMAP,junk->m_hObject);
      CloseClipboard();
      delete junk;
     }
}

Paste

Đoạn code dưới đây minh hoạ việc dán vùng clipboard chứa hình ảnh (dạng bitmap) lên vùng client của chương trình tại vị trí (0,0).

Sử dụng hàm GetClipboardDatavới tham số CF_BITMAPđể lấy vùng nhớ bitmap trong clipboard.

Tạo ra một DC ảo mà nội dung của DC ảo này chính là phần hình ảnh vừa lấy được trên Clipboard.

Vẽ vùng DC ảo vừa có được lên device context của vùng client thông qua hàm BitBltvới tham số SRCCOPY.

void CBt10View::OnEditPaste()
{
 // TODO: Add your command handler code here 
  if ( OpenClipboard() )
    {
      //Get the clipboard data
      HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
      CBitmap * bm = CBitmap::FromHandle(handle);
      // Tạo DC ảo 
      CClientDC cdc(this); CDC dc;
      dc.CreateCompatibleDC(&cdc);
      dc.SelectObject(bm);
      // Chuyển xuống vùng Client mong muốn 
      m_VDC.BitBlt(0,0,800,600,&dc,0,0,SRCCOPY); 
      m_VDC1.BitBlt(0,0,800,600,&dc,0,0,SRCCOPY); 
      CloseClipboard();
      Invalidate(FALSE);
     }
}
Muốn tìm hiểu thêm chi tiết các hàm nếu trong bài hướng dẫn này, đọc thêm trong MSDN
  1. MSDN Library
  2. www.codeproject.com, bài “All you ever wanted about the Clipboard…” của Randy More.
0