• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

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

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 28次 | 進入軟件測試論壇討論

    領測軟件測試網 石油大學(北京) 顧岱鴻

    ---- 做為一個不斷進取的編程者,我們常常不滿足于編程語言所提供的一般功能,總是希望能夠實現一些特殊的功能,這有時不但是我們程序的要求,有時也是編程者心理上需要(試想,還會有什么比在深夜中巧妙解決一個難題而更令人興奮呢?)。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的聲明部分:

    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type
    Private Type POINTAPI
    x As Long
    y As Long
    End Type

    Private Declare Function ClientToScreen Lib
    "user32" Alias "ClientToScreen" (ByVal
    hwnd As Long, lpPoint As POINTAPI) As Long
    注釋:用來確定當前鼠標的位置

    Private Declare Function ClipCursor Lib
    "user32" Alias "ClipCursor" (lpRect As Any)
    As Long 注釋:用來限定當前鼠標的活動范圍

    ---- 3.定義一個通用過程ConfineTo
    Public Sub ConfineTo (myCtl As Object)
    On Error Resume Next
    Dim tmpRect As RECT
    Dim pt As POINTAPI

    With myCtl
    If TypeOf myCtl Is Screen Then 注釋:鎖定在屏幕范圍內
    tmpRect.Left = 0
    tmpRect.Top = 0
    tmpRect.Right = (.Width Screen.TwipsPerPixelX)
    tmpRect.Bottom = (.Height Screen.TwipsPerPixelY)
    Elseif TypeOf myCtl Is form 注釋:鎖定在窗體范圍內
    tmpRect.Left = (.Left Screen.TwipsPerPixelX)
    tmpRect.Top = (.Top Screen.TwipsPerPixelY)
    tmpRect.Right = (.Left + .Width) Screen.TwipsPerPixelX
    tmpRect.Bottom = (.Top + .Height) Screen.TwipsPerPixelY
    else
    pt.X = 0
    pt.Y = 0
    Call ClientToScreen(.hWnd, pt)
    注釋:獲取當前控件在屏幕上的位置
    tmpRect.Left = pt.X
    注釋:保存當前控件位置
    tmpRect.Top = pt.Y
    pt.X = .Width
    pt.Y = .Height
    Call ClientToScreen(.hWnd, pt)
    tmpRect.Bottom = pt.Y
    tmpRect.Right = pt.X
    End If
    Call ClipCursor(tmpRect)
    End With
    End Sub

    ---- 4.在 CMButton1_Click()中加入以下代碼
    Static Cliped As Boolean
    注釋:靜態變量用來控制狀態切換
    If Not Cliped Then
    ConfineTo Cmbutton1
    Cliped = True
    Else
    ConfineTo Screen 注釋:取消鼠標限制
    Cliped = True
    End If

    ---- 5. 運行后,鼠標點擊cmbutton1,此時鼠標只能被鎖定在此按鈕內部,再次點擊按鈕,限制取消。
    二.創建臨時文件
    ---- 臨時文件用來保存軟件運行過程中的臨時變化,這對于熟悉WORD等軟件的人來說,經常會遇到。那么臨時文件是如何產生的呢,其實很簡單,只需要一個API函數就可以。
    ---- 1.拷貝聲明函數(方法同前)

    Private Declare Function GetTempFileName Lib "kernel32" _
    Alias "GetTempFileNameA" (ByVal lpszPath As String, _
    ByVal lpPrefixString As String, ByVal wUnique As Long, _
    ByVal lpTempFileName As String) As Long
    參數定義如下:
    lpszPath =傳入保存臨時文件的路徑 ,如"C:mytemp"
    lpPrefixString=傳入臨時文件名開始的前三個字母,
    起到幫助識別臨時文件來源的作用。
    wUnique =0 ,windows隨機產生文件名;否則安其值定義文件名。
    lpTempFileName=返回隨機文件名

    ---- 2.返回臨時文件名
    Private Function GenTempName(sPath As String)
    Dim sPrefix As String
    Dim lUnique As Long
    Dim sTempFileName As String

    If IsEmpty(sPath) Then sPath = "c: emp"
    sPrefix = "TVB"
    lUnique = 0 注釋:windows隨機給名

    sTempFileName = Space$(100)
    GetTempFileName sPath, sPrefix, lUnique, sTempFileName
    sTempFileName = Mid$(sTempFileName, 1,
    InStr(sTempFileName, Chr$(0)) - 1) 注釋:去掉多余空格
    GenTempName = sTempFileName
    End Function

    ---- 3.將下面代碼加入到form1_click()事件中
    MsgBox GenTempName("c: emp")

    ---- 4.運行,鼠標點擊form,彈出msgbox,顯示生成"c: empTVB724.tmp"文件,用文件管理器查看,在c: emp下有TVB724.tmp 文件,長度為0K。
    ---- 需要注意的是,傳入的路徑必須是有效路徑,否則GenTempName函數返回0,lpTempFileName中也沒有臨時文件名。

    三.結束語
    ---- 從上面可以看出,API函數的確簡單高效,但也充滿一些看似高深的變量而使人卻步。我們不禁會問,究竟什么時候要用到API函數?具體哪些函數可以解決我的問題?,那些函數中的變量都代表什么?其實對這些問題,即使對一個VB高手也難給出明確的回答,因為API函數庫實在太龐大了,每一個人最終只能熟悉其中的一小部分(這也可能是調用API的文章層出不窮的原因吧)?偨Y自己的一點經驗,我覺得應該注意以下幾點。
    ---- 1.熟練掌握VB基本技巧,了解其所能所不能,這是最基本的要求。

    ---- 2.了解WINDOWS內部控制機理,這樣對一些復雜的問題就可以逐步分析其調用機制,初步確定采用哪部分的API函數來解決問題。

    ---- 3.案頭必備一本最新的VB版的WINDOWS API 大全,推薦機械工業出版社的<>。書中給出了每一個VB可以調用的API函數的詳細說明,可以幫助精確了解所需要的API函數的變量聲明。

    ---- 4.多看別人的程序。報紙雜志,尤其是網上這方面的文章數不清。這是最快的方法。

    ---- 5.隨用隨查。永遠不要在用不到的函數上浪費寶貴的時間

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>