计算机图形学实验指导书

发布时间 : 星期日 文章计算机图形学实验指导书更新完毕开始阅读

其中,space表示在文本字符之间使用的额外空间的像素数。

(3)设置文本的对齐方式

SetTextAlign()函数用于设置显示文本的对齐方式,函数说明如下:

pDC->SetTextAlign(alignment);

其中,alignment参数取值:TA_LEFT、TA_CENTER和TA_RIGHT,分别表示左对齐、居中方法和右对齐。Alignment参数取值:TA_TOP、TA_BOTTOM和TA_BASELINE分别表示文本在垂直方向的对齐方式,上对齐、下对齐和字符的基线对齐。

3.3 鼠标编程

在图形操作系统中,鼠标是最重要的输入设备之一。Windows系统为用户提供了统一的鼠标编程接口,而不必过多了解其底层的知识。Windows是基于消息传递、事件驱动的操作系统,当用户移动鼠标、按下或释放鼠标键时都会产生鼠标消息。应用程序可以接收10种鼠标消息,表3.3列出了这些鼠标消息和它们的描述。 表3.3鼠标消息和描述

消 息 描 述

WM_LBUTTONDBLCLK 鼠标左键被双击

WM_LBUTTONDOWN 鼠标左键被按下

WM_LBUTTONUP 鼠标左键被释放

WM_MBUTTONDBLCLK 鼠标中键被双击

WM_MBUTTONDOWN 鼠标中键被按下

WM_MBUTTONUP 鼠标中键被释放

WM_MOUSEMOVE 鼠标移动穿过对象区域

WM_RBUTTONDBLCLK 鼠标右键被双击

WM_RBUTTONDOWN 鼠标右键被按下

WM_RBUTTONUP 鼠标右键被释放

3.3.1 鼠标消息处理

MFC把鼠标消息处理函数封装在CView类中,它们分别是:

OnMouseMove(UINT nFlags, CPoint point); OnLButtonDblclk(UINT nFlags, CPoint point); OnLButtonDown(UINT nFlags, CPoint point); OnLButtonUp(UINT nFlags, CPoint point); ……

分别对应表3.3中10个鼠标消息。在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,point.x为横坐标,point.y为纵坐标。默认坐标原点(0,0)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用Windows事件处理函数,而不是成员函数,具体使用方法参见3.3.3节示例程序。

nFlags参数中包含了鼠标按钮和键盘组合使用标志,用来描述鼠标按钮和键盘上的Shift键和Ctrl键的组合状态。nFlag参数取值范围:

-- 17

(1) MK_LBUTTON:鼠标左键被按下; (2) MK_RBUTTON:鼠标右键被按下; (3) MK_MBUTTON:鼠标中键被按下; (4) MK_SHIFT:键盘上的Shift键被按下; (5) MK_CONTROL:键盘上的Ctrl键被按下;

如果想知道某个键是否被按下,可用对应的位屏蔽值与nFlags参数作按位逻辑“与”运算,所的结果若为非零值,则表示该按钮被按下,例如:

if (nFlags & LBUTTON)

AfxMessageBox(“LButton is pressed down!”) Else

AfxMessageBox(“LButton is pressed Up!”); 如何区分两次单击和一次双击,这取决于两次按下按钮之间的时间间隔,只有当时间间隔小于一定值时才被认为是一次双击。Windows默认的时间为500ms。可以用SetDoubleClickTime()函数来重新设置时间间隔值。

若要使窗口函数能接收到鼠标双击产生的消息,在注册窗口类时,必须指明该窗口具有CS_DBLCLKS风格,否则,即使进行了双击操作,该窗口也只能收到两条“WM_LBUTTONDOWN”和“WM_LBUTTONUP”消息,例如:

wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

3.3.2 捕捉鼠标

在交互式图形程序设计中,经常要使用鼠标的位置拾取、拖动或拖放,这些动作必须进行鼠标的捕捉。

鼠标捕捉只需要调用CWnd::SetCapture()函数。用户完成鼠标捕捉工作后一般是响应一个鼠标按下信息,要释放鼠标捕捉则是调用CWnd::ReleaseCapture()函数。释放被捕捉鼠标的最好时间是在响应鼠标弹起的时候(WM_LBUTTON)。

3.3.3 鼠标编程综合示例

示例1:在窗口中以文本的形式给出鼠标的状态,即当鼠标移动时,给出鼠标的位置;当鼠标按下鼠标左、右键时显示出鼠标按键状态。例如,当鼠标左键按下时,显示“LBUTTON DOWN!”。

第一步:建立一个myMouse工程文件; 第二步:添加鼠标事件处理函数

鼠标右击视图类(如CmyMouseView),选择“add windows message handler…”,弹出事件处理函数列表窗口,如图3-11所示

-- 18

图3-11 Windows事件处理函数列表窗口 从左边事件消息列表中选择“WM_LBUTTONDOWN”,然后单击“Add and Edit”按钮,即加入鼠标左键按下事件函数,并要求编辑事件处理程序。 第三步:输入事件处理程序

void CMymouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //获得pDC

CDC* pDC=GetDC();

pDC->TextOut(20,40,”LBUTTONDOWM!”); // 输出显示信息 CView::OnLButtonDown(nFlags, point); }

其中,阴影部分是用户输入的程序,其它内容都是自动生成的内容。

第四步:重复第二步和第三步,分别添加WM_LBUTTONUP,WM_MOUSEMOVE,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_LBUTTONDBCLK, WM_RBUTTONDBCLK鼠标事件,并输入以下程序:

void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,40,\ CView::OnLButtonUp(nFlags, point); }

void CMouseView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->TextOut(20,60,\

-- 19

CView::OnRButtonDown(nFlags, point); }

void CMouseView::OnRButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->TextOut(20,40,\ CView::OnRButtonUp(nFlags, point); }

void CMouseView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); char tbuf[80]; sprintf(tbuf,\ // 输出鼠标当前位置

pDC->TextOut(20,20,tbuf); CView::OnMouseMove(nFlags, point); }

void CMouseView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->TextOut(20,80,\ CView::OnLButtonDblClk(nFlags, point); }

void CMouseView::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->TextOut(20,80,\ CView::OnRButtonDblClk(nFlags, point); }

第五步:编译程序,并验证执行结果。

示例2:采用鼠标橡皮筋技术画圆

鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠标左键时,确定圆周上的一点,从而画出相应的圆。直线、矩形等基本图形都可以采用橡皮筋技术。

第一步:建立MouseSpring工程文件;

-- 20

联系合同范文客服:xxxxx#qq.com(#替换为@)