클립보드
마이크로소프트 윈도우즈 클립보드는 한 프로그램에서 다른 프로그램으로 데이터를 전송할 수 있게 해준다. 클립보드는 상대적으로 간단한 메커니즘으로, 클립보드에 데이터를 넣는 프로그램이나 나중에 여기에 접근하는 프로그램 모두에게 큰 오버헤드를 요구하지 않는다.
오늘은 데이터를 클립보드에 전송하고(잘라내기, 복사), 클립보드 데이터에 접근하는(붙이기)데 관련된 코드를 살펴보자.
표준 클립보드 데이터 포맷
클립보드 포맷은 접두사 CF로 시작하는 식별자가 WINUSER.H에 정의되어 있다.
CF_TEXT
NULL로 끝나는 ANSI 문자셋 문자열로, 각 행의 끝에 캐리지 리턴(carriage return)과 라인피드(linefeed) 문자를 포함한다.
가장 간단한 형태의 클립보드 데이터.
CF_OEMTEXT
텍스트 데이터를 포함하는 메모리 블록으로 ,OEM 문자셋을 사용한다. 대개 윈도우즈 프로그램은 이것에 대해 신경 안써도 된다.
CF_UNICODETEXT
유니코드 텍스트를 포함하는 메모리 블록이다.
이 포맷은 윈도우즈 NT 계열에서만 지원된다.
CF_LOCALE
로케일 식별자에 대한 핸들로서, 클립보드 텍스트와 연관된 로케일을 나타낸다.
CF_SYLK
마이크로소프트 '심볼릭 링크(symbolic link)' 포맷의 데이터를 포함하는 메모리 블록.
CF_DIF
DIF(Data Interchange Format) 데이터를 포함하는 메모리 블록.
CF_BITMAP
장치 의존적인(device-dependent) 비트맵
CF_DIB
장치 독립적인(device-independent) 비트맵을 정의하는 메모리 블록이다.
CF_PALETTE
색상 팔레트에 대한 핸들이다.
CF_DIB와 더불어 사용된다.
CF_TIFF
TIFF(Tag Image File Format) 데이터를 포함하는 메모리 블록.
CF_METAFILEPICT
윈도우즈 구형 메타파일 지원에 기반한 '메타파일 그림(metafile picture)'이다.
CF_ENHMETAFILE
32비트 버전의 윈도우즈가 지원하는 확장 메타파일(enhanced metafile)에 대한 핸들이다.
CF_PENDATA
윈도우즈 펜 확장과 더불어 사용된다.
CF_WAVE
사운드 파일이다.
CF_RIFF
RIFF(Resource Interchange File Format)로 저장된 멀티미디어 데이터다.
CF_HDROP
드래그 앤 드롭 서비스와 더불어 사용되는 파일 목록이다.
메모리 할당
프로그램이 어떤 것을 클립보드에 전송하려면, 반드시 메모리 블록을 할당하고 궁극적으로 이 메모리 블록을 클립보드에 넘겨 줘야 한다.
윈도우즈 API를 이용하여 메모리 블록을 할당하기 위해 다음과 같이 호출할 수 있다.
hGlobal = GlobalAlloc (uiFlags, // 가능한 일련의 플래그 지정
dwSize ); // 할당할 블록의 바이트 단위 크기
또한 다음과 같은 재할당 함수도 있다.
hGlobal = GlobalAlloc (hGlobal, dwSize, uiFlags );
메모리 블록의 크기를 얻기 위한 함수는..
dwSize = GlobalSize (hGlobal) ;
메모리 블록을 해제하는 함수는..
GlobalFree (hGlobal);
이다.
메모리 블록에 접근하려면 다음과 같이 호출한다.
p = (int *) GlobalLock (hGlobal);
블록에 대한 접근이 끝나면, 다음과 같이 호출한다.
GlobalUnlock (hGlobal) ;
메모리를 제거하고 싶으면 GlobalFree( )를 호출한다.
현재 핸들을 가지고 있지 않다면, 다음과 같이 핸들을 얻을 수 있다.
hGlobal = GlobalHandle (p) ;
클립보드에 텍스트 전송하기
1. 문자열을 저장하기에 충분한 크기의 메모리 블록을 GlobalAlloc() 을 호출하여 할당.
hGlobal = GlobalAlloc ( GHND | HMEM_SHARE, iLength + 1 );
2. 할당이 성공하면, 포인터를 얻기 위해 블록을 잠근다.
pGlobal = GlobalLock (hGlobal);
3. 전역 메모리 블록에 문자열을 복사한다.
for(i = 0; i < iLength; i++)
*pGlobal++ = *pString++;
4. 그리고 나서 블록을 푼다.
GlobalUnlock (hGlobal);
5. 클립보드에 넣으려면, 클립보드를 열어서 기존의 내용을 비운다.
OpenClipboard (hwnd);
EmpthClipboard ( );
6. CF_TEXT 식별자를 사용하여 클립보드에 메모리 핸들을 주고 ,클립보드를 닫는다.
SetClipboardData (CF_TEXT, hGlobal);
이것으로 끝났다.
클립보드에 텍스트를 전송하려면, 데이터를 준비한 후 네개의 함수를 호출해야 한다.
OpenClipboard (hwnd);
EmptyClipboard ( );
SetClipboardData (iFormat, hGlobal);
CloseClipboard ( );
데이터에 접근하려면 세개의 함수를 호출해야 한다.
OpenClipboard (hwnd);
hGlobal = GetClipboardData (iFormat);
[ 그밖의 프로그램 행]
CloseClipboard ( );
댓글 없음:
댓글 쓰기