VC++鼠標操做資料整理

鼠標滾輪:javascript

鼠標垂直滾輪消息是WM_MOUSEWHEEL,其中wParam>0向上滾動,<0向下滾動,滾動的同時按下Ctrl,爲放大縮小。
鼠標水平滾輪消息是WM_MOUSEHWHEELcss

鼠標參數判斷:html

http://blog.csdn.net/poem_qianmo/article/details/7405479java

一,鼠標消息的處理方式node

 

你們都知道,目前市場上主流鼠標規格爲兩個按鍵加上一個滾輪。那麼,咱們先列出Windows中這種鼠標設備輸入時的消息:jquery

 

WM_LBUTTONDBLCLK      雙擊鼠標左鍵消息web

WM_LBUTTONDOWN       單擊鼠標左鍵消息ajax

WM_LBUTTONUP           鬆開鼠標左鍵消息編程

WM_MBUTTONDBLCLK     雙擊鼠標中鍵(滾輪)消息canvas

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.   ifwParam & MK_LBUTTON      //這裏應該是按位與&,以前我寫錯了,謝謝 a443475601 的指出,  

2.   {  

3.   //鼠標左鍵被按下  

4.   }  

 

 

這是利用wParam參數與測試標誌來測試鼠標鍵是否被按下的方法。當按鍵被按下時,條件式「wParam && MK_LBUTTON」所傳回的結果會爲「true」。固然,若消息函數接收到「WM_LBUTTONDOWN」消息,一樣也能夠知道鼠標鍵被按下而沒必要再去額外作這樣的測試。

【例子2若是要測試鼠標左鍵與【Shift】鍵的按下狀態,那麼程序代碼以下:

 

[cpp] view plaincopyprint?

1.   IfwParam & MK_LBUTTON  

2.   {  

3.   IfwParam & MK_SHIFT  

4.   {  

5.   //單擊鼠標左鍵  

6.   //按下【Shift】鍵  

7.   }  

8.   else  

9.   {  

10.  //單擊鼠標左鍵  

11.  //未按下【Shift】鍵  

12.  }  

13.  }  

14.  else  

15.  {  

16.  IfwParam & 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 ReleaseCaptureVOID;    //釋放獲取窗口外的鼠標消息

 

2.設定鼠標光標位置的函數

BOOL SetCursorPosint X座標,int Y座標);     //設定鼠標光標位置

上面這個SetCursorPos()函數中所設定的座標是相對於屏幕左上角的屏幕座標而言。實際上,咱們常常須要將這個屏幕座標轉換爲遊戲窗口中的遊戲窗口座標。所以須要用到API中的一個將窗口座標轉換到屏幕座標的函數,即ClientToScreen()。

屏幕座標和窗口座標轉換的函數

BOOL ClientToScreenHWND hWnd     //屏幕座標轉換爲窗口座標

LPPOINT lpPoint屏幕點座標);

   同理,咱們獲得:

窗口座標轉換爲屏幕座標的函數:

BOOL ScreenToClient(   LPPOINT lpPoint窗口點座標 )   //窗口座標轉換爲屏幕座標

 

3.顯示與隱藏鼠標光標的函數

Int ShowCursorBOOL trueflase);    //隱藏及顯示鼠標光標

其中,true表明顯示光標,false表明隱藏光標。

 

4.限制鼠標光標移動區域的函數

Windows API中提供的ClipCursor()函數能夠用來設置限制鼠標光標的移動區域和解除鼠標光標移動區域的限制。

BOOL ClipCursorCONST RECT 移動區域矩形);  //限制鼠標光標移動區域

BOOL ClipCursorNOOL);                     //解除限制

這裏有一個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 GetWindowRectHWND hWND,LPRECT 矩形結構);//取得窗口外部區域矩形

BOOL GetClientRectHWND hWndLPRECT 矩形結構體); //取得窗口內部區域矩形

這裏須要注意的是,GetWindowRect()返回的座標類型是屏幕座標。

                          GetClientRect()返回的座標類型是窗口座標。

因爲限制鼠標光標移動區域的ClipCursor()函數中輸入的矩形區域必須是屏幕座標,所以若是取得的是窗口內部區域,那麼還必須將窗口座標轉換爲屏幕座標的操做,下面咱們以一段程序代碼來講明將鼠標光標限制在窗口內部區域移動的過程:

[cpp] view plaincopyprint?

1.   RECT rect  

2.   POINT ltrb  

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.  //ltrb的窗口座標轉換爲屏幕座標  

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;    //xy表明鼠標光標所在位置,nowXnowY表明飛機座標,也是貼圖的位置  

18.  int     w=0,bcount;       //w爲滾動背景所要裁剪的區域寬度,bcount記錄飛機現有子彈數目  

19.  BULLET  b[30];           //聲明一個「bullet」類型的數組,用來存儲飛機發出的子彈  

20.    

21.  //全局函數聲明  

22.  ATOM                MyRegisterClass(HINSTANCE hInstance);  

23.  BOOL                InitInstance(HINSTANCEint);  

24.  LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);  

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.              //設定鼠標光標的xy值,並設定飛機貼圖座標的「nowX」「nowY」的值爲(300300  

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.              //ltrb的窗口座標轉換爲屏幕座標  

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.              //計算飛機的貼圖座標,設定每次進行飛機貼圖時,其貼圖座標(nowXnowY)會以10個單位慢慢向鼠標光標所在的目的點(xy)接近,直到兩個座標相同爲止  

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的提醒)提到,用MFCATL共享的新類CImage進行貼圖會更加簡單和先進,在這裏說明一下,在後面的筆記裏面會專門花一節來說CImage類,目前和以前的筆記仍是採用傳統的GDI進行貼圖操做。

 

 

筆記十三到這裏就結束了。

本節筆記的源代碼請點擊這裏下載:   Visual C++Code_Note_13

 

感謝一直支持【Visual C++】遊戲開發筆記系列專欄的朋友們,也請你們繼續關注個人專欄,我一有時間就會把本身的學習心得,以爲比較好的知識點寫出來和你們一塊兒分享。

 

精通遊戲開發的路還很長很長,很是但願能和你們一塊兒交流,共同窗習,共同進步。

 

 

你們看事後以爲值得一看的話,能夠頂一下這篇文章,讓更多的朋友有機會看到它。

若是文章中有什麼疏漏的地方,也請你們指正。也但願你們能夠多留言來和我探討編程相關的問題。

最後,謝謝大家一直的支持~~~

 

http://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;
}

 htmlbody中的代碼以下:

 

<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>
 

http://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="http://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>

 

http://www.myexception.cn/vc-mfc/1402799.html

關於圖片放大縮小以及放大後有個滾動條
mfc在對話框模式下,而後打開任意選擇的文件以後(tiff格式) 
在圖片控件中顯示,而後對其進行放大或者縮小操做,放大後scrollbar自動出現,
求放大縮小並配合scrollbar的功能地方如何編程,有sample最好學習下。。謝謝

分享到:


------解決方案--------------------
用個窗口,選擇滾動屬性
簡單圖像縮放用dc裏的bitblt

 

http://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);便可

相關文章
相關標籤/搜索