|
|
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);
1.1.1.2 ! root 224: DialogBox(hInst, "AboutBox", hWnd, lpProcAbout);
1.1 root 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.