我直接在对话框上画线。
不多说,给出我的关键代码:
class CMainDialog:public CDialog
{
public:
CMainDialog(CWnd* pParentWnd = NULL);
protected:
virtual BOOL OnInitDialog();
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
DECLARE_MESSAGE_MAP()
protected:
CPen black_Pen; //一些数据
CPen gray_Pen;
BOOL m_bDraw;
CPoint m_StartPoint;
CPoint m_EndPoint;
};//...void CMainDialog::OnLButtonDown(UINT nFlags, CPoint point) //左键按下时,记录下头尾位置
{
m_bDraw=TRUE;
m_StartPoint=m_EndPoint=point;
CDialog::OnLButtonDown(nFlags,point);
}void CMainDialog::OnLButtonUp(UINT nFlags, CPoint point) //左键放开,画线结束
{
m_bDraw=FALSE;
CDialog::OnLButtonUp(nFlags,point);
}void CMainDialog::OnMouseMove(UINT nFlags, CPoint point) //鼠标移动时,先擦除,再画线
{
if(m_bDraw)
{
CDC* pDC=GetDC(); pDC->SelectObject(&gray_Pen);
pDC->MoveTo(m_StartPoint); //用底色重画
pDC->LineTo(m_EndPoint);
pDC->SelectStockObject(BLACK_PEN); CPen* pOldPen=pDC->SelectObject(&black_Pen);
m_EndPoint=point;
pDC->MoveTo(m_StartPoint); //画新线
pDC->LineTo(m_EndPoint); pDC->SelectObject(pOldPen);
}
CDialog::OnMouseMove(nFlags,point);
}症状:移动鼠标画线时,线段上有闪烁现象。我试着用Windows自带的画图程序画线,没有闪烁现象。如果原先的位置已经画过了其它的线段,那么新画线时会擦除掉经过的区域的直线。请问,这两个问题该怎么解决?先谢过了,等待指点
不多说,给出我的关键代码:
class CMainDialog:public CDialog
{
public:
CMainDialog(CWnd* pParentWnd = NULL);
protected:
virtual BOOL OnInitDialog();
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
DECLARE_MESSAGE_MAP()
protected:
CPen black_Pen; //一些数据
CPen gray_Pen;
BOOL m_bDraw;
CPoint m_StartPoint;
CPoint m_EndPoint;
};//...void CMainDialog::OnLButtonDown(UINT nFlags, CPoint point) //左键按下时,记录下头尾位置
{
m_bDraw=TRUE;
m_StartPoint=m_EndPoint=point;
CDialog::OnLButtonDown(nFlags,point);
}void CMainDialog::OnLButtonUp(UINT nFlags, CPoint point) //左键放开,画线结束
{
m_bDraw=FALSE;
CDialog::OnLButtonUp(nFlags,point);
}void CMainDialog::OnMouseMove(UINT nFlags, CPoint point) //鼠标移动时,先擦除,再画线
{
if(m_bDraw)
{
CDC* pDC=GetDC(); pDC->SelectObject(&gray_Pen);
pDC->MoveTo(m_StartPoint); //用底色重画
pDC->LineTo(m_EndPoint);
pDC->SelectStockObject(BLACK_PEN); CPen* pOldPen=pDC->SelectObject(&black_Pen);
m_EndPoint=point;
pDC->MoveTo(m_StartPoint); //画新线
pDC->LineTo(m_EndPoint); pDC->SelectObject(pOldPen);
}
CDialog::OnMouseMove(nFlags,point);
}症状:移动鼠标画线时,线段上有闪烁现象。我试着用Windows自带的画图程序画线,没有闪烁现象。如果原先的位置已经画过了其它的线段,那么新画线时会擦除掉经过的区域的直线。请问,这两个问题该怎么解决?先谢过了,等待指点
解决方案 »
- 应该怎样给DX90SDK\Samples\C++\DirectShow\Capture\AMCap加上一个抓图的功能
- 做过IE MIME过滤的朋友帮忙看下,中国雅虎首页的flash出不来
- 怎样将图片做成DLL形式
- 请教关于函数_access的问题
- 响应什么函数可以在工程主窗体创建完成后,调用某一对话框?
- 耦合???怎么解决啊!!11
- 请问怎么在一个.exe中启动或中止另一个.exe
- 哪儿有<<Windows防火墙与网络封包截获技术>>电子版和源代码下载?
- 关于Microsoft Date and Time Picker的使用问题!!!
- 关于中文安装程序制作_修改_Isuer.dll
- 在VC++中用mschart画图后怎样动态生成bmp格式文件?
- 大侠来看看,不知道为什么
如果有不变的图片背景,可将背影保存到成员内存设备中,合起来就是
双缓冲
在OnMouseMove中用InvalidateRect();来进行刷新
{
CDC *pDC = GetDC();
int nMode = pDC->SetROP2(R2_NOTXORPEN);
pDC->MoveTo(m_StartPoint);
pDC->LineTo(m_EndPoint); pDC->MoveTo(m_StartPoint);
pDC->LineTo(point);
m_EndPoint = point;
pDC->SetROP2(nMode);
ReleaseDC(pDC);
}