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