|
|
1.1 root 1: /*-------------------------------------
2: HELLOBIT.C -- "Hello, world" Bitmap
3: -------------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #include <os2.h>
8:
9: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
10:
11: HAB hab ;
12:
13: int main (void)
14: {
15: static CHAR szClientClass [] = "HelloBit" ;
16: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
17: FCF_SIZEBORDER | FCF_MINMAX |
18: FCF_SHELLPOSITION | FCF_TASKLIST ;
19: HMQ hmq ;
20: HWND hwndFrame, hwndClient ;
21: QMSG qmsg ;
22:
23: hab = WinInitialize (0) ;
24: hmq = WinCreateMsgQueue (hab, 0) ;
25:
26: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
27:
28: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
29: &flFrameFlags, szClientClass, NULL,
30: 0L, NULL, 0, &hwndClient) ;
31:
32: WinSendMsg (hwndFrame, WM_SETICON,
33: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
34: NULL) ;
35:
36: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
37: WinDispatchMsg (hab, &qmsg) ;
38:
39: WinDestroyWindow (hwndFrame) ;
40: WinDestroyMsgQueue (hmq) ;
41: WinTerminate (hab) ;
42: return 0 ;
43: }
44:
45: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
46: {
47: static CHAR szHello [] = " Hello, world " ;
48: static HBITMAP hbm ;
49: static HDC hdcMemory ;
50: static HPS hpsMemory ;
51: static SHORT cxClient, cyClient, cxString, cyString ;
52: BITMAPINFOHEADER bmp ;
53: HPS hps ;
54: POINTL aptl [4], ptl ;
55: SHORT x, y ;
56: SIZEL sizl ;
57:
58: switch (msg)
59: {
60: case WM_CREATE:
61:
62: /*-------------------------------------------------
63: Open memory DC and create PS associated with it
64: -------------------------------------------------*/
65:
66: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
67:
68: sizl.cx = 0 ;
69: sizl.cy = 0 ;
70: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
71: PU_PELS | GPIF_DEFAULT |
72: GPIT_MICRO | GPIA_ASSOC) ;
73:
74: /*-------------------------------------
75: Determine dimensions of text string
76: -------------------------------------*/
77:
78: GpiQueryTextBox (hpsMemory, sizeof szHello - 1L,
79: szHello, 4L, aptl) ;
80:
81: cxString = (SHORT) (aptl [TXTBOX_TOPRIGHT].x -
82: aptl [TXTBOX_TOPLEFT].x) ;
83:
84: cyString = (SHORT) (aptl [TXTBOX_TOPLEFT].y -
85: aptl [TXTBOX_BOTTOMLEFT].y) ;
86:
87: /*-------------------------------------------
88: Create bitmap and set it in the memory PS
89: -------------------------------------------*/
90:
91: bmp.cbFix = sizeof bmp ;
92: bmp.cx = cxString ;
93: bmp.cy = cyString ;
94: bmp.cPlanes = 1 ;
95: bmp.cBitCount = 1 ;
96:
97: hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, 0L, NULL) ;
98:
99: GpiSetBitmap (hpsMemory, hbm) ;
100:
101: /*----------------------------------------
102: Write the text string to the memory PS
103: ----------------------------------------*/
104:
105: ptl.x = 0 ;
106: ptl.y = - aptl [TXTBOX_BOTTOMLEFT].y ;
107:
108: GpiSetColor (hpsMemory, CLR_TRUE) ;
109: GpiSetBackColor (hpsMemory, CLR_FALSE) ;
110: GpiSetBackMix (hpsMemory, BM_OVERPAINT) ;
111: GpiCharStringAt (hpsMemory, &ptl, sizeof szHello - 1L,
112: szHello) ;
113: return 0 ;
114:
115: case WM_SIZE:
116: cxClient = SHORT1FROMMP (mp2) ;
117: cyClient = SHORT2FROMMP (mp2) ;
118: return 0 ;
119:
120: case WM_PAINT:
121: hps = WinBeginPaint (hwnd, NULL, NULL) ;
122:
123: for (y = 0 ; y <= cyClient / cyString ; y++)
124: for (x = 0 ; x <= cxClient / cxString ; x++)
125: {
126: aptl[0].x = x * cxString ; // target lower left
127: aptl[0].y = y * cyString ;
128:
129: aptl[1].x = aptl[0].x + cxString ; // upper right
130: aptl[1].y = aptl[0].y + cyString ;
131:
132: aptl[2].x = 0 ; // source lower left
133: aptl[2].y = 0 ;
134:
135: GpiBitBlt (hps, hpsMemory, 3L, aptl, ROP_SRCCOPY,
136: BBO_AND) ;
137: }
138: WinEndPaint (hps) ;
139: return 0 ;
140:
141: case WM_DESTROY:
142: GpiDestroyPS (hpsMemory) ;
143: DevCloseDC (hdcMemory) ;
144: GpiDeleteBitmap (hbm) ;
145: return 0 ;
146: }
147: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.