需要对windows中的“消息”进行编程,比如,对WM_LBUTTONDOWN这个消息建立一个函数,这个函数就会在鼠标左键按下后执行。当然键盘也一样,WM_KEYDOWN就是针对键盘的。
WM_LBUTTONDOWN消息的函数有两个参数,第一个UINT nFlags,用来判断哪个键被按下,用来和MK_LBUTTON这样的鼠标键码做与运算,如果值为真就是这个左键被按下了,第二个参数CPoint point则用来保存当前鼠标的坐标,用point.x和point.y来访问。
用鼠标绘画,得建立一个CClientDC的实例-CClientDC dc(this);dc.SetPixel(x,y,RGB(r,g,b))则用来对特定点上特定色。但是这个方法不实用,在鼠标快速移动时,画出来的线是虚的,需要用moveto和lineto来画实线-dc.MoveTo(x1,y1);dc.LineTo(x2,y2)。这两条会在(x1,y1)和(x2,y2)之间画一条实线。把moveto和lineto加到WM_MOUSEMOVE的消息函数里去,就可以在鼠标的移动中不断画出需要的线来。如果要改变画线的颜色和粗细,得用这样的方法:CPen penNew(PS_SOLID, 16, RGB(r,g,b));dc.SelectObject(&penNew);第一句建立一个特定笔触、粗细、颜色的画笔,第二句把这个画笔选中到当前dc里去。然后Lineto和moveto就用这样的画笔来画线了。
WM_KEYDOWN的消息函数有3个参数(UINT nChar, UINT nRepCnt, UINT nFlags),第一个是键值,可以用char(nChar)来转换成字符,第二个是该键被按住了多少次连发,第三个参数用来检查是否有alt被按下等。
例子里用了更改鼠标光标形状的代码,用HCURSOR lhCursor来实例化一个光标句柄,用lhCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW)来加载一个特定光标形状,再用SetCursor(lhCursor)来激活此光标,这样,默认光标就被替换了。但是在鼠标移动或其他事件发生时,默认的WM_SETCURSOR消息又会把光标恢复回默认的箭头(IDC_ARROW),所以需要对WM_SETCURSOR消息的处理进行编程,用一个函数。这个函数在修改完默认光标后,返回一个true,而不是默认动作,这样就可以一直使用修改过的光标,直到你让这个函数返回非true的原值。
如何来判断shift或者ctrl被同时按下?如果::GetKeyState(VK_SHIFT)的返回值是个负数,那么,该键已经被按下了。