. 클립보드 처리

사용자가 팝업메뉴를 선택하면 WM_COMMAND 메시지가 전달되고 이때 LOWORD(wParam)을 보면 어떤 메뉴항목을 선택했는지 알 수 있다. 각 팝업메뉴에 대한 핸들러를 OnCommand에 작성하였다.

 

void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     HGLOBAL hmem;

     TCHAR *ptr;

     int SelFirst, SelSecond;

 

     switch (id) {

     case IDM_AE_CUT:

          if (SelStart != SelEnd) {

               SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);

               DeleteSelection();

               InvalidateRect(hWnd,NULL,TRUE);

               SetCaret();

          }

          return;

     case IDM_AE_COPY:

          if (SelStart != SelEnd) {

               SelFirst=min(SelStart,SelEnd);

               SelSecond=max(SelStart,SelEnd);

               hmem=GlobalAlloc(GHND, SelSecond-SelFirst+1);

               ptr=(TCHAR *)GlobalLock(hmem);

               memcpy(ptr,buf+SelFirst,SelSecond-SelFirst);

               GlobalUnlock(hmem);

               if (OpenClipboard(hWnd)) {

                   EmptyClipboard();

                   SetClipboardData(CF_TEXT,hmem);

                   CloseClipboard();

               }

          }

          return;

     case IDM_AE_PASTE:

          if (IsClipboardFormatAvailable(CF_TEXT)) {

               DeleteSelection();

               OpenClipboard(hWnd);

               hmem=GetClipboardData(CF_TEXT);

               ptr=(TCHAR *)GlobalLock(hmem);

               Insert(off,ptr);

               GlobalUnlock(hmem);

               CloseClipboard();

               InvalidateRect(hWnd,NULL,TRUE);

               off += lstrlen(ptr);

               SetCaret();

          }

          return;

     case IDM_AE_SELALL:

          SelStart=0;

          SelEnd=lstrlen(buf);

          off=SelEnd;

          InvalidateRect(hWnd,NULL,TRUE);

          SetCaret();

          return;

     }

}

 

선택영역을 복사할 때는 선택영역 길이만큼 메모리를 할당해 복사한 후 클립보드에 넘겨주면 된다. 이때 선택영역은 반드시 정규화하여 길이와 시작위치를 제대로 계산해야 한다. 잘라내기는 복사와 DeleteSelection을 이어서 호출하면 간단하게 구현할 수 있다. 선택한 문자열이 삭제되므로 화면을 다시 그리고 캐럿도 옮겨야 한다.

붙여넣기는 클립보드로부터 CF_TEXT형 데이터를 읽어 문서에 Insert하면 되는데 붙여넣기 전에 선택영역이 있었다면 먼저 선택영역을 제거해야 한다. 붙여넣은 후 캐럿은 새로 삽입된 문자열의 끝으로 보내 주었다. 전체 선택은 정말 간단하다. SelStart는 문서의 처음으로 SelEnd는 문서의 끝으로 지정하여 문서 전체를 선택하고 캐럿은 문서의 끝으로 보내 주었다.

여기까지 작업한 후 실행해보자. 선택한 문장을 복사, 삭제, 잘라내기 할 수 있고 클립보드의 텍스트를 가져올 수도 있다. 그래서 이제부터는 테스트를 위해 매번 동해물과 백두산이~를 타이프할 필요없이 몇 개의 텍스트 문서를 만들어 놓고 붙여넣으면 될 것이다.