1 void CmyTestGraph::OnButton2()
2 {
3 // TODO: Add your control notification handler code here
4 CWnd *pWnd = GetDlgItem(IDC_RICHEDIT1);
5 RECT myrect;
6 pWnd->GetClientRect(&myrect);
7 CDC *pDC;
8 pDC = pWnd->GetDC();
9
10 m_myview->SaveBMPFromDC("D:\\graph1.bmp", *pDC, myrect);
11 pWnd->ReleaseDC(pDC);
12
13 }
14
15
16 void CTrView::SaveBMPFromWnd(CString filename, CWnd *pWnd)
17 {
18 if(pWnd ==NULL) return;
19 if(!IsWindow(pWnd->m_hWnd)) return;
20 RECT myrect;
21 pWnd->GetClientRect(&myrect);
22 CDC *pDC;
23 pDC = pWnd->GetDC();
24
25 m_myview->SaveBMPFromDC(filename, *pDC, myrect);
26 pWnd->ReleaseDC(pDC);
27 }
28
29 void CTrView::SaveBMPFromDC(CString filename, CDC &dc, RECT &myrect)
30 {
31
32
33 RECT TrViewRect;
34 memcpy(&TrViewRect, &myrect, sizeof(RECT));
35
36 int nWidth = TrViewRect.right - TrViewRect.left;
37 int nHeight = TrViewRect.bottom - TrViewRect.top;
38 int nX = TrViewRect.left;
39 int nY = TrViewRect.top;
40
41
42 HDC hScrDC, hMemDC;
43 hScrDC = dc.GetSafeHdc();
44 hMemDC = CreateCompatibleDC(hScrDC);
45 TRACE("view:SaveBMPFromDC:w=%d h=%d \n", nWidth, nHeight);
46
47 HBITMAP hBitmap, hOldBitmap;
48 hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
49 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
50
51 BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
52
53 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
54
55 DeleteDC(hScrDC);
56 DeleteDC(hMemDC);
57
58 WriteBmpToFile(hBitmap, filename);
59
60
61 }
62
63 void CTrView::WriteBmpToFile(HBITMAP hBitmap, const char *pathname)
64 {
65 HDC hDC =::CreateDC("DISPLAY", NULL, NULL, NULL);
66 int iBits = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);//当前分辨率下每个像素所占字节数
67 ::DeleteDC(hDC);
68 WORD wBitCount; //位图中每个像素所占字节数
69 if (iBits <= 1)
70 wBitCount = 1;
71 else if (iBits <= 4)
72 wBitCount = 4;
73 else if (iBits <= 8)
74 wBitCount = 8;
75 else if (iBits <= 24)
76 wBitCount = 24;
77 else
78 wBitCount = iBits;
79
80 DWORD dwPaletteSize = 0; //调色板大小, 位图中像素字节大小
81 if (wBitCount <= 8)
82 dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
83
84
85 BITMAP bm; //位图属性结构
86 ::GetObject(hBitmap, sizeof(bm), (LPSTR)&bm);
87
88
89 BITMAPINFOHEADER bi; //位图信息头结构
90 bi.biSize = sizeof(BITMAPINFOHEADER);
91 bi.biWidth = bm.bmWidth;
92 bi.biHeight = bm.bmHeight;
93 bi.biPlanes = 1;
94 bi.biBitCount = wBitCount;
95 bi.biCompression = BI_RGB; //BI_RGB表示位图没有压缩
96 bi.biSizeImage = 0;
97 bi.biXPelsPerMeter = 0;
98 bi.biYPelsPerMeter = 0;
99 bi.biClrUsed = 0;
100 bi.biClrImportant = 0;
101
102 DWORD dwBmBitsSize = ((bm.bmWidth * wBitCount + 31) / 32) * 4 * bm.bmHeight;
103 HANDLE hDib = ::GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); //为位图内容分配内存
104 LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
105 *lpbi = bi;
106
107 HANDLE hPal = ::GetStockObject(DEFAULT_PALETTE); // 处理调色板
108 HANDLE hOldPal = NULL;
109 if (hPal)
110 {
111 hDC = ::GetDC(NULL);
112 hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
113 RealizePalette(hDC);
114 }
115 ::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); // 获取该调色板下新的像素值
116 if (hOldPal)//恢复调色板
117 {
118 SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
119 RealizePalette(hDC);
120 ::ReleaseDC(NULL, hDC);
121 }
122
123 BITMAPFILEHEADER bmfHdr; //位图文件头结构
124 bmfHdr.bfType = 0x4D42; // "BM" // 设置位图文件头
125 DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
126 bmfHdr.bfSize = dwDIBSize;
127 bmfHdr.bfReserved1 = 0;
128 bmfHdr.bfReserved2 = 0;
129 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
130
131 HANDLE hFile = CreateFile(pathname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); //创建位图文件
132 DWORD dwWritten;
133 WriteFile(hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件头
134 WriteFile(hFile, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);// 写入位图文件其余内容
135
136 GlobalUnlock(hDib); //清除
137 GlobalFree(hDib);
138 CloseHandle(hFile);
139
140 }