导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

初学者问题

evaiou 2002-07-25 04:20:15
OnMouseMove(UINT nFlags, CPoint point) 中改变了m_ptMouse 的值
这个值被用于CDialog::OnPaint()中,作为画眼睛的一个相对位置
我想知道,为什么m_ptMouse 变了,CDialog::OnPaint();就会被执行
整个对话框就对刷新一次,OnMouseMove的消息难道也会传到CDialog::OnPaint()来吗
void CMouseMsgDlg::OnMouseMove(UINT nFlags, CPoint point)
{


// ** Display the mouse position
CString strMessage;
strMessage.Format("Mouse Position = (%d,%d)",point.x,point.y);
SetWindowText(strMessage);

// ** Store the point and reddraw the window
m_ptMouse = point;
Invalidate();

CDialog::OnMouseMove(nFlags, point);
}

void CMouseMsgDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
// ** Creat a device context for drawing
CPaintDC dc(this);

// ** Find the dialog dimensions
CRect rcDlg;
GetClientRect(&rcDlg);

// ** Loop twice, once for each eye
for (int i=0;i<2;i++)
{
// ** Find the center of the eye
CPoint ptEye = rcDlg.CenterPoint();

// ** Set the eye position for each eye
ptEye.x += i==0 ? -80 : +80;

// ** Make an eye rectangle
CRect rcEye(ptEye,ptEye);
rcEye.InflateRect(40,60);

// ** Draw an eye white
if (m_RectTracker.HitTest(rcEye.CenterPoint())!=CRectTracker::hitNothing)
dc.SelectStockObject(GRAY_BRUSH);
else
dc.SelectStockObject(WHITE_BRUSH);
dc.Ellipse(rcEye);
rcEye.DeflateRect(20,40);

// ** use the mouse position to update the pupil
CPoint ptRel = m_ptMouse - rcEye.CenterPoint();
double dX = (double)ptRel.x * (rcEye.Width() / (double)rcDlg.Width());
double dY = (double)ptRel.y * (rcEye.Height() / (double)rcDlg.Height());

// ** Move the pupil position and draw it
rcEye.OffsetRect(CPoint((int)dX,(int)dY));
dc.SelectStockObject(BLACK_BRUSH);
dc.Ellipse(rcEye);
}

CDialog::OnPaint();
}
}
...全文
3 点赞 收藏 1
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chenxiaa 2002-07-25
不是因为m_ptMouse变了,
是因为Invalidate();导致对话框无效,使其刷新。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……