// D:\zm\GeomativeV2.5\cpp\logging\CDialogLoggingEditSymbolBoard.cpp : 实现文件 // #include "stdafx.h" #include "GeoMative.h" #include "logging\CDialogLoggingEditSymbolBoard.h" #include "logging\CLoggingDataOper.h" #include "afxdialogex.h" // CDialogLoggingEditSymbolBoard 对话框 IMPLEMENT_DYNAMIC(CDialogLoggingEditSymbolBoard, CDialogEx) CDialogLoggingEditSymbolBoard::CDialogLoggingEditSymbolBoard(CWnd* pParent /*=NULL*/) : CDialog(CDialogLoggingEditSymbolBoard::IDD, pParent) { m_bSaveBmp = FALSE; //m_strLithologyPic.Empty(); } CDialogLoggingEditSymbolBoard::~CDialogLoggingEditSymbolBoard() { m_mapPointStatus.clear(); //memset(m_iPointStatusArray, 0, sizeof(m_iPointStatusArray)); } CDialogLoggingEditSymbolBoard* CDialogLoggingEditSymbolBoard::GetInstance() { static CDialogLoggingEditSymbolBoard dlg; return &dlg; } void CDialogLoggingEditSymbolBoard::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CDialogLoggingEditSymbolBoard, CDialog) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() BOOL CDialogLoggingEditSymbolBoard::OnInitDialog() { CDialog::OnInitDialog(); m_mapPointStatus.clear(); //memset(m_iPointStatusArray, 0, sizeof(m_iPointStatusArray)); //m_strLithologyPic.Empty(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } // CDialogLoggingEditSymbolBoard 消息处理程序 void CDialogLoggingEditSymbolBoard::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CDialogEx::OnPaint() RECT rcWnd; GetClientRect(&rcWnd); dc.FillSolidRect(&rcWnd, RGB(255, 255, 255)); //加载图片 /*if (!m_strLithologyPic.IsEmpty()) { RECT rcWnd; GetClientRect(&rcWnd); CDC memDC; memDC.CreateCompatibleDC(&dc); HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), m_strLithologyPic, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //CBitmap* pBmp = memDC.SelectObject(&hBmp); CBitmap bmp; if (bmp.Attach(hBmp)) { BITMAP bitMap; bmp.GetBitmap(&bitMap); CBitmap* pBmp = memDC.SelectObject(&bmp); dc.StretchBlt(rcWnd.left, rcWnd.top, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, &memDC, 0, 0, bitMap.bmWidth, bitMap.bmHeight, SRCCOPY); dc.SelectObject(pBmp); } }*/ //绘制网格 if (!m_bSaveBmp) { CPen pen, BlackPen; BlackPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); pen.CreatePen(PS_SOLID, 1, RGB(195, 195, 195)); dc.SelectObject(pen); //dc.Rectangle(&rcWnd); //绘制竖线 for (int x = rcWnd.left; x <= rcWnd.left+GRID_SIZE*GRID_X_DIRECTION_SIZE; x += GRID_SIZE) { dc.MoveTo(x, rcWnd.top); dc.LineTo(x, rcWnd.bottom); } //绘制横线 for (int y = rcWnd.top; y <= rcWnd.top + GRID_SIZE*GRID_Y_DIRECTION_SIZE; y += GRID_SIZE) { dc.MoveTo(rcWnd.left, y); dc.LineTo(rcWnd.right, y); } } CBrush BlackBrush; BlackBrush.CreateSolidBrush(RGB(0, 0, 0)); dc.SelectObject(BlackBrush); //绘制点 RECT rcPoint; map>::iterator iterX = m_mapPointStatus.begin(); map::iterator iterY; for (; iterX != m_mapPointStatus.end(); iterX++) { iterY = iterX->second.begin(); for (; iterY != iterX->second.end(); iterY++) { if (iterY->second == true) { rcPoint.left = iterX->first * GRID_SIZE; rcPoint.right = rcPoint.left + GRID_SIZE; rcPoint.top = iterY->first* GRID_SIZE; rcPoint.bottom = rcPoint.top + GRID_SIZE; dc.Rectangle(&rcPoint); } } } /*//绘制点 RECT rcPoint; int i, j; for (i = 0; i < GRID_X_DIRECTION_SIZE; i++) { for (j = 0; j < GRID_Y_DIRECTION_SIZE; j++) { if (m_iPointStatusArray[i][j] == 1) { rcPoint.left = i* GRID_SIZE; rcPoint.right = rcPoint.left + GRID_SIZE; rcPoint.top = j*GRID_SIZE; rcPoint.bottom = rcPoint.top + GRID_SIZE; dc.Rectangle(&rcPoint); } } }*/ } CString CDialogLoggingEditSymbolBoard::CaptureScreen(LPRECT lpRect, CString strLithologyType)//lpRect为NULL时表示全屏幕截图 { int iDestX, iDestY; if (lpRect) { iDestX = lpRect->right - lpRect->left; iDestY = lpRect->bottom - lpRect->top; } else { iDestX = GetSystemMetrics(SM_CXSCREEN); iDestY = GetSystemMetrics(SM_CYSCREEN); } CDC* pdc = GetDC(); HDC hdc = CreateCompatibleDC(pdc->GetSafeHdc()); HBITMAP hBitmap = CreateCompatibleBitmap(hdc, iDestX, iDestY); SelectObject(hdc, hBitmap); BitBlt(hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, pdc->GetSafeHdc(), 0, 0, SRCCOPY); ReleaseDC(pdc); HDC dc = CreateCompatibleDC(hdc); HBITMAP hBmp = CreateCompatibleBitmap(dc, iDestX, iDestY); SelectObject(dc, hBmp); BitBlt(dc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, hdc, lpRect->left, lpRect->top, SRCCOPY); CString strFile; strFile.Format(_T("./lithology/%s.bmp"), strLithologyType); //先删除之前的 DeleteFile(strFile); SaveBmp(hBmp, strFile); DeleteDC(hdc); return strFile; } BOOL CDialogLoggingEditSymbolBoard::SaveBmp(HBITMAP hBitmap, const TCHAR* FileName) { HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal, hOldPal = NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC(("DISPLAY"), NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) *GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) { wBitCount = 1; } else if (iBits <= 4) { wBitCount = 4; } else if (iBits <= 8) { wBitCount = 8; } else { wBitCount = 24; } GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; //为位图内容分配内存 hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile((LPCSTR)FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);/* FILE_FLAG_SEQUENTIAL_SCAN, NULL); */ if (fh == INVALID_HANDLE_VALUE) { return FALSE; } // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE; } //保存岩性图片 CString CDialogLoggingEditSymbolBoard::SaveLithologyBitmap(CString strLithologyType, CString strLithologyName) { m_bSaveBmp = TRUE; RedrawWindow(); RECT rcWnd; GetClientRect(&rcWnd); CString strFile = CaptureScreen(&rcWnd, strLithologyType); m_bSaveBmp = FALSE; RedrawWindow(); //保存图片到数据库 CLoggingDataOper::GetInstance()->InsertDBLithologyBitmap(strLithologyType, strLithologyName, strFile, m_mapPointStatus); return strFile; } //删除岩性图片 BOOL CDialogLoggingEditSymbolBoard::DeleteLithologyBitmap(CString strLithologyType, CString strLithologyPicPath) { //清空面板 m_mapPointStatus.clear(); //memset(m_iPointStatusArray, 0, sizeof(m_iPointStatusArray)); //m_strLithologyPic.Empty(); //删除数据库图片文件 CLoggingDataOper::GetInstance()->DeleteDBLithologyBitmap(strLithologyType); RedrawWindow(); return DeleteFile(strLithologyPicPath); } //加载岩性图片 BOOL CDialogLoggingEditSymbolBoard::LoadLithologyBitmap(CString strBmpFile) { //清空面板 m_mapPointStatus.clear(); //memset(m_iPointStatusArray, 0, sizeof(m_iPointStatusArray)); m_mapPointStatus = CLoggingDataOper::GetInstance()->LoadLithologyBitmapFromDB(strBmpFile); //m_strLithologyPic = strBmpFile; RedrawWindow(); return TRUE; } void CDialogLoggingEditSymbolBoard::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int iPointX = point.x / GRID_SIZE; int iPointY = point.y / GRID_SIZE; //m_iPointStatusArray[iPointX][iPointY] = !m_iPointStatusArray[iPointX][iPointY]; map mapY; map>::iterator iterX = m_mapPointStatus.find(iPointX); if (iterX == m_mapPointStatus.end()) { //未找到 mapY[iPointY] = true; m_mapPointStatus[iPointX] = mapY;//覆盖 } else { //找到 map::iterator iterY = iterX->second.find(iPointY); if (iterY == iterX->second.end()) { iterX->second.insert(make_pair(iPointY, true));//向已有map中插入 } else { iterX->second.erase(iPointY); } } RedrawWindow(); CDialog::OnLButtonDown(nFlags, point); } void CDialogLoggingEditSymbolBoard::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialog::OnLButtonUp(nFlags, point); }