VC编程之VC++鼠标操作资料整理
小标 2019-01-15 来源 : 阅读 1924 评论 0

摘要:本文主要向大家介绍了VC编程之VC++鼠标操作资料整理,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC++鼠标操作资料整理,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

鼠标滚轮:
鼠标垂直滚轮消息是WM_MOUSEWHEEL,其中wParam>0向上滚动,<0向下滚动,滚动的同时按下Ctrl,为放大缩小。
鼠标水平滚轮消息是WM_MOUSEHWHEEL。
鼠标参数判断:
//blog.csdn.net/poem_qianmo/article/details/7405479
一,鼠标消息的处理方式
 
大家都知道,目前市场上主流鼠标规格为两个按键加上一个滚轮。那么,我们先列出Windows中这种鼠标设备输入时的消息:
 
WM_LBUTTONDBLCLK      双击鼠标左键消息
WM_LBUTTONDOWN       单击鼠标左键消息
WM_LBUTTONUP           松开鼠标左键消息
WM_MBUTTONDBLCLK     双击鼠标中键(滚轮)消息
WM_MBUTTONDOWN      单击鼠标中键(滚轮)消息
WM_MBUTTONUP          松开鼠标中键(滚轮)消息
WM_RBUTTONDBLCLK      双击鼠标右键消息
WM_RBUTTONDOWN       单击鼠标右键消息
WM_RBUTTONUP           松开鼠标右键消息
WM_MOUSEMOVE          鼠标移动消息
WM_MOUSEWHEEL         鼠标滚轮转动消息
 
处理鼠标消息的方法与处理键盘消息的方法类似,同样是在消息处理函数中加入要处理的鼠标消息类型,当鼠标消息发生时,输入的参数“wParam”与“lParam”则储存了鼠标状态的相关信息。
 
 
 
下面我们分别来展开讲解一下“wParam”与“lParam”参数以及滚轮消息。
 
<l>Param参数
lParam参数的值可分为高位字节与低位字节两个部分,其中高节部分储存的是鼠标光标所在的X坐标值,低位字节部分存储的则是鼠标光标所在的Y坐标值。
我们可以用下面两个函数来取得鼠标的坐标值:
WORD LOWORD(lParam参数);           //返回鼠标光标所在的X坐标值
WORD HIWORD(lParam参数);           //返回鼠标光标所在的Y坐标值
这两个两个函数所返回的鼠标光标位置的坐标是相对于内部窗口左上点坐标的。
 
<2>wParam参数
 "wParam"参数的值记录着鼠标按键及键盘【Ctrl】键与【Shift】键的状态信息,通过下面的这些定义在“WINUSER.H”中的测试标志与“wParam”参数来检查上述按键的按下状态。
MK_LBUTTON            按下鼠标右键
MK_MBUTTON           按下鼠标中(滚轮)键
MK_RBUTTON            按下鼠标右键
MK_SHIFT                按下【Shift】键
MK_CONTROL            按下【Ctrl】键
【例子1】例如某一鼠标消息发生时,要测试鼠标左键是否也被按下,程序代码如下:
[cpp] view plaincopyprint?
1.   if(wParam & MK_LBUTTON)      //这里应该是按位与&,之前我写错了,谢谢 a443475601 的指出,  
2.   {  
3.   //鼠标左键被按下  
4.   }  
 
 
这是利用wParam参数与测试标志来测试鼠标键是否被按下的方法。当按键被按下时,条件式“wParam && MK_LBUTTON”所传回的结果会为“true”。当然,若消息函数接收到“WM_LBUTTONDOWN”消息,同样也可以知道鼠标键被按下而不必再去额外做这样的测试。
【例子2】如果要测试鼠标左键与【Shift】键的按下状态,那么程序代码如下:
 
[cpp] view plaincopyprint?
1.   If(wParam & MK_LBUTTON)  
2.   {  
3.   If(wParam & MK_SHIFT)  
4.   {  
5.   //单击鼠标左键  
6.   //按下【Shift】键  
7.   }  
8.   else  
9.   {  
10.  //单击鼠标左键  
11.  //未按下【Shift】键  
12.  }  
13.  }  
14.  else  
15.  {  
16.  If(wParam & MK_SHIFT)  
17.  {  
18.  //未单击鼠标左键  
19.  //按下【Shift】键  
20.  }  
21.  else  
22.  {  
23.  //未单击鼠标左键  
24.  //未按下【Shift】键  
25.  }  
26.  }  

我们通过这个例子可以清楚,如何利用“wParam”参数与测试标志来测试鼠标键及【Shift】键和【Ctrl】键是否被按下的方法。
 
<3>滚轮消息
这里我们要特别提一下鼠标滚轮转动消息(WM_MOUSEWHEEL)。当鼠标滚轮转动消息发生时,“lParam”参数中的值同样是记录光标所在的位置的,而“wParam”参数则分为高位字节与低位字节两部分,低位字节部分跟前面一样是储存鼠标键与【Shift】【Ctrl】键的状态信息的,而高位字节部分的值会是“120”或“-120”。“120”表示鼠标滚轮向前转动,而“-120”则表示向后转动。
 
这里“wParam”高位组值与低位组值所在的函数同样是HIWORD( )与LOWORD( )。
HIWORD(wParam);//高位组,值为“120”或“-120”
LOWORD(wParam);//低位组,鼠标键及【Shift】和【Ctrl】键的状态信息
 
 
二,相关函数的讲解
 
对各种鼠标输入消息及鼠标状态信息的获取方法有了基本认识之后,下面我们将介绍一些游戏程序中以鼠标来做输出设备时常用到的函数。
 
1.获取窗口外鼠标消息的函数
为了确保程序可以正确地取得鼠标的输入消息,需要在必要的时候以下面的函数来设定窗口,以取得鼠标在窗口外所发出的消息。
HWND SetCapture(HWND hWnd) ;   //设定获取窗口外的鼠标消息
如果调用了上面的SetCapture( )函数,并输入要取得鼠标消息的窗口代号,那么便可取得鼠标在窗口外所发出的消息。这种方法也适用于多窗口的程序,与SetCapture( )函数相对应的函数为ReleaseCapture( )函数,用于释放窗口取得窗口外鼠标消息的函数。
BOOL ReleaseCapture(VOID);    //释放获取窗口外的鼠标消息
 
2.设定鼠标光标位置的函数
BOOL SetCursorPos(int X坐标,int Y坐标);     //设定鼠标光标位置
上面这个SetCursorPos()函数中所设定的坐标是相对于屏幕左上角的屏幕坐标而言。实际上,我们经常需要将这个屏幕坐标转换为游戏窗口中的游戏窗口坐标。因此需要用到API中的一个将窗口坐标转换到屏幕坐标的函数,即ClientToScreen()。
屏幕坐标和窗口坐标转换的函数
BOOL ClientToScreen(HWND hWnd,     //屏幕坐标转换为窗口坐标
LPPOINT lpPoint屏幕点坐标);
   同理,我们得到:
窗口坐标转换为屏幕坐标的函数:
BOOL ScreenToClient(   LPPOINT lpPoint窗口点坐标 )   //窗口坐标转换为屏幕坐标
 
3.显示与隐藏鼠标光标的函数
Int ShowCursor(BOOL true或flase);    //隐藏及显示鼠标光标
其中,true代表显示光标,false代表隐藏光标。
 
4.限制鼠标光标移动区域的函数
Windows API中提供的ClipCursor()函数可以用来设置限制鼠标光标的移动区域和解除鼠标光标移动区域的限制。
BOOL ClipCursor(CONST RECT 移动区域矩形);  //限制鼠标光标移动区域
BOOL ClipCursor(NOOL);                     //解除限制
这里有一个RECT移动区域矩形,我们在MSDN中找出它的声明:
[cpp] view plaincopyprint?
1.   typedef struct tagRECT {   
2.           LONG left;  //矩形区域右上点X坐         
3.        LONG top;  //矩形区域右上点Y坐标  
4.           LONG right;  //矩形区域左上点X坐标  
5.           LONG bottom;  //矩形区域左上点Y坐标  
6.   } RECT;  
 
5.取得窗口外部区域及内部区域的API函数
我们还需知道取得窗口外部区域及内部区域的API函数。
BOOL GetWindowRect(HWND hWND,LPRECT 矩形结构);//取得窗口外部区域矩形
BOOL GetClientRect(HWND hWnd,LPRECT 矩形结构体); //取得窗口内部区域矩形
这里需要注意的是,GetWindowRect()返回的坐标类型是屏幕坐标。
                          GetClientRect()返回的坐标类型是窗口坐标。
由于限制鼠标光标移动区域的ClipCursor()函数中输入的矩形区域必须是屏幕坐标,因此如果取得的是窗口内部区域,那么还必须将窗口坐标转换为屏幕坐标的操作,下面我们以一段程序代码来说明将鼠标光标限制在窗口内部区域移动的过程:
[cpp] view plaincopyprint?
1.   RECT rect;  
2.   POINT lt,rb;  
3.   GetClientRect(hWnd,&rect);  //取得窗口内部矩形  
4.   //将矩形左上点坐标存入lt中  
5.   lt.x = rect.left;  
6.   lt.y = rect.top;  
7.   //将矩形右下坐标存入rb中  
8.   rb.x = rect.right;  
9.   rb.y = rect.bottom;  
10.  //将lt和rb的窗口坐标转换为屏幕坐标  
11.  ClientToScreen(hWnd,<);  
12.  ClientToScreen(hWnd,&rb);  
13.  //以屏幕坐标重新设定矩形区域  
14.  rect.left = lt.x;  
15.  rect.top = lt.y;  
16.  rect.right = rb.x;  
17.  rect.bottom = rb.y;  
18.  //限制鼠标光标移动区域  
19.  ClipCursor(&rect);  


 
三,在实例中融会贯通
 
讲了这么多的windows API函数了,也早该到了我们的showtime了,依然,我们通过一个实例来把本节所讲的内容融会贯通。
这个实例处理鼠标移动消息使飞机在窗口中移动,并且处理单击鼠标左键消息来让飞机发射子弹,而且设定了鼠标光标的位置,隐藏了鼠标光标,还有限制了鼠标光标移动的区域。(背景贴图采用循环背景滚动,其实很简单,就是每次都把窗口右边多余的部分再贴到窗口坐标来,以后有机会我会作为一节笔记具体讲)
 
同样的,我们贴出详细注释好的代码:
 
[cpp] view plaincopyprint?
1.   #include "stdafx.h"  
2.   #include <stdio.h>  
3.     
4.   //定义结构体  
5.   struct BULLET       //bullet结构体代表飞机子弹  
6.   {  
7.       int x,y;        //子弹坐标  
8.       bool exist;     //子弹是否存在  
9.   };  
10.    
11.  //全局变量声明  
12.  HINSTANCE hInst;  
13.  HBITMAP bg,ship,bullet;     //存储背景图,飞机图,子弹图  
14.  HDC     hdc,mdc,bufdc;  
15.  HWND    hWnd;  
16.  DWORD   tPre,tNow;  
17.  int     x,y,nowX,nowY;    //x,y代表鼠标光标所在位置,nowX,nowY代表飞机坐标,也是贴图的位置  
18.  int     w=0,bcount;       //w为滚动背景所要裁剪的区域宽度,bcount记录飞机现有子弹数目  
19.  BULLET  b[30];           //声明一个“bullet”类型的数组,用来存储飞机发出的子弹  
20.    
21.  //全局函数声明  
22.  ATOM                MyRegisterClass(HINSTANCE hInstance);  
23.  BOOL                InitInstance(HINSTANCE, int);  
24.  LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);  
25.  void                MyPaint(HDC hdc);  
26.    
27.  //****WinMain函数,程序入口点函数**************************************  
28.  int APIENTRY WinMain(HINSTANCE hInstance,  
29.                       HINSTANCE hPrevInstance,  
30.                       LPSTR     lpCmdLine,  
31.                       int       nCmdShow)  
32.  {  
33.      MSG msg;  
34.    
35.      MyRegisterClass(hInstance);  
36.    
37.      //初始化  
38.      if (!InitInstance (hInstance, nCmdShow))   
39.      {  
40.          return FALSE;  
41.      }  
42.    
43.      //消息循环  
44.       GetMessage(&msg,NULL,NULL,NULL);            //初始化msg      
45.      while( msg.message!=WM_QUIT )  
46.      {  
47.          if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )  
48.          {  
49.              TranslateMessage( &msg );  
50.              DispatchMessage( &msg );  
51.          }  
52.          else  
53.          {  
54.              tNow = GetTickCount();  
55.              if(tNow-tPre >= 40)  
56.                  MyPaint(hdc);  
57.          }  
58.      }  
59.    
60.      return msg.wParam;  
61.  }  
62.    
63.  //****设计一个窗口类,类似填空题,使用窗口结构体*********************  
64.  ATOM MyRegisterClass(HINSTANCE hInstance)  
65.  {  
66.      WNDCLASSEX wcex;  
67.    
68.      wcex.cbSize = sizeof(WNDCLASSEX);   
69.      wcex.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;  
70.      wcex.lpfnWndProc    = (WNDPROC)WndProc;  
71.      wcex.cbClsExtra     = 0;  
72.      wcex.cbWndExtra     = 0;  
73.      wcex.hInstance      = hInstance;  
74.      wcex.hIcon          = NULL;  
75.      wcex.hCursor        = NULL;  
76.      wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);  
77.      wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);  
78.      wcex.lpszMenuName   = NULL;  
79.      wcex.lpszClassName  = "canvas";  
80.      wcex.hIconSm        = NULL;  
81.    
82.      return RegisterClassEx(&wcex);  
83.  }  
84.    
85.  //****初始化函数*************************************  
86.  // 1.设定飞机初始位置  
87.  // 2.设定鼠标光标位置及隐藏  
88.  // 3.限制鼠标光标移动区域  
89.  BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  
90.  {  
91.      HBITMAP bmp;  
92.      POINT pt,lt,rb;  
93.      RECT rect;  
94.    
95.      hInst = hInstance;  
96.    
97.      hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,  
98.          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  
99.    
100.              if (!hWnd)  
101.              {  
102.                  return FALSE;  
103.              }  
104.            
105.              MoveWindow(hWnd,10,10,640,480,true);  
106.              ShowWindow(hWnd, nCmdShow);  
107.              UpdateWindow(hWnd);  
108.            
109.              hdc = GetDC(hWnd);  
110.              mdc = CreateCompatibleDC(hdc);  
111.              bufdc = CreateCompatibleDC(hdc);  
112.            
113.              bmp = CreateCompatibleBitmap(hdc,640,480);  
114.              SelectObject(mdc,bmp);  
115.            
116.              bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,648,480,LR_LOADFROMFILE);  
117.              ship = (HBITMAP)LoadImage(NULL,"ship.bmp",IMAGE_BITMAP,100,148,LR_LOADFROMFILE);  
118.              bullet = (HBITMAP)LoadImage(NULL,"bullet.bmp",IMAGE_BITMAP,10,20,LR_LOADFROMFILE);  
119.                
120.              //设定鼠标光标的x,y值,并设定飞机贴图坐标的“nowX”和“nowY”的值为(300,300)  
121.              x = 300;  
122.              y = 300;  
123.              nowX = 300;  
124.              nowY = 300;  
125.            
126.              //设定光标位置  
127.              pt.x = 300;  
128.              pt.y = 300;  
129.              ClientToScreen(hWnd,&pt);  
130.              SetCursorPos(pt.x,pt.y);  
131.                
132.              ShowCursor(false);      //隐藏鼠标光标  
133.            
134.              //限制鼠标光标移动区域  
135.              GetClientRect(hWnd,&rect);  //取得窗口内部矩形  
136.              //将矩形左上点坐标存入lt中  
137.              lt.x = rect.left;  
138.              lt.y = rect.top;  
139.              //将矩形右下坐标存入rb中  
140.              rb.x = rect.right;  
141.              rb.y = rect.bottom;  
142.              //将lt和rb的窗口坐标转换为屏幕坐标  
143.              ClientToScreen(hWnd,<);  
144.              ClientToScreen(hWnd,&rb);  
145.              //以屏幕坐标重新设定矩形区域  
146.              rect.left = lt.x;  
147.              rect.top = lt.y;  
148.              rect.right = rb.x;  
149.              rect.bottom = rb.y;  
150.              //限制鼠标光标移动区域  
151.              ClipCursor(&rect);  
152.            
153.              MyPaint(hdc);  
154.            
155.              return TRUE;  
156.          }  
157.            
158.          //****自定义绘图函数*********************************  
159.          // 1.设定飞机坐标并进行贴图  
160.          // 2.设定所有子弹坐标并进行贴图  
161.          // 3.显示真正的鼠标光标所在坐标  
162.          void MyPaint(HDC hdc)  
163.          {  
164.              char str[20] = "";  
165.              int i;  
166.            
167.              //贴上背景图  
168.              SelectObject(bufdc,bg);  
169.              BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);  
170.              BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);  
171.                
172.              //计算飞机的贴图坐标,设定每次进行飞机贴图时,其贴图坐标(nowX,nowY)会以10个单位慢慢向鼠标光标所在的目的点(x,y)接近,直到两个坐标相同为止  
173.              if(nowX < x)  
174.              {  
175.                  nowX += 10;  
176.                  if(nowX > x)  
177.                      nowX = x;  
178.              }  
179.              else  
180.              {  
181.                  nowX -=10;  
182.                  if(nowX < x)  
183.                      nowX = x;  
184.              }  
185.            
186.              if(nowY < y)  
187.              {  
188.                  nowY += 10;  
189.                  if(nowY > y)  
190.                      nowY = y;  
191.              }  
192.              else  
193.              {  
194.                  nowY -= 10;  
195.                  if(nowY < y)  
196.                      nowY = y;  
197.              }  
198.            
199.              //贴上飞机图  
200.              SelectObject(bufdc,ship);  
201.              BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);  
202.              BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);  
203.            
204.              //子弹的贴图,先判断子弹数目“bcount”的值是否为“0”。若不为0,则对子弹数组中各个还存在的子弹按照其所在的坐标(b[i].x,b[i].y)循环进行贴图操作  
205.              SelectObject(bufdc,bullet);  
206.              if(bcount!=0)  
207.                  for(i=0;i<30;i++)  
208.                      if(b[i].exist)  
209.                      {  
210.                          //贴上子弹图  
211.                          BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,10,SRCAND);  
212.                          BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,0,SRCPAINT);  
213.            
214.                          //设置下一个子弹的坐标。子弹是又右向左发射的,因此,每次其X轴上的坐标值递减10个单位,这样贴图会产生往左移动的效果。而如果子弹下次的坐标已超出窗口的可见范围(h[i].x<0),那么子弹设为不存在,并将子弹总数bcount变量值减1.  
215.                          b[i].x -= 10;  
216.                          if(b[i].x < 0)  
217.                          {  
218.                              bcount--;  
219.                              b[i].exist = false;  
220.                          }  
221.                      }  
222.            
223.              //显示鼠标坐标  
224.              sprintf(str,"鼠标X坐标为%d    ",x);  
225.              TextOut(mdc,0,0,str,strlen(str));  
226.              sprintf(str,"鼠标Y坐标为%d    ",y);  
227.              TextOut(mdc,0,20,str,strlen(str));  
228.            
229.              BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);  
230.            
231.              tPre = GetTickCount();  
232.            
233.              w += 10;  
234.              if(w==640)  
235.                  w = 0;  
236.          }  
237.            
238.          //****消息处理函数***********************************  
239.          // 1.处理WM_LBUTTONDOWN消息发射子弹  
240.          // 2.处理WM_MOUSEMOVE消息设定飞机贴图坐标  
241.          // 3.在窗口结束时恢复鼠标移动区域  
242.          LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
243.          {  
244.              int i;  
245.            
246.              switch (message)  
247.              {  
248.                  case WM_KEYDOWN:                //按键按下消息  
249.                      if(wParam==VK_ESCAPE)       //按下【Esc】键  
250.                          PostQuitMessage(0);  
251.                      break;  
252.                  case WM_LBUTTONDOWN:            //单击鼠标左键消息  
253.                      for(i=0;i<30;i++)  
254.                      {  
255.                          if(!b[i].exist)  
256.                          {  
257.                              b[i].x = nowX;      //子弹x坐标  
258.                              b[i].y = nowY + 30; //子弹y坐标  
259.                              b[i].exist = true;  
260.                              bcount++;           //累加子弹数目  
261.                              break;  
262.                          }  
263.                      }  
264.                  case WM_MOUSEMOVE:  
265.                      x = LOWORD(lParam);         //取得鼠标X坐标  
266.                      if(x > 530)                  //设置临界坐标  
267.                          x = 530;  
268.                      else if(x < 0)  
269.                          x = 0;  
270.            
271.                      y = HIWORD(lParam);         //取得鼠标y坐标  
272.                      if(y > 380)  
273.                          y = 380;  
274.                      else if(y < 0)  
275.                          y = 0;  
276.                            
277.                      break;  
278.                  case WM_DESTROY:                //窗口结束消息  
279.                      ClipCursor(NULL);           //恢复鼠标移动区域  
280.            
281.                      DeleteDC(mdc);  
282.                      DeleteDC(bufdc);  
283.                      DeleteObject(bg);  
284.                      DeleteObject(bullet);  
285.                      DeleteObject(ship);  
286.                      ReleaseDC(hWnd,hdc);  
287.            
288.                      PostQuitMessage(0);  
289.                      break;  
290.                  default:                        //其他消息  
291.                      return DefWindowProc(hWnd, message, wParam, lParam);  
292.             }  
293.             return 0;  
294.          }  


下面是这个例子的效果图:
 
<img border="0" width="637" height="476" src="file:///C:/DOCUME~1/HUALAO~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" <="" span=""> style='orphans: auto;widows: auto;-webkit-text-stroke-width: 0px;word-spacing: 0px' >
 
我们移动鼠标,小飞机会跟着鼠标的移动而移动;点击鼠标,小飞机就会发射出绿色的子弹来;按下Esc键,这个小游戏就退出了。
 
 
当然,这个小游戏还有些的不足,比如小飞机对鼠标的跟随有小小的延迟,也没有进行WndProc函数中case分支的拆分(在这里感谢yao050421103的提醒)。
关于这个小游戏的改进,是以后我们需要去做的。比如后面我们会找机会用DirectX中的DirectInput函数(也是处理输出消息的函数)来写一下这个小游戏的升级版,无论是画面上还是实现效果上都将进行升级。
 
 
在之前的笔记里有朋友(感谢pxg789的提醒)提到,用MFC和ATL共享的新类CImage进行贴图会更加简单和先进,在这里说明一下,在后面的笔记里面会专门花一节来讲CImage类,目前和之前的笔记还是采用传统的GDI进行贴图操作。
 
 
笔记十三到这里就结束了。
本节笔记的源代码请点击这里下载:   【Visual C++】Code_Note_13
 
感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们,也请大家继续关注我的专栏,我一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
 
精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。
 
 
大家看过后觉得值得一看的话,可以顶一下这篇文章,让更多的朋友有机会看到它。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~
 
//www.myexception.cn/web/730729.html
以左上角为定点,放大缩小,该点位置不变。
 
方法一:
 
   <script type="text/javascript">
        //兼容IE和火狐   缩小放大、缩放
        function ImageSuofang(args) {
            var oImg = document.getElementById("oImg");
            if (args) {
                oImg.width = oImg.width * 1.1;
                oImg.height = oImg.height * 1.1;
            }
            else {
                oImg.width = oImg.width / 1.1;
                oImg.height = oImg.height / 1.1;
            }
        }
     </script>
 
    <form id="form1">
       
     <div data-orient="center" style="width:320px; height:480px;margin: 5px 300px 0px 400px;border: 1px solid #000;">
<img id="oImg" src="/img/c.jpg" alt="pic"/>
</div>
 
             <input id="btn1" type="button" value="放大" onclick="ImageSuofang(true)" />
        <input id="btn2" type="button" value="缩小" onclick="ImageSuofang(false)" />
         <!--            <input type="button" value="<-Rotate逆时针" name="RotateL" id="RotateL" onclick="rotateRight('oImg',90);">  -->
         
            
 </form>
 
 方法二:
 
CSS编码如下:
 
 #biankuang{height:480px;width:320px;margin: 30px auto;}//加一个border可以看到定点为左上角。
 
下面是实现图片缩小放大功能的JS代码:
 
var zoomLevel = 0;
var currentWidth = 0;
var currentHeight = 0;
var originalWidth = 0;
var originalHeight = 0;
function initial(){
    currentWidth = document.myImage.width;
    currentHeight = document.myImage.height;
    originalWidth = currentWidth;
    originalHeight = currentHeight;
    update();
}
function zoomIn(){
    document.myImage.width = currentWidth*1.2;
    document.myImage.height = currentHeight*1.2;
    zoomLevel = zoomLevel + 1;
    update();
}
function zoomOut(){
    document.myImage.width = currentWidth/1.2;
    document.myImage.height = currentHeight/1.2;
    zoomLevel = zoomLevel - 1;
    update();
}
function resetImage(){
    document.myImage.width = originalWidth;
    document.myImage.height = originalHeight;
    zoomLevel = 0;
    update();
}
function update(){
    currentWidth = document.myImage.width;
    currentHeight = document.myImage.height;
    zoomsize.innerText = zoomLevel;
    imgsize.innerText = currentWidth + "X" + currentHeight;
}
 html的body中的代码如下:
 
<body onload="initial()">
 
<div id="biankuang" data-orient="center">
<img name="myImage" src="/img/c.jpg" alt="pic"/>     //引入本地图片
</div>
 
<p>
<input type="button" value="放大图片" onclick="zoomIn()">
<input type="button" value="缩小图片" onclick="zoomOut()">
<input type="button" value="重置图片" onclick="resetImage()">
<span id="zoomsize"></span> <span id="imgsize"></span></p>
</body>
 
//www.myexception.cn/web/633488.html
图片放大缩小效果,支持鼠标滑轮
图片放大缩小效果
效果在附件里,麻烦下载来看吧
<html>
<head>
    <title>Simple jsp page</title>
    <link type="text/css" href="js/css/ui-lightness/jquery-ui-1.8.16.custom.css" rel="stylesheet" />
    <script type="text/javascript"  src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script type="text/javascript"  src="js/jquery.mousewheel.min.js"></script>
    <script type="text/javascript"  src="js/jquery-ui-1.8.16.custom.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            var img=$("img");
            img.draggable()
            var slider = $( "<div id='slider'></div>" ).insertBefore( "#big" ).slider({
                min: img.height(),
                max: 800,
                range: "min",
                value: 1,
                slide: function( event, ui ) {
                    // alert(ui.value)
                    resizeImg("img",ui.value)
                    //select[ 0 ].selectedIndex = ui.value - 1;
                },
                change:function(event, ui){
                    resizeImg("img",ui.value)
                }
            });
            $('#big').bind('mousewheel', function(event, delta){
                var i=img.height();
 
                if(delta>0){
                 //alert(i)
                    i=i+10;
                    slider.slider( "value", i );
 
                }else{
                    i=i-10;
                    slider.slider( "value", i );
                }
 
            });
            function resizeImg(node,value){
                $(node).height(value);
 
            }
        })
    </script>
</head>
<body>
<div id="big" style="height:500px;overflow: hidden;width: 500px">
    <img src="tupian.jpg" style="cursor: move"/>
</div>
</body>
</html>
 
//www.myexception.cn/vc-mfc/1402799.html
关于图片放大缩小以及放大后有个滚动条
用mfc在对话框模式下,然后打开任意选择的文件之后(tiff格式) ,
在图片控件中显示,然后对其进行放大或者缩小操作,放大后scrollbar自动出现,
求放大缩小并配合scrollbar的功能地方如何编程,有sample最好学习下。。谢谢
分享到:

------解决方案--------------------
用个窗口,选择滚动属性
简单图像缩放用dc里的bitblt
 
//www.it165.net/pro/html/201207/3295.html
  1.鼠标中键按下滚动缩放的实现添加一个OnMouseWheel消息句柄:
view source
print?
01.BOOL CRenderView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
02.{
03.// TODO: Add your message handler code here and/or call default
04.if(nFlags&MK_MBUTTON) 
05.{ 
06.if(zDelta>0) 
07.{
08.m_xScaling+=0.1f;
09.m_yScaling+=0.1f;
10.m_zScaling+=0.1f;
11. 
12.}
13.else 
14.{ 
15.m_xScaling-=0.1f;
16.m_yScaling-=0.1f;
17.m_zScaling-=0.1f;
18.}
19.InvalidateRect(NULL,FALSE);
20.} 
21.return CView::OnMouseWheel(nFlags, zDelta, pt);
22.}
23. 
24.然后在OnPaint()里面加上glScalef(m_xScaling,m_yScaling,m_zScaling);
25.void CRenderView::OnPaint() 
26.{
27.CPaintDC dc(this); // device context for painting
28.wglMakeCurrent(m_hDC,m_hRC);
29.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
30. 
31.glPushMatrix();
32.//平移、旋转、缩放变换
33.//glTranslated(m_xTranslation,m_yTranslation,0.0f);平移
34.//glRotatef(m_xRotation,1.0f,0.0f,0.0f); 旋转
35.//glRotatef(m_yRotation,0.0f,1.0f,0.0f);
36.glScalef(m_xScaling,m_yScaling,m_zScaling); 缩放
37.RenderScene(); //绘图
38. 
39.glPopMatrix();
40. 
41.SwapBuffers(m_hDC); //将后台视频缓存拷贝到前台
42. 
43.wglMakeCurrent(m_hDC,NULL);
44.}

2.鼠标右键按下平移的实现:
添加OnRButtonDown消息响应
view source
print?
1.void CRenderView::OnRButtonDown(UINT nFlags, CPoint point) 
2.{
3.// TODO: Add your message handler code here and/or call default
4.m_RightButtonDown=TRUE;
5.Pos1=point;
6.CView::OnRButtonDown(nFlags, point);
7.}

添加OnRButtonUp消息响应
view source
print?
1.void CRenderView::OnRButtonUp(UINT nFlags, CPoint point) 
2.{
3.// TODO: Add your message handler code here and/or call default
4.m_RightButtonDown=FALSE;
5.CView::OnRButtonUp(nFlags, point);
6.}

添加OnMouseMove消息响应:
view source
print?
01.void CRenderView::OnMouseMove(UINT nFlags, CPoint point) 
02.{
03.// TODO: Add your message handler code here and/or call default
04.if(m_RightButtonDown)
05.{
06.m_xTranslation=(float)(point.x - Pos1.x)*2.0f;
07.m_yTranslation=-(float)(point.y - Pos1.y)*2.0f;
08.InvalidateRect(NULL,FALSE);
09.}
10.CView::OnMouseMove(nFlags, point);
11.}

然后在Onpaint()里面添加:glTranslated(m_xTranslation,m_yTranslation,0.0f);即可    

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程