|
|
1.1 ! root 1: /**************************************************************************** ! 2: ! 3: PROGRAM: Cliptext.c ! 4: ! 5: PURPOSE: Demonstrates copying text to and from the clipboard ! 6: ! 7: FUNCTIONS: ! 8: ! 9: WinMain() - calls initialization function, processes message loop ! 10: InitApplication() - initializes window data and registers window ! 11: InitInstance() - saves instance handle and creates main window ! 12: MainWndProc() - processes messages ! 13: About() - processes messages for "About" dialog box ! 14: OutOfMemory() - displays warning message ! 15: ! 16: ****************************************************************************/ ! 17: ! 18: #include "cliptext.h" ! 19: #include <string.h> ! 20: ! 21: HANDLE hInst; ! 22: HANDLE hAccTable; ! 23: HWND hwnd; ! 24: ! 25: HANDLE hText = NULL; ! 26: ! 27: CHAR szInitialClientAreaText[] = ! 28: "This program demonstrates the use of the Edit menu to copy and " ! 29: "paste text to and from the clipboard. Try using the Copy command " ! 30: "to move this text to the clipboard, and the Paste command to replace " ! 31: "this text with data from another application. \r\n\r\n" ! 32: "You might want to try running Notepad and Clipbrd alongside this " ! 33: "application so that you can watch the data exchanges take place. "; ! 34: ! 35: HANDLE hData, hClipData; /* handles to clip data */ ! 36: LPSTR lpData, lpClipData; /* pointers to clip data */ ! 37: ! 38: /* functions declared here, because of MIPS lack of passing C_DEFINES*/ ! 39: BOOL InitApplication(HANDLE); ! 40: BOOL InitInstance(HANDLE, INT); ! 41: LONG APIENTRY MainWndProc(HWND, UINT, UINT, LONG); ! 42: BOOL APIENTRY About(HWND, UINT, UINT, LONG); ! 43: VOID OutOfMemory(VOID); ! 44: ! 45: /**************************************************************************** ! 46: ! 47: FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int) ! 48: ! 49: PURPOSE: calls initialization function, processes message loop ! 50: ! 51: ****************************************************************************/ ! 52: ! 53: int APIENTRY WinMain( ! 54: HANDLE hInstance, ! 55: HANDLE hPrevInstance, ! 56: LPSTR lpCmdLine, ! 57: int nCmdShow ! 58: ) ! 59: { ! 60: MSG msg; ! 61: ! 62: UNREFERENCED_PARAMETER( lpCmdLine ); ! 63: ! 64: if (!hPrevInstance) ! 65: if (!InitApplication(hInstance)) ! 66: return (FALSE); ! 67: ! 68: if (!InitInstance(hInstance, nCmdShow)) ! 69: return (FALSE); ! 70: ! 71: while (GetMessage(&msg, NULL, NULL, NULL)) { ! 72: ! 73: /* Only translate message if it is not an accelerator message */ ! 74: ! 75: if (!TranslateAccelerator(hwnd, hAccTable, &msg)) { ! 76: TranslateMessage(&msg); ! 77: DispatchMessage(&msg); ! 78: } ! 79: } ! 80: return (msg.wParam); ! 81: } ! 82: ! 83: ! 84: /**************************************************************************** ! 85: ! 86: FUNCTION: InitApplication(HANDLE) ! 87: ! 88: PURPOSE: Initializes window data and registers window class ! 89: ! 90: ****************************************************************************/ ! 91: ! 92: BOOL InitApplication(HANDLE hInstance) ! 93: { ! 94: WNDCLASS wc; ! 95: ! 96: wc.style = NULL; ! 97: wc.lpfnWndProc = (WNDPROC) MainWndProc; ! 98: wc.cbClsExtra = 0; ! 99: wc.cbWndExtra = 0; ! 100: wc.hInstance = hInstance; ! 101: wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); ! 102: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 103: wc.hbrBackground = GetStockObject(WHITE_BRUSH); ! 104: wc.lpszMenuName = "CliptextMenu"; ! 105: wc.lpszClassName = "CliptextWClass"; ! 106: ! 107: return (RegisterClass(&wc)); ! 108: } ! 109: ! 110: ! 111: /**************************************************************************** ! 112: ! 113: FUNCTION: InitInstance(HANDLE, int) ! 114: ! 115: PURPOSE: Saves instance handle and creates main window ! 116: ! 117: ****************************************************************************/ ! 118: ! 119: BOOL InitInstance( ! 120: HANDLE hInstance, ! 121: INT nCmdShow) ! 122: { ! 123: LPSTR lpszText; ! 124: ! 125: hInst = hInstance; ! 126: ! 127: hAccTable = LoadAccelerators(hInst, "ClipTextAcc"); ! 128: ! 129: if (!(hText ! 130: = GlobalAlloc(GMEM_MOVEABLE,(DWORD)sizeof(szInitialClientAreaText)))) { ! 131: OutOfMemory(); ! 132: return (FALSE); ! 133: } ! 134: ! 135: if (!(lpszText = GlobalLock(hText))) { ! 136: OutOfMemory(); ! 137: return (FALSE); ! 138: } ! 139: ! 140: strcpy(lpszText, szInitialClientAreaText); ! 141: GlobalUnlock(hText); ! 142: ! 143: hwnd = CreateWindow( ! 144: "CliptextWClass", ! 145: "Cliptext Sample Application", ! 146: WS_OVERLAPPEDWINDOW, ! 147: CW_USEDEFAULT, ! 148: CW_USEDEFAULT, ! 149: CW_USEDEFAULT, ! 150: CW_USEDEFAULT, ! 151: NULL, ! 152: NULL, ! 153: hInstance, ! 154: NULL ! 155: ); ! 156: ! 157: if (!hwnd) ! 158: return (FALSE); ! 159: ! 160: ShowWindow(hwnd, nCmdShow); ! 161: UpdateWindow(hwnd); ! 162: return (TRUE); ! 163: ! 164: } ! 165: ! 166: /**************************************************************************** ! 167: ! 168: FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG) ! 169: ! 170: PURPOSE: Processes messages ! 171: ! 172: MESSAGES: ! 173: ! 174: WM_COMMAND - message from menu ! 175: WM_INITMENU - initialize menu ! 176: WM_PAINT - update window ! 177: WM_DESTROY - destroy window ! 178: ! 179: COMMENTS: ! 180: ! 181: WM_INITMENU - when this message is received, the application checks ! 182: to see if there is any text data in the clipboard, and enables or ! 183: disables the Paste menu item accordingly. ! 184: ! 185: Seclecting the Copy menu item will send the text "Hello Windows" to ! 186: the clipboard. ! 187: ! 188: Seclecting the Paste menu item will copy whatever text is in the ! 189: clipboard to the application window. ! 190: ! 191: ****************************************************************************/ ! 192: ! 193: LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) ! 194: { ! 195: FARPROC lpProcAbout; ! 196: HDC hDC; ! 197: PAINTSTRUCT ps; ! 198: RECT rectClient; ! 199: LPSTR lpszText; ! 200: ! 201: switch (message) { ! 202: ! 203: case WM_INITMENU: ! 204: if (wParam == (UINT)GetMenu(hWnd)) { ! 205: if (OpenClipboard(hWnd)) { ! 206: if (IsClipboardFormatAvailable(CF_TEXT) ! 207: || IsClipboardFormatAvailable(CF_OEMTEXT)) ! 208: EnableMenuItem((HMENU)wParam, IDM_PASTE, MF_ENABLED); ! 209: else ! 210: EnableMenuItem((HMENU)wParam, IDM_PASTE, MF_GRAYED); ! 211: CloseClipboard(); ! 212: return (TRUE); ! 213: } ! 214: else /* Clipboard is not available */ ! 215: return (FALSE); ! 216: ! 217: } ! 218: return (TRUE); ! 219: ! 220: case WM_COMMAND: ! 221: switch(LOWORD(wParam)) { ! 222: case IDM_ABOUT: ! 223: lpProcAbout = MakeProcInstance((FARPROC)About, hInst); ! 224: DialogBox(hInst, "AboutBox", hWnd, (WNDPROC)lpProcAbout); ! 225: FreeProcInstance(lpProcAbout); ! 226: break; ! 227: ! 228: /* file menu commands */ ! 229: ! 230: case IDM_NEW: ! 231: case IDM_OPEN: ! 232: case IDM_SAVE: ! 233: case IDM_SAVEAS: ! 234: case IDM_PRINT: ! 235: MessageBox ( ! 236: GetFocus () ! 237: , "Command not implemented." ! 238: , "ClipText Sample Application" ! 239: , MB_ICONASTERISK | MB_OK ! 240: ); ! 241: break; ! 242: ! 243: case IDM_EXIT: ! 244: DestroyWindow(hWnd); ! 245: break; ! 246: ! 247: /* edit menu commands */ ! 248: ! 249: case IDM_UNDO: ! 250: case IDM_CLEAR: ! 251: MessageBox ( ! 252: GetFocus () ! 253: , "Command not implemented." ! 254: , "ClipText Sample Application" ! 255: , MB_ICONASTERISK | MB_OK ! 256: ); ! 257: break; ! 258: ! 259: case IDM_CUT: ! 260: case IDM_COPY: ! 261: ! 262: if (hText != NULL) { ! 263: ! 264: /* Allocate memory and copy the string to it */ ! 265: ! 266: if (!(hData ! 267: = GlobalAlloc(GMEM_DDESHARE, GlobalSize (hText)))) { ! 268: OutOfMemory(); ! 269: return (TRUE); ! 270: } ! 271: if (!(lpData = GlobalLock(hData))) { ! 272: OutOfMemory(); ! 273: return (TRUE); ! 274: } ! 275: if (!(lpszText = GlobalLock (hText))) { ! 276: OutOfMemory(); ! 277: return (TRUE); ! 278: } ! 279: strcpy(lpData, lpszText); ! 280: GlobalUnlock(hData); ! 281: GlobalUnlock (hText); ! 282: ! 283: /* Clear the current contents of the clipboard, and set ! 284: * the data handle to the new string. ! 285: */ ! 286: ! 287: if (OpenClipboard(hWnd)) { ! 288: EmptyClipboard(); ! 289: SetClipboardData(CF_TEXT, hData); ! 290: CloseClipboard(); ! 291: } ! 292: hData = NULL; ! 293: ! 294: if (LOWORD(wParam) == IDM_CUT) { ! 295: GlobalFree (hText); ! 296: hText = NULL; ! 297: EnableMenuItem(GetMenu (hWnd), IDM_CUT, MF_GRAYED); ! 298: EnableMenuItem(GetMenu(hWnd), IDM_COPY, MF_GRAYED); ! 299: InvalidateRect (hWnd, NULL, TRUE); ! 300: UpdateWindow (hWnd); ! 301: } ! 302: } ! 303: ! 304: return (TRUE); ! 305: ! 306: case IDM_PASTE: ! 307: if (OpenClipboard(hWnd)) { ! 308: ! 309: /* get text from the clipboard */ ! 310: ! 311: if (!(hClipData = GetClipboardData(CF_TEXT))) { ! 312: CloseClipboard(); ! 313: break; ! 314: } ! 315: if (hText != NULL) { ! 316: GlobalFree(hText); ! 317: } ! 318: if (!(hText = GlobalAlloc(GMEM_MOVEABLE ! 319: , GlobalSize(hClipData)))) { ! 320: OutOfMemory(); ! 321: CloseClipboard(); ! 322: break; ! 323: } ! 324: if (!(lpClipData = GlobalLock(hClipData))) { ! 325: OutOfMemory(); ! 326: CloseClipboard(); ! 327: break; ! 328: } ! 329: if (!(lpszText = GlobalLock(hText))) { ! 330: OutOfMemory(); ! 331: CloseClipboard(); ! 332: break; ! 333: } ! 334: strcpy(lpszText, lpClipData); ! 335: GlobalUnlock(hClipData); ! 336: CloseClipboard(); ! 337: GlobalUnlock(hText); ! 338: EnableMenuItem(GetMenu(hWnd), IDM_CUT, MF_ENABLED); ! 339: EnableMenuItem(GetMenu(hWnd), IDM_COPY, MF_ENABLED); ! 340: ! 341: /* copy text to the application window */ ! 342: ! 343: InvalidateRect(hWnd, NULL, TRUE); ! 344: UpdateWindow(hWnd); ! 345: return (TRUE); ! 346: } ! 347: else ! 348: return (FALSE); ! 349: } ! 350: break; ! 351: ! 352: case WM_SIZE: ! 353: InvalidateRect(hWnd, NULL, TRUE); ! 354: break; ! 355: ! 356: case WM_PAINT: ! 357: hDC = BeginPaint (hWnd, &ps); ! 358: if (hText != NULL) { ! 359: if (!(lpszText = GlobalLock (hText))) { ! 360: OutOfMemory(); ! 361: } else { ! 362: GetClientRect (hWnd, &rectClient); ! 363: DrawText (hDC, lpszText, -1, &rectClient ! 364: , DT_EXTERNALLEADING | DT_NOPREFIX | DT_WORDBREAK); ! 365: GlobalUnlock (hText); ! 366: } ! 367: } ! 368: EndPaint (hWnd, &ps); ! 369: break; ! 370: ! 371: case WM_DESTROY: ! 372: PostQuitMessage(0); ! 373: break; ! 374: ! 375: default: ! 376: return (DefWindowProc(hWnd, message, wParam, lParam)); ! 377: } ! 378: return (NULL); ! 379: } ! 380: ! 381: ! 382: /**************************************************************************** ! 383: ! 384: FUNCTION: About(HWND, unsigned, WORD, LONG) ! 385: ! 386: PURPOSE: Processes messages for "About" dialog box ! 387: ! 388: MESSAGES: ! 389: ! 390: WM_INITDIALOG - initialize dialog box ! 391: WM_COMMAND - Input received ! 392: ! 393: ****************************************************************************/ ! 394: ! 395: BOOL APIENTRY About( HWND hDlg, UINT message, UINT wParam, LONG lParam) ! 396: { ! 397: switch (message) { ! 398: case WM_INITDIALOG: ! 399: return (TRUE); ! 400: ! 401: case WM_COMMAND: ! 402: if (LOWORD(wParam) == IDOK ! 403: || LOWORD(wParam) == IDCANCEL) { ! 404: ! 405: EndDialog(hDlg, TRUE); ! 406: return (TRUE); ! 407: } ! 408: break; ! 409: } ! 410: return (FALSE); ! 411: UNREFERENCED_PARAMETER(lParam); ! 412: } ! 413: ! 414: ! 415: /**************************************************************************** ! 416: ! 417: FUNCTION: OutOfMemory(void) ! 418: ! 419: PURPOSE: Displays warning message ! 420: ! 421: ****************************************************************************/ ! 422: VOID OutOfMemory() ! 423: { ! 424: MessageBox( ! 425: GetFocus(), ! 426: "Out of Memory", ! 427: NULL, ! 428: MB_ICONHAND | MB_SYSTEMMODAL); ! 429: return; ! 430: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.