395 lines
10 KiB
C++
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);
|
|
} |