MainFrm.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. // MainFrm.cpp : CMainFrame クラスの動作定義
  2. // Date 2006/05/17 Ver. 1.22 Psytec Inc.
  3. #include "stdafx.h"
  4. #include "QR_Image.h"
  5. #include "MainFrm.h"
  6. #include "QR_Encode.h"
  7. #include "ImageView.h"
  8. #include "RightView.h"
  9. #include "BottomView.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define CX_SPLITTER 7
  16. #define CY_SPLITTER 7
  17. #define CX_MARGIN 2
  18. #define CY_MARGIN 2
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMainFrame
  21. IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
  22. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  23. //{{AFX_MSG_MAP(CMainFrame)
  24. ON_WM_CREATE()
  25. ON_WM_SETFOCUS()
  26. ON_WM_GETMINMAXINFO()
  27. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)
  28. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
  29. ON_COMMAND(ID_FILE_SAVE, OnFileSave)
  30. ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. static UINT indicators[] =
  34. {
  35. ID_SEPARATOR,
  36. ID_INDICATOR_KANA,
  37. ID_INDICATOR_CAPS,
  38. ID_INDICATOR_NUM,
  39. ID_INDICATOR_SCRL,
  40. };
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CMainFrame クラスの構築/消滅
  43. CMainFrame::CMainFrame()
  44. {
  45. m_bInitSplit = FALSE;
  46. m_bDataEncoded = FALSE;
  47. m_pSymbleDC = NULL;
  48. m_strSavePath.Empty();
  49. }
  50. CMainFrame::~CMainFrame()
  51. {
  52. if (m_pSymbleDC != NULL)
  53. {
  54. m_pSymbleDC->SelectObject(m_pOldBitmap);
  55. delete m_pSymbleBitmap;
  56. delete m_pSymbleDC;
  57. }
  58. }
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CMainFrame::OnCreate
  61. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  62. {
  63. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  64. return -1;
  65. if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  66. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  67. ! m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  68. {
  69. TRACE0("Failed to create toolbar\n");
  70. return -1;
  71. }
  72. if (! m_wndStatusBar.Create(this) ||
  73. ! m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
  74. {
  75. TRACE0("Failed to create status bar\n");
  76. return -1;
  77. }
  78. // 状态条indicator正确被表示的那样变更前头pain幅度
  79. m_wndStatusBar.SetPaneInfo(0, 0, SBPS_NOBORDERS | SBPS_STRETCH, 0);
  80. // 以最小尺寸表示
  81. CRect rcWindow;
  82. GetWindowRect(&rcWindow);
  83. rcWindow.BottomRight() = rcWindow.TopLeft();
  84. MoveWindow(rcWindow);
  85. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  86. EnableDocking(CBRS_ALIGN_ANY);
  87. DockControlBar(&m_wndToolBar);
  88. return 0;
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CMainFrame::PreCreateWindow
  92. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  93. {
  94. if( !CFrameWnd::PreCreateWindow(cs))
  95. return FALSE;
  96. cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
  97. cs.lpszClass = AfxRegisterWndClass(0);
  98. return TRUE;
  99. }
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CMainFrame クラスの診断
  102. #ifdef _DEBUG
  103. void CMainFrame::AssertValid() const
  104. {
  105. CFrameWnd::AssertValid();
  106. }
  107. void CMainFrame::Dump(CDumpContext& dc) const
  108. {
  109. CFrameWnd::Dump(dc);
  110. }
  111. #endif //_DEBUG
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CMainFrame メッセージ ハンドラ
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CMainFrame::OnSetFocus
  116. void CMainFrame::OnSetFocus(CWnd* pOldWnd)
  117. {
  118. SetActiveView((CView*)(m_wndSplitter1.GetPane(1, 0)));
  119. }
  120. /////////////////////////////////////////////////////////////////////////////
  121. // CMainFrame::OnCmdMsg
  122. BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  123. {
  124. return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  125. }
  126. /////////////////////////////////////////////////////////////////////////////
  127. // CMainFrame::OnCreateClient
  128. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  129. {
  130. // 分割窗配置
  131. // +----------+----------+
  132. // | | |
  133. // |表示pain | 设定pain |
  134. // | | |
  135. // +----------+----------+
  136. // |数据输入pain |
  137. // +---------------------+
  138. m_wndSplitter1.CreateStatic(this, 2, 1);
  139. m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CBottomView), CSize(0, 0), pContext);
  140. m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2);
  141. m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CImageView), CSize(0, 0), pContext);
  142. m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, 0), pContext);
  143. m_pwndBottomView = ((CBottomView*)m_wndSplitter1.GetPane(1, 0));
  144. m_pwndRightView = ((CRightView*)m_wndSplitter2.GetPane(0, 1));
  145. // 规定尺寸取得
  146. m_sizeBottomView = ((CFormView*)m_wndSplitter1.GetPane(1, 0))->GetTotalSize();
  147. m_sizeRightView = ((CFormView*)m_wndSplitter2.GetPane(0, 1))->GetTotalSize();
  148. CRect rcClient;
  149. GetClientRect(rcClient);
  150. m_wndSplitter1.SetRowInfo(0, (rcClient.Height() - (CY_SPLITTER + CY_MARGIN * 2)) - m_sizeBottomView.cy, 0);
  151. m_wndSplitter2.SetColumnInfo(0, (rcClient.Width() - (CX_SPLITTER + CX_MARGIN * 2)) - m_sizeRightView.cx, 0);
  152. m_bInitSplit = TRUE;
  153. return TRUE;
  154. }
  155. /////////////////////////////////////////////////////////////////////////////
  156. // CMainFrame::RecalcLayout
  157. void CMainFrame::RecalcLayout(BOOL bNotify)
  158. {
  159. if (m_bInitSplit)
  160. {
  161. CRect rcClient;
  162. RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, &rcClient);
  163. int cy0, cy1, cyMin;
  164. m_wndSplitter1.GetRowInfo(0, cy0, cyMin);
  165. m_wndSplitter1.GetRowInfo(1, cy1, cyMin);
  166. if (cy0 >= 0 && cy1 >= 0)
  167. {
  168. if ((cy1 > m_sizeBottomView.cy) && (rcClient.Height() < cy0 + cy1 + (CY_SPLITTER + CY_MARGIN * 2)))
  169. {
  170. cy1 = max(m_sizeBottomView.cy, (rcClient.Height() - (CY_SPLITTER + CY_MARGIN * 2)) - cy0);
  171. }
  172. cy0 = (rcClient.Height() - (CY_SPLITTER + CY_MARGIN * 2)) - cy1;
  173. m_wndSplitter1.SetRowInfo(0, cy0, 0);
  174. m_wndSplitter1.RecalcLayout();
  175. }
  176. int cx0, cx1, cxMin;
  177. m_wndSplitter2.GetColumnInfo(0, cx0, cxMin);
  178. m_wndSplitter2.GetColumnInfo(1, cx1, cxMin);
  179. if (cx0 >= 0 && cx1 >= 0)
  180. {
  181. if ((cx1 > m_sizeRightView.cx) && (rcClient.Width() < cx0 + cx1 + (CX_SPLITTER + CX_MARGIN * 2)))
  182. {
  183. cx1 = max(m_sizeRightView.cx, (rcClient.Width() - (CX_SPLITTER + CX_MARGIN * 2)) - cx0);
  184. }
  185. cx0 = (rcClient.Width() - (CX_SPLITTER + CX_MARGIN * 2)) - cx1;
  186. m_wndSplitter2.SetColumnInfo(0, cx0, 0);
  187. m_wndSplitter2.RecalcLayout();
  188. }
  189. }
  190. CFrameWnd::RecalcLayout(bNotify);
  191. }
  192. /////////////////////////////////////////////////////////////////////////////
  193. // CMainFrame::OnGetMinMaxInfo
  194. void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
  195. {
  196. static BOOL bRestore = FALSE; // 来自最小化的复原时不处理
  197. if (IsWindow(m_wndSplitter1.m_hWnd) && ! bRestore)
  198. {
  199. CRect rcWindow;
  200. GetWindowRect(&rcWindow);
  201. CRect rcClient;
  202. RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, &rcClient);
  203. lpMMI->ptMinTrackSize.y = m_sizeRightView.cy + m_sizeBottomView.cy + CX_SPLITTER + CX_MARGIN * 2 + (rcWindow.Height() - rcClient.Height());
  204. lpMMI->ptMinTrackSize.x = m_sizeBottomView.cx + CY_MARGIN * 2 + (rcWindow.Width() - rcClient.Width());
  205. }
  206. bRestore = IsIconic();
  207. CFrameWnd::OnGetMinMaxInfo(lpMMI);
  208. }
  209. /////////////////////////////////////////////////////////////////////////////
  210. // 菜单项目更新
  211. void CMainFrame::OnUpdateFileSaveAs(CCmdUI* pCmdUI)
  212. {
  213. pCmdUI->Enable(m_bDataEncoded);
  214. }
  215. void CMainFrame::OnUpdateFileSave(CCmdUI* pCmdUI)
  216. {
  217. pCmdUI->Enable(m_bDataEncoded);
  218. }
  219. /////////////////////////////////////////////////////////////////////////////
  220. // 菜单实行
  221. void CMainFrame::OnFileSave()
  222. {
  223. m_strSavePath.IsEmpty() ? SaveAsImage() : SaveImage();
  224. }
  225. void CMainFrame::OnFileSaveAs()
  226. {
  227. SaveAsImage();
  228. }
  229. /////////////////////////////////////////////////////////////////////////////
  230. // CMainFrame::ShowImage
  231. // 用 途:QR作成code image
  232. // 准备 ∶考虑实际的绘画CImageView:∶OnDraw
  233. void CMainFrame::ShowImage()
  234. {
  235. int nLevel = m_pwndRightView->m_comboLevel.GetCurSel();
  236. int nVersion = m_pwndRightView->m_comboVersion.GetCurSel();
  237. BOOL bAutoExtent = (m_pwndRightView->m_checkAutoExtent.GetCheck() != 0);
  238. int nMaskingNo = m_pwndRightView->m_comboMaskingNo.GetCurSel() - 1;
  239. CString strEncodeData;
  240. m_pwndBottomView->m_editSoureData.GetWindowText(strEncodeData);
  241. int i, j;
  242. CQR_Encode* pQR_Encode = new CQR_Encode;
  243. m_bDataEncoded = pQR_Encode->EncodeData(nLevel, nVersion, bAutoExtent, nMaskingNo, strEncodeData);
  244. if (m_bDataEncoded)
  245. {
  246. if (m_pSymbleDC != NULL)
  247. {
  248. m_pSymbleDC->SelectObject(m_pOldBitmap);
  249. delete m_pSymbleBitmap;
  250. delete m_pSymbleDC;
  251. }
  252. m_nSymbleSize = pQR_Encode->m_nSymbleSize + (QR_MARGIN * 2);
  253. m_pSymbleBitmap = new CBitmap;
  254. m_pSymbleBitmap->CreateBitmap(m_nSymbleSize, m_nSymbleSize, 1, 1, NULL);
  255. m_pSymbleDC = new CDC;
  256. m_pSymbleDC->CreateCompatibleDC(NULL);
  257. m_pOldBitmap = m_pSymbleDC->SelectObject(m_pSymbleBitmap);
  258. // 画面消去
  259. m_pSymbleDC->PatBlt(0, 0, m_nSymbleSize, m_nSymbleSize, WHITENESS);
  260. // 点绘画
  261. for (i = 0; i < pQR_Encode->m_nSymbleSize; ++i)
  262. {
  263. for (j = 0; j < pQR_Encode->m_nSymbleSize; ++j)
  264. {
  265. if (pQR_Encode->m_byModuleData[i][j])
  266. {
  267. m_pSymbleDC->SetPixel(i + QR_MARGIN, j + QR_MARGIN, RGB(0, 0, 0));
  268. }
  269. }
  270. }
  271. // 绘画型号表示
  272. CString strWork;
  273. if (nVersion != pQR_Encode->m_nVersion)
  274. strWork.Format("(%d)", pQR_Encode->m_nVersion);
  275. else
  276. strWork.Empty();
  277. m_pwndRightView->m_staticVersion.SetWindowText(strWork);
  278. // 自动掩蔽选择时的掩蔽号码表示
  279. if (nMaskingNo == -1)
  280. strWork.Format("(%d)", pQR_Encode->m_nMaskingNo);
  281. else
  282. strWork.Empty();
  283. m_pwndRightView->m_staticMaskingNo.SetWindowText(strWork);
  284. // 按钮使用可
  285. m_pwndRightView->m_buttonCopy.EnableWindow();
  286. m_pwndRightView->m_buttonSave.EnableWindow();
  287. }
  288. else
  289. {
  290. // 表示清除
  291. m_pwndRightView->m_staticVersion.SetWindowText("");
  292. m_pwndRightView->m_staticMaskingNo.SetWindowText("");
  293. // 按钮使用不可
  294. m_pwndRightView->m_buttonCopy.EnableWindow(FALSE);
  295. m_pwndRightView->m_buttonSave.EnableWindow(FALSE);
  296. }
  297. delete pQR_Encode;
  298. //保存时,图像尺寸标示
  299. ShowBitmapSize();
  300. // 无效化做表示pain绘画
  301. m_wndSplitter1.GetPane(0, 0)->InvalidateRect(NULL, FALSE);
  302. }
  303. /////////////////////////////////////////////////////////////////////////////
  304. // CMainFrame::ShowBitmapSize
  305. // 事情途∶保存时,图像尺寸的表示
  306. void CMainFrame::ShowBitmapSize()
  307. {
  308. CString strWork;
  309. strWork.Empty();
  310. if (m_bDataEncoded)
  311. {
  312. int nModuleSize = m_pwndRightView->GetDlgItemInt(IDC_EDITMODULESIZE);
  313. if (nModuleSize >= 1 && nModuleSize <= 20)
  314. {
  315. int nSize = m_nSymbleSize * nModuleSize;
  316. strWork.Format("%d × %d", nSize, nSize);
  317. }
  318. }
  319. m_pwndRightView->m_staticBmpSize.SetWindowText(strWork);
  320. }
  321. /////////////////////////////////////////////////////////////////////////////
  322. // CMainFrame::CopyImage
  323. //事情途∶为QR剪贴板code image拷贝
  324. //引数∶COleDataSource 地址(默认=NULL)
  325. //准备 考虑∶如果COleDataSource 被指定OLE拖放,无指定时剪贴板拷贝
  326. // 格式使用DIB形式
  327. void CMainFrame::CopyImage(COleDataSource* pOleDataSource)
  328. {
  329. int nPixelSize = m_nSymbleSize * m_pwndRightView->GetDlgItemInt(IDC_EDITMODULESIZE);
  330. // 比特数据尺寸取得
  331. int nBmpSize = ((nPixelSize + 31) / 32) * 32 / 8;
  332. nBmpSize *= nPixelSize;
  333. // 全球内存取得
  334. HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + nBmpSize);
  335. if (hGlobal == NULL)
  336. {
  337. MessageBox("是内存不足。", NULL, MB_ICONEXCLAMATION);
  338. return;
  339. }
  340. LPBYTE lpbyBits = (LPBYTE)GlobalLock(hGlobal);
  341. // 结构体地址割付
  342. LPBITMAPINFO pbmi = (LPBITMAPINFO)lpbyBits;
  343. LPVOID pbdt = lpbyBits + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2;
  344. // LPBITMAPINFO->BITMAPINFOHEADER
  345. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  346. pbmi->bmiHeader.biWidth = nPixelSize;
  347. pbmi->bmiHeader.biHeight = nPixelSize;
  348. pbmi->bmiHeader.biPlanes = 1;
  349. pbmi->bmiHeader.biBitCount = 1;
  350. pbmi->bmiHeader.biCompression = BI_RGB;
  351. pbmi->bmiHeader.biSizeImage = nBmpSize;
  352. pbmi->bmiHeader.biXPelsPerMeter = 3780;
  353. pbmi->bmiHeader.biYPelsPerMeter = 3780;
  354. pbmi->bmiHeader.biClrUsed = 0;
  355. pbmi->bmiHeader.biClrImportant = 0;
  356. CDC* pWorkDC = new CDC;
  357. pWorkDC->CreateCompatibleDC(NULL);
  358. CBitmap* pWorkBitmap = new CBitmap;
  359. pWorkBitmap->CreateBitmap(nPixelSize, nPixelSize, 1, 1, NULL);
  360. CBitmap* pOldBitmap = pWorkDC->SelectObject(pWorkBitmap);
  361. pWorkDC->StretchBlt(0, 0, nPixelSize, nPixelSize, m_pSymbleDC, 0, 0, m_nSymbleSize, m_nSymbleSize, SRCCOPY);
  362. GetDIBits(pWorkDC->m_hDC, (HBITMAP)*pWorkBitmap, 0, nPixelSize, pbdt, pbmi, DIB_RGB_COLORS);
  363. GlobalUnlock(hGlobal);
  364. pWorkDC->SelectObject(pOldBitmap);
  365. delete pWorkBitmap;
  366. delete pWorkDC;
  367. if (pOleDataSource == NULL)
  368. {
  369. // 为剪贴板拷贝
  370. OpenClipboard();
  371. EmptyClipboard();
  372. SetClipboardData(CF_DIB, hGlobal);
  373. CloseClipboard();
  374. }
  375. else
  376. {
  377. // OLE拖放 数据传送
  378. pOleDataSource->CacheGlobalData(CF_DIB, hGlobal);
  379. pOleDataSource->DoDragDrop(DROPEFFECT_COPY);
  380. }
  381. }
  382. /////////////////////////////////////////////////////////////////////////////
  383. // CMainFrame::SaveAsImage
  384. // 事情途∶为QR位图code image文件保存
  385. void CMainFrame::SaveAsImage()
  386. {
  387. // CFileDialog 级构筑
  388. CFileDialog* pFileDialog = new CFileDialog(FALSE, "bmp", m_strSavePath, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,
  389. "bmphosaheshi(*.bmp)|*.bmp|himihotoshi(*.*)|*.*||", this);
  390. pFileDialog->m_ofn.lpstrTitle = "QR Code no noesore";
  391. CString strFileName;
  392. //「文件保存」对话框表示
  393. if (pFileDialog->DoModal() == IDOK)
  394. strFileName = pFileDialog->GetPathName();
  395. delete pFileDialog;
  396. if (strFileName.IsEmpty())
  397. return;
  398. m_strSavePath = strFileName;
  399. SaveImage();
  400. }
  401. /////////////////////////////////////////////////////////////////////////////
  402. // CMainFrame::SaveImage
  403. // 事情途∶为QR位图code image文件保存
  404. void CMainFrame::SaveImage()
  405. {
  406. int nPixelSize = m_nSymbleSize * m_pwndRightView->GetDlgItemInt(IDC_EDITMODULESIZE);
  407. // 比特数据尺寸取得
  408. int nBmpSize = ((nPixelSize + 31) / 32) * 32 / 8;
  409. nBmpSize *= nPixelSize;
  410. // memorimappudofairu作成
  411. HANDLE hFile = CreateFile(m_strSavePath, GENERIC_READ | GENERIC_WRITE, 0, NULL,
  412. CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  413. if (hFile == INVALID_HANDLE_VALUE)
  414. {
  415. m_strSavePath.Empty();
  416. MessageBox("文件开放错误", "QR Code 印象保存", MB_ICONSTOP);
  417. return;
  418. }
  419. HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE | SEC_COMMIT, 0,
  420. sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + nBmpSize, NULL);
  421. LPBYTE lpbyMapView = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
  422. ZeroMemory(lpbyMapView, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + nBmpSize);
  423. //结构体地址割付
  424. LPBITMAPFILEHEADER pbfh = (LPBITMAPFILEHEADER)lpbyMapView;
  425. LPBITMAPINFO pbmi = (LPBITMAPINFO)(lpbyMapView + sizeof(BITMAPFILEHEADER));
  426. LPVOID pbdt = lpbyMapView + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2;
  427. // BITMAPFILEHEADER
  428. pbfh->bfType = (WORD) (('M' << 8) | 'B'); // "BM"
  429. pbfh->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + nBmpSize;
  430. pbfh->bfReserved1 = 0;
  431. pbfh->bfReserved2 = 0;
  432. pbfh->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2;
  433. // LPBITMAPINFO->BITMAPINFOHEADER
  434. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  435. pbmi->bmiHeader.biWidth = nPixelSize;
  436. pbmi->bmiHeader.biHeight = nPixelSize;
  437. pbmi->bmiHeader.biPlanes = 1;
  438. pbmi->bmiHeader.biBitCount = 1;
  439. pbmi->bmiHeader.biCompression = BI_RGB;
  440. pbmi->bmiHeader.biSizeImage = nBmpSize;
  441. pbmi->bmiHeader.biXPelsPerMeter = 3780;
  442. pbmi->bmiHeader.biYPelsPerMeter = 3780;
  443. pbmi->bmiHeader.biClrUsed = 0;
  444. pbmi->bmiHeader.biClrImportant = 0;
  445. CDC* pWorkDC = new CDC;
  446. pWorkDC->CreateCompatibleDC(NULL);
  447. CBitmap* pWorkBitmap = new CBitmap;
  448. pWorkBitmap->CreateBitmap(nPixelSize, nPixelSize, 1, 1, NULL);
  449. CBitmap* pOldBitmap = pWorkDC->SelectObject(pWorkBitmap);
  450. pWorkDC->StretchBlt(0, 0, nPixelSize, nPixelSize, m_pSymbleDC, 0, 0, m_nSymbleSize, m_nSymbleSize, SRCCOPY);
  451. GetDIBits(pWorkDC->m_hDC, (HBITMAP)*pWorkBitmap, 0, nPixelSize, pbdt, pbmi, DIB_RGB_COLORS);
  452. pWorkDC->SelectObject(pOldBitmap);
  453. delete pWorkBitmap;
  454. delete pWorkDC;
  455. UnmapViewOfFile(lpbyMapView);
  456. CloseHandle(hFileMapping);
  457. CloseHandle(hFile);
  458. }