VC++画直线 不是《VC++深入详解》第四章讲的那种画法书上讲的是松开鼠标左键之后才显示一条直线。我想问的是按下鼠标左键就开始画 松开鼠标左键之后形成一条直线就是开始-附件-画图里的画直线或WORD绘图里的画直线一样的功能。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你需要的是windows自带的画图工具画直线那样是吧?如果是这样的话,那么光一个鼠标左键写实现是不够的,你还必须加一个鼠标响应移动的实现,也就是说,当你的鼠标在视图中不断在移动时,直线实时的现实绘画! 在WM_LBUTTONDOWN事件中记录起点坐标,然后做一个开始画线的标志在WM_MOUSEMOVE事件中先删除前一条线,再画新的线在WM_LBUTTONUP事件中,取消开始画线的标志就可以了。 开始一样 在WM_LBUTTONDOWN消息里面记录起始坐标 然后直接在WM_MOUSEMOVE里面添加画直线函数 把这个消息加上去:WM_MOUSEMOVE事件中先删除前一条线,再画新的线 //WM_MOUSEMOVING中调用这个函数 m_bReDraw DOWN的时候置成TRUE UP的时候为FALSE 你吧矩形画法换成直线画法就可以了void XXX::DrawDashRectangle(CPoint point){ CDC *pDc = GetWindowDC(); CPen pen(PS_DASH,1,(COLORREF)0x0); CPen* pOldPen = pDc->SelectObject(&pen); pDc->SetROP2(R2_NOTXORPEN); if (m_bReDraw) { pDc->Rectangle(m_ptTemp.x, m_ptTemp.y, m_nWidth, m_nHeight); } m_ptTemp = point; pDc->Rectangle(m_ptTemp.x, m_ptTemp.y, m_nWidth, m_nHeight); pDc->SelectObject(&pOldPen); ReleaseDC(pDc);} 设置一个标志变量鼠标左键按下时将其职为真同时保存鼠标落点作为线段起点SetCapture在OnMouseMoving里当标志变量为真时就绘制一条从起点到当前点的直线这里注意要擦除先前绘制的直线鼠标左键抬起的消息中标志变量置甲ReleaseCapture当然具体编程的时候还有一些细节需要处理不过大概思路就是这样了 WM_LBUTTONDOWN 记录起点WM_LBUTTONUP 记录终点UP的时候,画一条直线! void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default static int a=0; static int x=0; static int y=0; if(GetKeyState(VK_LBUTTON) & 0x80000000) { CDC* pDC=GetDC(); if(a == 1) { pDC->MoveTo(x, y); pDC->LineTo(point.x, point.y); } a=1; x=point.x; y=point.y; } else a=0; CDialog::OnMouseMove(nFlags, point);}这个可以 现在多媒体通讯方面流行什么技术呢? 怎样能在vc中获得excel文件里的所有用户表的表名? 不知道该如何解决!请帮忙! opengl的鼠标 菜鸟请教:视窗显示是否有层次啊? 怎么样在程序中访问网页,然后得到数据流 散分系列四 有个串口通信的dll,我想封装成activex控件,接口函数不怎么会设置?谁帮看看? 请问如何使一个BUTTON按纽变灰? 如何使用true type字体 谁能给我个最简单的钩子程序 为什么我写的Activex控件,切换窗口后画的图就没有了
如果是这样的话,那么光一个鼠标左键写实现是不够的,你还必须加一个鼠标响应移动的实现,也就是说,当你的鼠标在视图中不断在移动时,直线实时的现实绘画!
在WM_MOUSEMOVE事件中先删除前一条线,再画新的线
在WM_LBUTTONUP事件中,取消开始画线的标志就可以了。
void XXX::DrawDashRectangle(CPoint point)
{
CDC *pDc = GetWindowDC();
CPen pen(PS_DASH,1,(COLORREF)0x0);
CPen* pOldPen = pDc->SelectObject(&pen);
pDc->SetROP2(R2_NOTXORPEN);
if (m_bReDraw)
{
pDc->Rectangle(m_ptTemp.x, m_ptTemp.y, m_nWidth, m_nHeight);
} m_ptTemp = point;
pDc->Rectangle(m_ptTemp.x, m_ptTemp.y, m_nWidth, m_nHeight);
pDc->SelectObject(&pOldPen);
ReleaseDC(pDc);
}
鼠标左键按下时将其职为真
同时保存鼠标落点作为线段起点
SetCapture
在OnMouseMoving里
当标志变量为真时就绘制一条从起点到当前点的直线
这里注意要擦除先前绘制的直线
鼠标左键抬起的消息中
标志变量置甲
ReleaseCapture当然具体编程的时候还有一些细节需要处理
不过大概思路就是这样了
WM_LBUTTONUP 记录终点UP的时候,画一条直线!
{
// TODO: Add your message handler code here and/or call default
static int a=0;
static int x=0;
static int y=0;
if(GetKeyState(VK_LBUTTON) & 0x80000000)
{ CDC* pDC=GetDC();
if(a == 1)
{
pDC->MoveTo(x, y);
pDC->LineTo(point.x, point.y);
}
a=1;
x=point.x;
y=point.y;
}
else
a=0;
CDialog::OnMouseMove(nFlags, point);
}这个可以