📄 bkgd.cpp
字号:
// Bkgd.cpp : implementation file
//
#include "stdafx.h"
#include "aaa.h"
#include "Bkgd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBkgd
CBkgd::CBkgd()
{
m_clrBk=RGB(123,124,0);//设置字的背景颜色
m_clrGrid=RGB(255,125,124);//设置格子颜色
m_clrPlot=RGB(123,255,124);//设置刻度字颜色
m_penGrid.CreatePen(PS_SOLID,1,m_clrGrid);//
m_penPlot.CreatePen(PS_SOLID,1,m_clrPlot);
m_brushBk.CreateSolidBrush(m_clrBk);
m_rectGrid=CRect(0,0,1440,1440);//设置格子区大小
}
CBkgd::~CBkgd()
{
if (m_dcGrid.GetSafeHdc()!=NULL)//m_dcGrid可否用CDC后,直接用dc掉用?
{
m_dcGrid.SelectObject(m_pOldBitmapGrid);//选出bitmap
m_bitmapGrid.DeleteObject();//清除内存
m_dcGrid.DeleteDC();
}
if (m_dcPlot.GetSafeHdc()!=NULL)//作用?
{
m_dcPlot.SelectObject(m_pOldBitmapPlot);//选出BITMAP
m_bitmapPlot.DeleteObject();//清除内存
m_dcPlot.DeleteDC();
}
}
BEGIN_MESSAGE_MAP(CBkgd, CWnd)
//{{AFX_MSG_MAP(CBkgd)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBkgd message handlers
void CBkgd::InvalidateCtrl()
{
GetParent()->GetDlgItem(m_ctlID)->GetWindowRect(&m_rectClient);
GetParent()->ScreenToClient(&m_rectClient);
m_rectClient.DeflateRect(CSize(0,0));//以防止边缘抖动
MoveWindow(&m_rectClient);//改变自己的位置
//保存窗口尺寸值以备后用
GetClientRect(m_rectClient);
m_nClientWidth = m_rectClient.Width();
m_nClientHeight = m_rectClient.Height();
CClientDC dc(this);
//准备格子背景内存DC
if(m_dcGrid.GetSafeHdc())/**Call this member function(GetSafeHdc) to get m_hDC,
the output device context.
This member function also works with null pointers.**/
{
m_dcGrid.DeleteDC();
m_bitmapGrid.DeleteObject();
}
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc,m_rectClient.Width(),m_rectClient.Height());
m_pOldBitmapGrid=m_dcGrid.SelectObject(&m_bitmapGrid);
//确定映射模式:(1440,1440)逻辑单位
m_dcGrid.SetMapMode(MM_ANISOTROPIC); //+y down
m_dcGrid.SetWindowExt(m_rectGrid.Width(),m_rectGrid.Height());
m_dcGrid.SetViewportExt(m_rectClient.Width(),m_rectClient.Height());
m_dcGrid.SetViewportOrg(0,0);
//画背景
m_dcGrid.SetBkColor(m_clrBk);//字的背景色
//填充周围边框****
//开始记录top**
/* m_dcGrid.BeginPath(); //画背景框(灰色)上面那个横部分
m_dcGrid.MoveTo(m_rectGrid.left,m_rectGrid.top);
m_dcGrid.LineTo(m_rectGrid.right,m_rectGrid.top);
m_dcGrid.LineTo(m_rectGrid.right-65,m_rectGrid.top+60);
m_dcGrid.LineTo(m_rectGrid.left+60,m_rectGrid.top+60);
m_dcGrid.MoveTo(m_rectGrid.left,m_rectGrid.top);
//结束记录窗口
m_dcGrid.EndPath();
CBrush *pOldBrush;
CBrush brush1(::GetSysColor(COLOR_3DSHADOW));//构造画刷
pOldBrush=m_dcGrid.SelectObject(&brush1); *///本次没有用这种背景框!
//确定画图区大小 m_rectPlot:****
//长1000,宽800
//边框:左 100,上 140,右200,下300
//字:左 60,上 100(两行),右80,下100(两行)
m_rectPlot.left = m_rectGrid.left + 100+80+40;//原来+ 100+80+60
m_rectPlot.top = m_rectGrid.top + 140 ;//+ 140+ 100
m_rectPlot.right = m_rectGrid.right - 120;//- 200
m_rectPlot.bottom = m_rectGrid.bottom - 300-40 ;//- 300 - 100
//确定格子的大小
m_nXdiv=m_rectPlot.Width()/100;
m_nYdiv=m_rectPlot.Height()/80;
//准备画格子
m_dcGrid.SelectObject(&m_penGrid);
//画格子:
//horizontal
int i,x,y;
for(i = 0 ; i <= 80; i++)
{
y = m_rectPlot.top + i * m_nYdiv;
if(i % 10 == 0)//???
{//长格子
m_dcGrid.MoveTo(m_rectPlot.left, y);
m_dcGrid.LineTo(m_rectPlot.right, y);
}
//短格子
x = (m_rectPlot.left + m_rectPlot.right)/2;
m_dcGrid.MoveTo(x - m_nXdiv, y);
m_dcGrid.LineTo(x + m_nXdiv, y);
}
//vertical
for(i = 0 ; i <= 100; i++)
{
x = m_rectPlot.left + i * m_nXdiv ;
if(i % 10 == 0)//???
{//长格子
m_dcGrid.MoveTo(x, m_rectPlot.top);
m_dcGrid.LineTo(x, m_rectPlot.bottom);
}//短格子
y = (m_rectPlot.top + m_rectPlot.bottom)/2;
m_dcGrid.MoveTo(x, y - m_nYdiv);
m_dcGrid.LineTo(x, y + m_nYdiv);
}
CFont font, *pOldFont;
//选择字体
font.CreateFont(40,14,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH|FF_ROMAN,NULL);
pOldFont = m_dcGrid.SelectObject(&font);
//left: 30div, 20div, 10div, 0, -10div, -20div, -30div
//颜色和排列方式
m_dcGrid.SetTextColor(m_clrPlot);
m_dcGrid.SetTextAlign(TA_RIGHT|TA_BOTTOM);
//30div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 10 * m_nYdiv + 25,"30div");
//20div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 20 * m_nYdiv + 25, "20div");
//10div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 30 * m_nYdiv + 25, "10div");
//0
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 40 * m_nYdiv + 25, "0");
//-10div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 50 * m_nYdiv + 25, "-10div");
//-20div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 60 * m_nYdiv + 25, "-20div");
//-30div
m_dcGrid.TextOut(m_rectPlot.left-10,
m_rectPlot.top + 70 * m_nYdiv , "-30div");
//top
//right
//bottom
//排列方式
m_dcGrid.SetTextAlign(TA_CENTER|TA_TOP);
//"0"
m_dcGrid.TextOut(m_rectPlot.left, m_rectPlot.bottom + 10, "0");
//"50div"
m_dcGrid.TextOut(m_rectPlot.left + 50 * m_nXdiv,
m_rectPlot.bottom + 10, "50div");
//"100div"
m_dcGrid.TextOut(m_rectPlot.left + 100 * m_nXdiv,
m_rectPlot.bottom + 10, "100div");
}
BOOL CBkgd::Create(CWnd* pParentWnd,UINT ctlID,UINT nID)
{
m_ctlID = ctlID;//保存以备后用
BOOL bResult;
/*CRect rect;
pParentWnd->GetDlgItem(ctlID)->GetWindowRect(&rect);//得到窗口坐标
pParentWnd->ScreenToClient(&rect);//转换为父窗口内坐标
bResult = CWnd::CreateEx( NULL ,
AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW) ,
NULL, WS_VISIBLE | WS_CHILD, rect,
pParentWnd, nID);
pParentWnd->GetDlgItem(ctlID)->ShowWindow(SW_HIDE);//隐藏基准按钮
if(bResult != 0)
InvalidateCtrl();*/
return bResult;
}
void CBkgd::AppendPoints(double dNewPoints[501])//更新格子图
{
int i ;
for(i = 0; i <= 500; i++)
{
m_dCurrentPoints[i] = dNewPoints[i];
}
//调用DrawPoints()画曲线
DrawPoints() ;
}
void CBkgd::DrawPoints()//不起作用啊??
{
InvalidateCtrl();//更新格子图
if((m_bRun == TRUE) && (m_dcPlot.GetSafeHdc() != NULL))
{
//**清除背景(重画背景)
m_dcPlot.SetBkColor(m_clrBk);//可有可无,设置的是字的背景
m_dcPlot.FillRect(m_rectGrid,&m_brushBk);
//**准备画笔
CPen* pOldPen;
pOldPen = m_dcPlot.SelectObject(&m_penPlot);
//**画曲线
for(int i = 0; i < 500; i++)
{
m_dcPlot.MoveTo(i * 2 + m_rectPlot.left,
(int)( - m_dCurrentPoints[i] * m_nYdiv / m_dVdiv)
+ (m_rectPlot.top + m_rectPlot.bottom)/2);
m_dcPlot.LineTo((i+1) * 2 + m_rectPlot.left,
(int)( - m_dCurrentPoints[i + 1] * m_nYdiv / m_dVdiv)
+ (m_rectPlot.top + m_rectPlot.bottom)/2);
}
//**清除画出画图区的图(即用背景覆盖)
//top
CRect rectCleanUp;
rectCleanUp = CRect(m_rectGrid.left, m_rectGrid.top,
m_rectGrid.right, m_rectPlot.top);
m_dcPlot.FillRect(rectCleanUp, &m_brushBk);
//bottom
rectCleanUp = CRect(m_rectGrid.left, m_rectPlot.bottom,
m_rectGrid.right, m_rectGrid.bottom);
m_dcPlot.FillRect(rectCleanUp, &m_brushBk);
}
}
void CBkgd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CDC memDC;
CBitmap memBitamp,* pOldBitmap;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc,m_rectClient.Width(),m_rectClient.Height());
pOldBitmap=memDC.SelectObject(&memBitmap);
if(memDC.GetSafeHdc() != NULL)
{
//贴格子图
memDC.StretchBlt( 0, 0,
m_rectClient.Width(), m_rectClient.Height(),
&m_dcGrid, 0, 0, 1440, 1440, SRCCOPY );
//贴曲线图
memDC.StretchBlt( 0, 0,
m_rectClient.Width(), m_rectClient.Height(),
&m_dcPlot, 0, 0, 1440, 1440, SRCPAINT );
dc.BitBlt(0, 0,
m_rectClient.Width(), m_rectClient.Height(),
&memDC, 0, 0, SRCCOPY);
}
memDC.SelectObject(&pOldBitmap);
// Do not call CWnd::OnPaint() for painting messages
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -