|
|
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: * bitmap.c -- support for reading in and drawing bitmaps.
14: \**************************************************************************/
15:
16: #include <windows.h>
17: #include <commdlg.h>
18:
19:
20:
21: /**************************************************************************\
22: *
23: * function: DrawBitmap()
24: *
25: * input parameters: HDC, HBITMAP
26: *
27: * Draw the bitmap into the hdc. Source rectangle computed to include the
28: * whole bitmap. Destination location is 0,0.
29: *
30: * global variables: none.
31: *
32: \**************************************************************************/
33: VOID DrawBitmap (HDC hdc, HBITMAP hbm)
34: {
35: BOOL f;
36: HDC hdcBits;
37: BITMAP bm;
38:
39: hdcBits = CreateCompatibleDC(hdc);
40: GetObject (hbm, sizeof(BITMAP), &bm);
41: SelectObject(hdcBits,hbm);
42: f = BitBlt(hdc,0,0,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
43: DeleteDC(hdcBits);
44: }
45:
46:
47:
48: /**************************************************************************\
49: *
50: * function: GetBitmap()
51: *
52: * input parameters:
53: * hdc - hdc to make the bitmap compatible with.
54: * hInst - instance handle
55: *
56: * Put up a common dialog box to open a new *.BMP file.
57: * Once this is complete, open the file, read in the information,
58: * and create a compatible bitmap.
59: *
60: * returns: handle to the bitmap iff successful. NULL otherwise.
61: *
62: \**************************************************************************/
63: HBITMAP GetBitmap (HDC hdc, HANDLE hInst, BOOL monochrome)
64: {
65: HBITMAP hbm;
66: PBITMAPFILEHEADER pbmfh;
67: PBITMAPINFOHEADER pbmih;
68: PBYTE pBits;
69: int fh;
70: int bfOffBits;
71: int nbytes;
72: OPENFILENAME of;
73: char buffer [MAX_PATH];
74:
75: buffer[0] = 0;
76:
77: /* set up the OPENFILE structure,
78: * then use the appropriate common dialog
79: */
80: of.lStructSize = sizeof (OPENFILENAME);
81: of.hwndOwner = NULL;
82: of.hInstance = hInst;
83: of.lpstrFilter = "Bitmaps\000 *.BMP\000\000";
84: of.lpstrCustomFilter = NULL;
85: of.nMaxCustFilter = 0;
86: of.nFilterIndex = 0;
87: of.lpstrFile = buffer;
88: of.nMaxFile = MAX_PATH;
89: of.lpstrFileTitle = NULL;
90: of.nMaxFileTitle = 0;
91: of.lpstrInitialDir = "c:\\nt\\windows";
92: of.lpstrTitle = NULL;
93: of.Flags = OFN_HIDEREADONLY;
94: of.nFileOffset = 0;
95: of.nFileExtension = 0;
96: of.lpstrDefExt = NULL;
97: of.lCustData = 0;
98: of.lpfnHook = NULL;
99: of.lpTemplateName = NULL;
100: if (!GetOpenFileName (&of)) return NULL;
101:
102: /* Try to open the file. If successful, then allocate space for it,
103: * and read in all of the bytes.
104: */
105: fh = _lopen (buffer, OF_READ);
106: if (fh == -1) return NULL;
107: nbytes = GetFileSize ((HANDLE) fh, NULL);
108:
109: /* The contents of the file are read in here in three parts. First
110: * the bitmap file header is read, then the bitmap header along with
111: * the color table, then finally the actual bit data. I.e. from
112: * a total of nbytes...
113: * 1. sizeof (BITMAPFILEHEADER)
114: * 2. bfOffBits- sizeof (BITMAPFILEHEADER)
115: * 3. (nbytes - bfOffBits)
116: */
117:
118: /* read in the bitmap file header. save the offset to bits. */
119: if (!(pbmfh = (PBITMAPFILEHEADER)LocalAlloc (LPTR, sizeof (BITMAPFILEHEADER))))
120: return NULL;
121: _lread (fh, (LPSTR)pbmfh, sizeof (BITMAPFILEHEADER));
122: bfOffBits=pbmfh->bfOffBits;
123:
124: /* read in the bitmap info header and the color table right after it.
125: * both BITMAPINFOHEADER and BITMAPINFO needed for CreateDIBitmap()
126: */
127: if (!(pbmih = (PBITMAPINFOHEADER)LocalAlloc (LPTR, bfOffBits- sizeof (BITMAPFILEHEADER))))
128: return NULL;
129: _lread (fh, (LPSTR)pbmih, bfOffBits- sizeof (BITMAPFILEHEADER));
130:
131: /* finally read in the bit data. */
132: if (!(pBits = (PBYTE)LocalAlloc (LPTR, (nbytes - bfOffBits)))) return NULL;
133: _lread (fh, (LPSTR)pBits, (nbytes - bfOffBits));
134:
135:
136: /* in the case of desiring a monochrome bitmap (input parameter),
137: * verify that is what we got. If it is, then use CreateBitmap,
138: * else use a device independent bitmap.
139: */
140: if (monochrome) {
141: if (pbmih->biBitCount != 1) {
142: MessageBox (NULL, "Mask must be monochrome bitmap.",
143: "Error", MB_APPLMODAL | MB_ICONSTOP | MB_OK);
144: hbm = NULL;
145: } else {
146: hbm = CreateBitmap (pbmih->biWidth, pbmih->biHeight,
147: pbmih->biPlanes, pbmih->biBitCount,
148: pBits);
149: }
150: } else /* bitmap is NOT monochrome, use DIB. */
151: hbm = CreateDIBitmap (hdc, pbmih, CBM_INIT,
152: pBits, (PBITMAPINFO) pbmih, DIB_RGB_COLORS);
153:
154:
155: /* hbm is set... free up memory, and return */
156: LocalFree (LocalHandle ((LPSTR)pBits));
157: LocalFree (LocalHandle ((LPSTR)pbmih));
158: LocalFree (LocalHandle ((LPSTR)pbmfh));
159: _lclose (fh);
160:
161: return hbm;
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.