|
|
1.1 ! root 1: /*--------------------- file identification ------------------------*/ ! 2: ! 3: /* ! 4: cliptest.c ! 5: ! 6: Puts a short string onto the clipboard in response ! 7: to a Copy menu command. ! 8: ! 9: This program is used in combination with clip.exe ! 10: to test the capabilities of the pm clipboard. ! 11: ! 12: Wed April 6, 1988 ! 13: Dan Weston (c-danw) ! 14: ! 15: POTENTIAL PROBLEMS: pm version 4.19 ! 16: ! 17: --The whole clipboard mechanism does not work ! 18: unless there is some sort of shell (pmshell or funtest) ! 19: running first. ( This is not really a problem, just ! 20: something to look out for. ) ! 21: ! 22: SEE ALSO: ! 23: ! 24: the program clipshow.exe will put retrieve the ! 25: current contents of the clipboard. ! 26: ! 27: */ ! 28: ! 29: ! 30: /*---------------------- include files -----------------------------*/ ! 31: #define INCL_PM ! 32: #define INCL_GPI ! 33: #define INCL_DOS ! 34: #include <string.h> ! 35: #include <os2.h> ! 36: #include "clipput.h" ! 37: ! 38: /*-------------------------- global variables ----------------------*/ ! 39: ! 40: /* clipboard stuff */ ! 41: CHAR szClipMessage[256] = ""; ! 42: ! 43: /* message stuff */ ! 44: HMQ hmqTheMessageQueue; ! 45: HAB habTheAnchorBlock; ! 46: ! 47: /* window stuff */ ! 48: char szClassName[] = "cliptest"; /* our window class name */ ! 49: HWND hwndClient; /* handle to the client */ ! 50: HWND hwndFrame; /* handle to the frame window */ ! 51: HWND hwndEdit; ! 52: ! 53: /* measurement variables */ ! 54: RECTL rclRun; ! 55: USHORT cxChar,cyChar; ! 56: ! 57: /*------------------------------ main ------------------------------*/ ! 58: ! 59: BOOL main() ! 60: ! 61: { ! 62: /* ! 63: * local constants ! 64: */ ! 65: #define USE_DEF_QUEUE_SIZE 0 ! 66: ! 67: /* ! 68: * local variables ! 69: */ ! 70: QMSG qmsg; ! 71: ! 72: /* ! 73: * initialize this application thread's use of the PM ! 74: */ ! 75: habTheAnchorBlock = WinInitialize (NULL) ; ! 76: ! 77: /* ! 78: * create a message queue for this application thread ! 79: */ ! 80: hmqTheMessageQueue = WinCreateMsgQueue ! 81: (habTheAnchorBlock, USE_DEF_QUEUE_SIZE) ; ! 82: /* ! 83: * initialize the application ! 84: */ ! 85: if (!GenericInit()) ! 86: return(FALSE); /* failed loading */ ! 87: ! 88: /* ! 89: * run the main event loop ! 90: */ ! 91: while ( WinGetMsg ( (HAB)NULL, &qmsg, (HWND)NULL, 0, 0 ) ) ! 92: WinDispatchMsg( (HAB)NULL, &qmsg ); ! 93: ! 94: ! 95: /* ! 96: * kill the window ! 97: */ ! 98: WinDestroyWindow( hwndFrame ); ! 99: ! 100: /* ! 101: * PM cleanup ! 102: */ ! 103: WinDestroyMsgQueue( hmqTheMessageQueue ); ! 104: WinTerminate( habTheAnchorBlock ); ! 105: } ! 106: ! 107: ! 108: /*--------------------- GenericInit -------------------------*/ ! 109: BOOL GenericInit() { ! 110: ULONG lControlStyle = FCF_TITLEBAR | FCF_SYSMENU | ! 111: FCF_SIZEBORDER | FCF_MINMAX | FCF_MENU; ! 112: ! 113: ! 114: if (!WinRegisterClass( habTheAnchorBlock, ! 115: szClassName, ! 116: (PFNWP)GenericWndProc, ! 117: CS_SIZEREDRAW, ! 118: 0)) ! 119: return( FALSE ); ! 120: ! 121: hwndFrame = WinCreateStdWindow( HWND_DESKTOP, ! 122: 0L, ! 123: &lControlStyle, ! 124: szClassName, ! 125: "cliptest", ! 126: 0L, ! 127: NULL, ! 128: ID_RESOURCE, /* resource ID from .rc file */ ! 129: &hwndClient); ! 130: ! 131: WinSetWindowPos(hwndFrame, /* window */ ! 132: HWND_TOP, /* window behind */ ! 133: 50, /* x pos */ ! 134: 50, /* y pos */ ! 135: 300, /* x size */ ! 136: 100, /* y size */ ! 137: SWP_ACTIVATE|SWP_SIZE|SWP_MOVE|SWP_SHOW); /* flags */ ! 138: ! 139: WinQueryWindowRect(hwndFrame,&rclRun); ! 140: /* Create the edit control now that we've sized */ ! 141: hwndEdit = WinCreateWindow(hwndClient, WC_ENTRYFIELD, (PSZ)NULL, ! 142: WS_VISIBLE | ES_AUTOSCROLL | ES_MARGIN, ! 143: 5 * cxChar, ((rclRun.yTop - rclRun.yBottom) / 2)- cyChar, ! 144: cxChar * 27, cyChar, ! 145: hwndClient, HWND_TOP, ! 146: WID_EDIT, (PVOID)NULL, (PVOID)NULL); ! 147: ! 148: ! 149: WinSetFocus(HWND_DESKTOP,hwndEdit); ! 150: ! 151: if (!hwndFrame) ! 152: return(FALSE); ! 153: ! 154: return(TRUE); ! 155: } ! 156: ! 157: /*---------------- the main window procedure --------------------------*/ ! 158: MRESULT FAR PASCAL GenericWndProc( hwnd, usMessage, mp1, mp2 ) ! 159: HWND hwnd; ! 160: USHORT usMessage; ! 161: MPARAM mp1; ! 162: MPARAM mp2; ! 163: { ! 164: HPS hps; ! 165: RECTL rect; ! 166: FONTMETRICS fm; ! 167: ! 168: switch (usMessage) { ! 169: case WM_CREATE: ! 170: hps = WinGetPS(hwnd); ! 171: GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS), &fm); ! 172: WinReleasePS(hps); ! 173: ! 174: cxChar = fm.lAveCharWidth; ! 175: cyChar = fm.lMaxBaselineExt - fm.lMaxDescender; ! 176: break; ! 177: ! 178: case WM_PAINT: ! 179: hps = WinBeginPaint(hwnd,NULL,&rect); ! 180: WinFillRect(hps,&rect,CLR_WHITE); ! 181: WinEndPaint(hps); ! 182: break; ! 183: ! 184: case WM_COMMAND: ! 185: DoMenuCommand(hwnd,LOUSHORT (mp1)); ! 186: break; ! 187: default: ! 188: return( WinDefWindowProc( hwnd, usMessage, mp1, mp2 ) ); ! 189: } ! 190: return(0L); ! 191: } ! 192: ! 193: /*--------------------------- AboutProc -----------------------------*/ ! 194: MRESULT FAR PASCAL AboutProc (hwnd, usMessage, ! 195: mp1, mp2) ! 196: ! 197: HWND hwnd ; ! 198: USHORT usMessage ; ! 199: MPARAM mp1 ; ! 200: MPARAM mp2 ; ! 201: ! 202: { ! 203: /* case out on the message */ ! 204: switch (usMessage) ! 205: { ! 206: case WM_COMMAND: ! 207: switch (LOUSHORT (mp1)) ! 208: { ! 209: case DID_OK: ! 210: WinDismissDlg(hwnd,0); ! 211: break; ! 212: } ! 213: break; ! 214: default: ! 215: return ( WinDefDlgProc (hwnd, usMessage, ! 216: mp1, mp2) ) ; ! 217: } ! 218: return (0L) ; ! 219: } ! 220: ! 221: /*---------------------------- DoMenuCommand -----------------------*/ ! 222: ULONG DoMenuCommand(hwnd, usMenuID) ! 223: ! 224: HWND hwnd; ! 225: USHORT usMenuID; ! 226: { ! 227: SEL sel; ! 228: PSZ pszDest,pszSrc; ! 229: BOOL fSuccess; ! 230: USHORT usSuccess; ! 231: USHORT usLen; ! 232: ! 233: switch (usMenuID) ! 234: ! 235: { ! 236: case IDM_ED_COPY: ! 237: if (WinOpenClipbrd(habTheAnchorBlock)) ! 238: { ! 239: /* copy the edit window to the clip message string */ ! 240: usLen = WinQueryWindowText(hwndEdit,80,szClipMessage); ! 241: usSuccess =DosAllocSeg(usLen + 1, ! 242: &sel, ! 243: SEG_GIVEABLE); ! 244: pszDest = MAKEP(sel,0); ! 245: pszSrc = &szClipMessage[0]; ! 246: while (*pszDest++ = *pszSrc++); ! 247: WinEmptyClipbrd(habTheAnchorBlock); ! 248: fSuccess = WinSetClipbrdData(habTheAnchorBlock, ! 249: (ULONG)sel, ! 250: CF_TEXT, ! 251: CFI_SELECTOR); ! 252: WinCloseClipbrd(habTheAnchorBlock); ! 253: ! 254: } ! 255: break; ! 256: case IDM_FI_QUIT: ! 257: /* Don't use WinSENDMsg here */ ! 258: WinPostMsg(hwnd,WM_CLOSE,0L,0L); ! 259: break; ! 260: case IDM_FI_ABOUT: ! 261: /* this is a modal dialog */ ! 262: WinDlgBox(HWND_DESKTOP , ! 263: hwndFrame, ! 264: (PFNWP)AboutProc, ! 265: NULL, ! 266: IDD_ABOUT, ! 267: NULL); ! 268: break; ! 269: ! 270: default: ! 271: break; ! 272: ! 273: } ! 274: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.