Files
geomative/GeomativeStudio/cpp/logging/CDialogLoggingEditSymbolBoard.cpp
coco df489d5640 a
2026-07-03 16:05:30 +08:00

395 lines
10 KiB
C++

// 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<int, map<int, bool>>::iterator iterX = m_mapPointStatus.begin();
map<int, bool>::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<int, bool> mapY;
map<int, map<int, bool>>::iterator iterX = m_mapPointStatus.find(iPointX);
if (iterX == m_mapPointStatus.end())
{
//未找到
mapY[iPointY] = true;
m_mapPointStatus[iPointX] = mapY;//覆盖
}
else
{
//找到
map<int, bool>::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);
}