void CZjqChartView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient); CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap tempbmp;
tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
//memdc.FillSolidRect(rcClient,RGB(255,255,255));
//在memdc上画图了
CPen pen(PS_SOLID,2,RGB(255,255,255));
CPen* pOldPen = memdc.SelectObject(&pen);
//x轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
//画箭头
memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30); //y轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //画箭头
memdc.MoveTo(rcClient.left+25,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
memdc.MoveTo(rcClient.left+35,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //复制到dc上去.
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
//最后还要释放
ReleaseDC(&dc);
ReleaseDC(&memdc);
}
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient); CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap tempbmp;
tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
//memdc.FillSolidRect(rcClient,RGB(255,255,255));
//在memdc上画图了
CPen pen(PS_SOLID,2,RGB(255,255,255));
CPen* pOldPen = memdc.SelectObject(&pen);
//x轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
//画箭头
memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30); //y轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //画箭头
memdc.MoveTo(rcClient.left+25,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
memdc.MoveTo(rcClient.left+35,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //复制到dc上去.
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
//最后还要释放
ReleaseDC(&dc);
ReleaseDC(&memdc);
}
解决方案 »
- 对话框程序中,如何使用正则表达式?
- 选中LIST表的某一行,进行拖动,在拖带的过程中使鼠标产生,鼠标的自定义形状 <待高手解决>
- 如何实现扫描一个网段的特定端口
- 各位行行好进来帮下忙好吗!
- 求购 -- ATL开发指南(第二版)
- vc程序怎样和vb程序共享数据?
- c++中用什么方法可以把一个CString类型的数组转换成Char?
- HeaderCtrl重绘问题,如何绘制最后一个HeaderItem?
- 委托和事件怎么样才能很好的掌握???
- 请问用vc做excel折线图,怎么设置横坐标轴与纵坐标轴的交叉点
- @@@@@@Windows服务程序,监听错误,高手进,在线高分相送!up有分!!@@@@@
- 如何让操作系统在关闭之前执行一个应用程序,这个程序是没有启动的?
你再看看程序的其他地方,是不是有别的绘图代码,比如Ondraw里面
只在OnPaint绘图,其他地方没有啊
(1) 使用双缓冲,在内存dc上完成所有的绘制,然后一次BitBlt到目标dc上
(2)阻止windows刷背景,WM_ERASEBKGND消息返回true
我怎么解决这个问题呢??
一样闪啊。
我想写一个画曲线的类。
看这个类的图像,建立一个对话框程序 声明变量CZjqChartView a;
然后在OnInitDialog()中加入
CRect rc;
GetClientRect(&rc);
a.CreateChartView(this,rc);
在OnSize()加入
if (a.GetSafeHwnd())
{
CRect rcClient;
GetClientRect(&rcClient);
a.MoveWindow(rcClient);
} // ZjqChartView.h: interface for the CZjqChartView class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_)
#define AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CZjqChartView : public CWnd
{
private:
LONG m_InX;
LONG m_InY;
BOOL m_Size;
int m_Border;
public:
CZjqChartView();
virtual ~CZjqChartView(); // Operations
public:
//创建曲线显示窗体
BOOL CreateChartView(CWnd *pParentWnd, CRect &rect);
protected:
//{{AFX_MSG(CZjqChartView)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};#endif // !defined(AFX_ZJQCHARTVIEW_H__8EE11C9A_75C7_49B1_99DA_F8060C7C74E1__INCLUDED_).cpp
// ZjqChartView.cpp: implementation of the CZjqChartView class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "zjqChart.h"
#include "ZjqChartView.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CZjqChartView::CZjqChartView()
{
m_InX = 0;
m_InY = 0;
m_Size = true;
m_Border = 30;
}CZjqChartView::~CZjqChartView()
{}BEGIN_MESSAGE_MAP(CZjqChartView, CWnd)
//{{AFX_MSG_MAP(CZjqChartView)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()BOOL CZjqChartView::CreateChartView(CWnd *pParentWnd, CRect &rect)
{
if(Create(NULL, "ZjqChartView", WS_CHILD | WS_VISIBLE | WS_BORDER, rect, pParentWnd, 1000))
{
return 1;
}
else
{
return 0;
}
}BOOL CZjqChartView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}void CZjqChartView::OnSize(UINT nType, int cx, int cy)
{}void CZjqChartView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient); CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap tempbmp;
tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
//memdc.FillSolidRect(rcClient,RGB(255,255,255));
//在memdc上画图了
CPen pen(PS_SOLID,2,RGB(255,255,255));
CPen* pOldPen = memdc.SelectObject(&pen);
CPen pen1(PS_DOT,1,RGB(121,163,208));
CPen pen2(PS_SOLID,1,RGB(121,163,208)); float xSpin,ySpin;
float a;
a = 10;
xSpin = (rcClient.right-60-rcClient.left)/a;
//画x轴虚线网格
for(int i=1;i<11;i++)
{
pOldPen = memdc.SelectObject(&pen1);
memdc.MoveTo(rcClient.left+30+i*xSpin,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30+i*xSpin,rcClient.top+30);
}
//x轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
//画箭头
memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30); ySpin = (rcClient.bottom-60-rcClient.top)/a;
//画y轴虚线网格
for(int j=1;j<11;j++)
{
pOldPen = memdc.SelectObject(&pen1);
memdc.MoveTo(rcClient.right-30,rcClient.bottom-30-j*ySpin);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30-j*ySpin);
}
//y轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.top+30); //画箭头
memdc.MoveTo(rcClient.left+25,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
memdc.MoveTo(rcClient.left+35,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
//画跟着鼠标移动的线
if(m_InX && m_InY)
{
//画x轴
pOldPen = memdc.SelectObject(&pen2);
memdc.MoveTo(rcClient.left+30,m_InY);
memdc.LineTo(rcClient.right-30,m_InY);
memdc.MoveTo(m_InX,rcClient.bottom-30);
memdc.LineTo(m_InX,rcClient.top+30);
}
//复制到dc上去.
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
//最后还要释放
ReleaseDC(&dc);
ReleaseDC(&memdc);
// Do not call CWnd::OnPaint() for painting messages
}void CZjqChartView::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rcClient;
GetClientRect(rcClient);
if(point.x <=rcClient.right -30 && point.x >=30 &&
point.y >=30 && point.y<=rcClient.bottom -30)
{
m_InX = point.x;
m_InY = point.y;
}
else
{
m_InX = 0;
m_InY = 0;
} Invalidate(TRUE);
CWnd::OnMouseMove(nFlags, point);
}
这句删了就画不出跟着鼠标一起移动的十字了
在对话框上创建显示这个控件,
声明变量 CZjqChartView a;
然后在OnInitDialog()中加入
CRect rc;
GetClientRect(&rc);
a.CreateChartView(this,rc);这个控件就在对话框上显示出来了