📄 htuview.cpp
字号:
// HtuView.cpp : implementation file
//
#include "stdafx.h"
#include "demo_devstudio.h"
#include "HtuView.h"
#include "afxpriv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHtuView
IMPLEMENT_DYNCREATE(CHtuView, CZoomView)
CHtuView::CHtuView()
{
m_myljb=NULL;
}
CHtuView::~CHtuView()
{m_myljb=NULL;
}
BEGIN_MESSAGE_MAP(CHtuView, CZoomView)
//{{AFX_MSG_MAP(CHtuView)
ON_WM_CONTEXTMENU()
ON_WM_ERASEBKGND()
ON_COMMAND(ID_FANGDA, OnViewZoomin)
ON_COMMAND(ID_SUOXIAO, OnViewZoomout)
ON_COMMAND(ID_CHONGMAN, OnViewZoomfull)
ON_COMMAND(ID_PPPP, OnPppp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHtuView drawing
void CHtuView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
CPen newpen;
newpen.CreatePen(PS_SOLID,1,RGB(255,255,255));
CPen* oldpen=pDC->SelectObject(&newpen);
if(!m_myljb)
return;
if(!m_yzarray)
return;
pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(RGB(0,255,0));
for(int j=0;j<=m_myljb->m_xian.GetUpperBound();j++)
{
int xzb,yzb;
xzb=int((m_myljb->m_xian.GetAt(j)->y-m_miny)*500/m_max);
yzb=int((m_maxx-m_myljb->m_xian.GetAt(j)->x)*500/m_max);
pDC->MoveTo(xzb,yzb);
pDC->TextOut(xzb,yzb,m_myljb->m_xian.GetAt(j)->czdian);
zzd p_zzd=m_myljb->m_xian.GetAt(j)->pzzdian;
while(p_zzd)
{int pindex=m_myljb->Findczd(p_zzd->dianhao);
if(pindex!=-1)
{
if(m_myljb->m_xian.GetAt(j)->isknow&&m_myljb->m_xian.GetAt(pindex)->isknow)
{ CPen mypen;
mypen.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen *myoldpen=pDC->SelectObject(&mypen);
pDC->LineTo((m_myljb->m_xian.GetAt(pindex)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(pindex)->x)*500/m_max);
pDC->TextOut((m_myljb->m_xian.GetAt(pindex)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(pindex)->x)*500/m_max,p_zzd->dianhao);
pDC->SelectObject(myoldpen);
mypen.DeleteObject();
}
else
{
pDC->LineTo((m_myljb->m_xian.GetAt(pindex)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(pindex)->x)*500/m_max);
pDC->TextOut((m_myljb->m_xian.GetAt(pindex)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(pindex)->x)*500/m_max,p_zzd->dianhao);
}
}
else
{
for(int p_index=0;p_index<=m_yzarray->GetUpperBound();p_index++)
{
if(!strcmp(p_zzd->dianhao,m_yzarray->GetAt(p_index)->dianhao))
{
if(m_myljb->m_xian.GetAt(j)->isknow)
{
CPen mypen;
mypen.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen* myoldpen=pDC->SelectObject(&mypen);
pDC->LineTo((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max);
pDC->TextOut((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max,m_yzarray->GetAt(p_index)->dianhao);
pDC->SelectObject(myoldpen);
mypen.DeleteObject();
}
else
{
pDC->LineTo((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max);
pDC->TextOut((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max,m_yzarray->GetAt(p_index)->dianhao);
}
}
}
}
p_zzd=p_zzd->myzzdian;
pDC->MoveTo((m_myljb->m_xian.GetAt(j)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(j)->x)*500/m_max);
}
int h_index=m_myljb->Findczd(m_myljb->m_xian.GetAt(j)->dxdian);
if(h_index!=-1)
{
if(m_myljb->m_xian.GetAt(j)->isknow&&m_myljb->m_xian.GetAt(h_index)->isknow)
{ CPen mypen;
mypen.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen *myoldpen=pDC->SelectObject(&mypen);
pDC->LineTo((m_myljb->m_xian.GetAt(h_index)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(h_index)->x)*500/m_max);
pDC->TextOut((m_myljb->m_xian.GetAt(h_index)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(h_index)->x)*500/m_max,m_myljb->m_xian.GetAt(j)->dxdian);
pDC->SelectObject(myoldpen);
mypen.DeleteObject();
}
else
{pDC->LineTo((m_myljb->m_xian.GetAt(h_index)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(h_index)->x)*500/m_max);
pDC->TextOut((m_myljb->m_xian.GetAt(h_index)->y-m_miny)*500/m_max,(m_maxx-m_myljb->m_xian.GetAt(h_index)->x)*500/m_max,m_myljb->m_xian.GetAt(j)->dxdian);
}
}
else
{
for(int p_index=0;p_index<=m_yzarray->GetUpperBound();p_index++)
{
if(!strcmp(m_myljb->m_xian.GetAt(j)->dxdian,m_yzarray->GetAt(p_index)->dianhao))
{
if(m_myljb->m_xian.GetAt(j)->isknow)
{
CPen mypen;
mypen.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen* myoldpen=pDC->SelectObject(&mypen);
pDC->LineTo((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max);
pDC->TextOut((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max,m_yzarray->GetAt(p_index)->dianhao);
pDC->SelectObject(myoldpen);
mypen.DeleteObject();
}
else
{
pDC->LineTo((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max);
pDC->TextOut((m_yzarray->GetAt(p_index)->y-m_miny)*500/m_max,(m_maxx-m_yzarray->GetAt(p_index)->x)*500/m_max,m_yzarray->GetAt(p_index)->dianhao);
}
}
}
}
}
// pDC->SelectObject(oldpen);
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CHtuView diagnostics
#ifdef _DEBUG
void CHtuView::AssertValid() const
{
CZoomView::AssertValid();
}
void CHtuView::Dump(CDumpContext& dc) const
{
CZoomView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHtuView message handlers
void CHtuView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menupopup;
menupopup.LoadMenu(IDR_MENU1);
menupopup.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
}
BOOL CHtuView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
pDC->GetClipBox(rect);
CBrush newbrush;
newbrush.CreateSolidBrush(RGB(0,0,0));
CBrush* oldbrush=pDC->SelectObject(&newbrush);
pDC->PatBlt(rect.left,rect.top,rect.right,rect.bottom,PATCOPY);
pDC->SelectObject(oldbrush);
// CZoomView::OnEraseBkgnd(pDC);
return true;
}
void CHtuView::OnInitialUpdate()
{
CZoomView::OnInitialUpdate();
SetZoomSizes(CSize(500,500));
// HDC pdc=(HDC)GetWindowDC();
// if(!pdc)
// return;
// SetBkColor(pdc,RGB(0,0,0));
// Invalidate();
// TODO: Add your specialized code here and/or call the base class
}
void CHtuView::OnViewZoomin()
{
// TODO: Add your command handler code here
CWnd *pWin = ((CWinApp *) AfxGetApp())->m_pMainWnd;
if (GetZoomMode() == MODE_ZOOMIN) {
SetZoomMode(MODE_ZOOMOFF);
// Clear the statusbar
pWin->SendMessage(WM_SETMESSAGESTRING, 0,
(LPARAM)(LPCSTR)"");
} else {
SetZoomMode(MODE_ZOOMIN);
// Give instructions in the statusbar
pWin->SendMessage(WM_SETMESSAGESTRING, 0,
(LPARAM)(LPCSTR)"Click to zoom in on point or drag a zoom box.");
}
}
void CHtuView::OnViewZoomout()
{
// TODO: Add your command handler code here
CWnd *pWin = ((CWinApp *) AfxGetApp())->m_pMainWnd;
if (GetZoomMode() == MODE_ZOOMOUT) {
SetZoomMode(MODE_ZOOMOFF);
// Clear the statusbar
pWin->SendMessage(WM_SETMESSAGESTRING, 0,
(LPARAM)(LPCSTR)"");
} else {
SetZoomMode(MODE_ZOOMOUT);
// Give instructions in the statusbar
pWin->SendMessage(WM_SETMESSAGESTRING, 0,
(LPARAM)(LPCSTR)"Click to zoom out on point.");
}
}
void CHtuView::OnViewZoomfull()
{
// TODO: Add your command handler code here
DoZoomFull();
RedrawWindow();
}
HBITMAP CHtuView::capturebitmap(CDC *pDC, CPoint luPoint, CRect bmprect)
{
CDC memdc;
CBitmap bitmap;
int bmpwidth=bmprect.right-bmprect.left;
int bmpheight=bmprect.bottom-bmprect.top;
memdc.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,bmpwidth,bmpheight);
memdc.SelectObject(&bitmap);
memdc.BitBlt(0,0,bmpwidth,bmpheight,pDC,luPoint.x,luPoint.y,SRCCOPY);
return HBITMAP(bitmap);
}
void CHtuView::savebitmap(HBITMAP hbmp, HDC hdc,CString filename)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cclrbits;
HANDLE hf;
BITMAPFILEHEADER hdr;
PBITMAPINFOHEADER pbih;
LPBYTE lpbits;
DWORD dwtotal;
DWORD cb;
BYTE *hp;
DWORD dwtmp;
LPCSTR pszfile=filename;
if(!GetObject(hbmp,sizeof(BITMAP),(LPSTR)&bmp))
{
MessageBox("失败");
return;
}
cclrbits=(WORD)(bmp.bmPlanes*bmp.bmBitsPixel);
if(cclrbits==1)
cclrbits=1;
if(cclrbits<=4)
cclrbits=4;
if(cclrbits<=8)
cclrbits=8;
if(cclrbits<=16)
cclrbits=16;
if(cclrbits<=24)
cclrbits=24;
else
cclrbits=32;
if(cclrbits!=24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(PBITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cclrbits));
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth=bmp.bmWidth;
pbmi->bmiHeader.biHeight=bmp.bmHeight;
pbmi->bmiHeader.biPlanes=bmp.bmPlanes;
pbmi->bmiHeader.biBitCount=bmp.bmBitsPixel;
// if(cclrbits<24)
// pbmi->bmiHeader.biClrUsed=(1<<cclrbits);
pbmi->bmiHeader.biCompression=BI_RGB;
pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth+7)/8*pbmi->bmiHeader.biHeight*cclrbits;;
pbmi->bmiHeader.biClrImportant=0;
pbih=(PBITMAPINFOHEADER)pbmi;
lpbits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);
if(!lpbits)
MessageBox("内存分配出错");
if(!::GetDIBits(hdc,hbmp,0,(WORD)pbih->biHeight,lpbits,pbmi,DIB_RGB_COLORS))
MessageBox("取位图数据出错");
hf=::CreateFile(pszfile,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
if(hf==INVALID_HANDLE_VALUE)
MessageBox("创建文件失败");
hdr.bfType=0x4d42;
hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrImportant*sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrImportant*sizeof(RGBQUAD);
if(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwtmp,NULL))
MessageBox("写文件出错1");
hp=lpbits;
if(!WriteFile(hf,(LPSTR)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrImportant*sizeof(RGBQUAD),(LPDWORD)&dwtmp,(LPOVERLAPPED)NULL))
MessageBox("写文件出错2");
dwtotal=cb=pbih->biSizeImage;
if(!::WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwtmp,NULL))
MessageBox("写文件出错3");
if(!::CloseHandle(hf))
MessageBox("关闭文件失败");
::GlobalFree((HGLOBAL)lpbits);
}
void CHtuView::Mysave(CString myfilename)
{
// TODO: Add your command handler code here
CRect rect;
GetClientRect(rect);
CPoint m_point(rect.left,rect.top);
CDC *pdc=GetWindowDC();
HBITMAP m_bitmap;
m_bitmap=capturebitmap(pdc,m_point,rect);
savebitmap(m_bitmap,pdc->GetSafeHdc(),myfilename);
}
void CHtuView::OnPppp()
{
// TODO: Add your command handler code here
CDC* pdc=this->GetDC();
pdc->MoveTo(0,0);
pdc->LineTo(200,200);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -