4.2.5 클립보드 지원(복사 및 붙여넣기)
클립보드를 이용하면 다른 프로그램과 자료를 교환하기가 용이해진다. IppDib 클래스에서는 비트맵을 클립보드로 복사하는 기능과 클립보드에 있는 비트맵을 가져와서 DIB 객체를 만드는 기능을 제공한다. 클립보드 관련 멤버 함수 선언은 아래와 같다.
• BOOL CopyToClipboard(); • BOOL PasteFromClipboard();
CopyToClipboard 함수는 IppDib 객체가 가지고 있는 DIB 영상을 Windows 클립보드로 복사한다. 반대로 PasteFromClipboard 함수는 클립보드로부터 DIB 내용을 불러와서 IppDib 객체로 변환하는 함수이다. 이 두 함수들의 실제 구현은 소스 4-6에 나타내었으며, 소스 코드에 대한 자세한 설명을 주석으로 대체한다.
BOOL IppDib::CopyToClipboard() { if (!::OpenClipboard(NULL)) return FALSE; // DIB 전체를 전역 메모리 블럭에 복사 DWORD dwDibSize = GetDibSize(); HANDLE hDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, dwDibSize); if (hDib == NULL) { ::CloseClipboard(); return FALSE; } LPVOID lpDib = ::GlobalLock((HGLOBAL)hDib); memcpy(lpDib, GetBitmapInfoAddr(), dwDibSize); ::GlobalUnlock(hDib); // 클립보드에 데이터 입력 ::EmptyClipboard(); ::SetClipboardData(CF_DIB, hDib); ::CloseClipboard(); return TRUE; } BOOL IppDib::PasteFromClipboard() { // CF_DIB 타입이 아니면 종료한다. if (!::IsClipboardFormatAvailable(CF_DIB)) return FALSE; // 클립보드를 연다. if (!::OpenClipboard(NULL)) return FALSE; // 클립보드 내용을 받아 온다. HANDLE hDib = ::GetClipboardData(CF_DIB); if (hDib == NULL) { ::CloseClipboard(); return FALSE; } // 메모리 블럭의 크기는 DIB 전체 크기와 동일 DWORD dwSize = (DWORD)::GlobalSize((HGLOBAL)hDib); LPVOID lpDib = ::GlobalLock((HGLOBAL)hDib); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)lpDib; m_nWidth = lpbi->biWidth; m_nHeight = lpbi->biHeight; m_nBitCount = lpbi->biBitCount; DWORD dwWidthStep = (DWORD)((m_nWidth * m_nBitCount / 8 + 3) & ~3); DWORD dwSizeImage = m_nHeight * dwWidthStep; if (m_nBitCount == 24) m_nDibSize = sizeof(BITMAPINFOHEADER) + dwSizeImage; else m_nDibSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << m_nBitCount) + dwSizeImage; // 현재 설정된 IppDib 객체가 있다면 삭제한다. if (m_pDib) Destroy(); m_pDib = new BYTE[m_nDibSize]; if (m_pDib == NULL) { ::GlobalUnlock(hDib); ::CloseClipboard(); return FALSE; } memcpy(m_pDib, lpDib, m_nDibSize); ::GlobalUnlock(hDib); ::CloseClipboard(); return TRUE; }