程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 如何提高調用WindowAPI函數編程技巧

如何提高調用WindowAPI函數編程技巧

編輯:VB綜合教程
做為一個不斷進取的編程者,我們常常不滿足於編程語言所提供的一般功能,總是希望能夠實現一些特殊的功能,這有時不但是我們程序的要求,有時也是編程者心理上需要(試想,還會有什麼比在深夜中巧妙解決一個難題而更令人興奮呢?)。VisualBasic,做為一個當前最流行的快速編程環境,就給我們提供了實現這些目標的平台,事實上,它無限擴展的API接口可以實現所有WINDOWS下可以實現的功能。然而對於初學者來說,"浩瀚"的API函數總是顯得那麼神奇與不可琢磨,因此在實際應用過程中不能夠靈活應用。下面我將結合兩個小例子來示范介紹VB中調用API函數的步驟和功能,並總結說明在實際工作中如何提高這方面的技巧。例子在WINDOWS98下采用VB6.0編譯。
  一.限制鼠標的移動
  ----有時我們的軟件要求用戶在未完成某一任務時,鼠標不能移出當前活動控件,換句話就是將鼠標限制在控件的內部,直到任務完成或用戶中斷為止。這個功能借助API函數實現起來思路很清楚,代碼也很簡潔。其思路是先確定當前鼠標的位置;然後確定當前活動控件的大小;最後將鼠標限制在活動控件內。(下面忽略項目建立等過程)
  ----1.建立一個新項目:新窗體為form1,在form1上添加一個commandbutton,設置其Name=CMButton1;Caption="將鼠標限制在此按鈕中"
  
  ----2.拷貝API函數和POINTAPI結構:打開VB6.0自帶的API浏覽器,調入WIN32API.txt文件,復制以下結構和函數聲明到form1的聲明部分:
  
  PrivateTypeRECT
  LeftAsLong
  TopAsLong
  RightAsLong
  BottomAsLong
  EndType
  PrivateTypePOINTAPI
  xAsLong
  yAsLong
  EndType
  
  PrivateDeclareFunctionClientToScreenLib
  "user32"Alias"ClientToScreen"(ByVal
  hwndAsLong,lpPointAsPOINTAPI)AsLong
  '用來確定當前鼠標的位置
  
  PrivateDeclareFunctionClipCursorLib
  "user32"Alias"ClipCursor"(lpRectAsAny)
  AsLong'用來限定當前鼠標的活動范圍
  
  ----3.定義一個通用過程ConfineTo
  PublicSubConfineTo(myCtlAsObject)
  OnErrorResumeNext
  DimtmpRectAsRECT
  DimptAsPOINTAPI
  
  WithmyCtl
  IfTypeOfmyCtlIsScreenThen'鎖定在屏幕范圍內
  tmpRect.Left=0
  tmpRect.Top=0
  tmpRect.Right=(.WidthScreen.TwipsPerPixelX)
  tmpRect.Bottom=(.HeightScreen.TwipsPerPixelY)
  ElseifTypeOfmyCtlIsform'鎖定在窗體范圍內
  tmpRect.Left=(.LeftScreen.TwipsPerPixelX)
  tmpRect.Top=(.TopScreen.TwipsPerPixelY)
  tmpRect.Right=(.Left .Width)Screen.TwipsPerPixelX
  tmpRect.Bottom=(.Top .Height)Screen.TwipsPerPixelY
  else
  pt.X=0
  pt.Y=0
  CallClientToScreen(.hWnd,pt)
  '獲取當前控件在屏幕上的位置
  tmpRect.Left=pt.X
  '保存當前控件位置
  tmpRect.Top=pt.Y
  pt.X=.Width
  pt.Y=.Height
  CallClientToScreen(.hWnd,pt)
  tmpRect.Bottom=pt.Y
  tmpRect.Right=pt.X
  EndIf
  CallClipCursor(tmpRect)
  EndWith
  EndSub
  
  ----4.在CMButton1_Click()中加入以下代碼
  StaticClipedAsBoolean
  '靜態變量用來控制狀態切換
  IfNotClipedThen
  ConfineToCmbutton1
  Cliped=True
  Else
  ConfineToScreen'取消鼠標限制
  Cliped=True
  EndIf
  
  ----5.運行後,鼠標點擊cmbutton1,此時鼠標只能被鎖定在此按鈕內部,再次點擊按鈕,限制取消。
  二.創建臨時文件
  ----臨時文件用來保存軟件運行過程中的臨時變化,這對於熟悉WORD等軟件的人來說,經常會遇到。那麼臨時文件是如何產生的呢,其實很簡單,只需要一個API函數就可以。
  ----1.拷貝聲明函數(方法同前)
  
  PrivateDeclareFunctionGetTempFileNameLib"kernel32"_
  Alias"GetTempFileNameA"(ByVallpszPathAsString,_
  ByVallpPrefixStringAsString,ByValwUniqueAsLong,_
  ByVallpTempFileNameAsString)AsLong
  參數定義如下:
  lpszPath=傳入保存臨時文件的路徑,如"C:mytemp"
  lpPrefixString=傳入臨時文件名開始的前三個字母,
  起到幫助識別臨時文件來源的作用。
  wUnique=0,windows隨機產生文件名;否則安其值定義文件名。
  lpTempFileName=返回隨機文件名
  
  ----2.返回臨時文件名
  PrivateFunctionGenTempName(sPathAsString)
  DimsPrefixAsString
  DimlUniqueAsLong
  DimsTempFileNameAsString
  
  IfIsEmpty(sPath)ThensPath="c: emp"
  sPrefix="TVB"
  lUnique=0'windows隨機給名
  
  sTempFileName=Space$(100)
  GetTempFileNamesPath,sPrefix,lUnique,sTempFileName
  sTempFileName=Mid$(sTempFileName,1,
  InStr(sTempFileName,Chr$(0))-1)'去掉多余空格
  GenTempName=sTempFileName
  EndFunction
  
  ----3.將下面代碼加入到form1_click()事件中
  MsgBoxGenTempName("c: emp")
  
  ----4.運行,鼠標點擊form,彈出msgbox,顯示生成"c: empTVB724.tmp"文件,用文件管理器查看,在c: emp下有TVB724.tmp文件,長度為0K。
  ----需要注意的是,傳入的路徑必須是有效路徑,否則GenTempName函數返回0,lpTempFileName中也沒有臨時文件名。
  
  三.結束語
  ----從上面可以看出,API函數的確簡單高效,但也充滿一些看似高深的變量而使人卻步。我們不禁會問,究竟什麼時候要用到API函數?具體哪些函數可以解決我的問題?,那些函數中的變量都代表什麼?其實對這些問題,即使對一個VB高手也難給出明確的回答,因為API函數庫實在太龐大了,每一個人最終只能熟悉其中的一小部分(這也可能是調用API的文章層出不窮的原因吧)。總結自己的一點經驗,我覺得應該注意以下幾點。
  ----1.熟練掌握VB基本技巧,了解其所能所不能,這是最基本的要求。
  
  ----2.了解WINDOWS內部控制機理,這樣對一些復雜的問題就可以逐步分析其調用機制,初步確定采用哪部分的API函數來解決問題。
  
  ----3.案頭必備一本最新的VB版的WINDOWSAPI大全,推薦機械工業出版社的<>。書中給出了每一個VB可以調用的API函數的詳細說明,可以幫助精確了解所需要的API函數的變量聲明。
  
  ----4.多看別人的程序。報紙雜志,尤其是網上這方面的文章數不清。這是最快的方法。
  
  ----5.隨用隨查。永遠不要在用不到的函數上浪費寶貴的時間->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved