• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 126,  comments - 73,  trackbacks - 0

            API技巧集(一)


            一、拖動(dòng)無標(biāo)題窗體:

            包含頭文件:

            #include $#@60;winuser.h$#@62;

            在窗體或組件的 OnMouseDown 事件中加入以下代碼:

            if(Button == mbLeft)
            {
            ReleaseCapture();
            SendMessage( Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
            }

            二、彈出和關(guān)閉光驅(qū):

            包含頭文件:

            #include $#@60;mmsystem.h$#@62;

            在窗體的OnCreate事件中加入:

            mciSendString("open cdaudio alias cd wait shareable",0,0,0);

            1、要彈出光驅(qū)時(shí)使用:

            mciSendString("set cd door open",0,0,0);

            2、要關(guān)閉光驅(qū)時(shí)使用:

            mciSendString("set cd door closed",0,0,0);

            三、提取圖標(biāo):

            包含頭文件:

            #include $#@60;shellapi.h$#@62;

            例子:

            TIcon *Icon = new TIcon();
            AnsiString FileName = "C:\\WINDOWS\\SYSTEM\\SHELL32.DLL";
            int TotalIcon;

            //得到文件SHELL32.DLL的總圖標(biāo)數(shù)
            TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);

            //提取第一個(gè)圖標(biāo),0為第一個(gè),1為第二個(gè),類推...
            Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);

            //保存圖標(biāo)
            Icon->SaveToFile("C:\\1.ICO");

            四、設(shè)置頂端窗口(永在上面):

            包含頭文件:

            #include $#@60;winuser.h$#@62;

            1、設(shè)置頂層窗口

            SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);

            2、取消頂層窗口

            SetWindowPos( Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);

            API技巧集 (二)

            12/3/2000 0:0:0··符東亮··yesky

              (一)不規(guī)則窗口

              Windows提供的只是標(biāo)準(zhǔn)的矩形窗口,要想建立一個(gè)不規(guī)則的窗口就需要調(diào)用API函數(shù)來實(shí)現(xiàn)。建立一個(gè)不規(guī)則的窗口,一般是先用創(chuàng)建區(qū)域的API函數(shù)建立一個(gè)不規(guī)則的區(qū)域,再用API函數(shù)SetWindowRgn改變窗口的區(qū)域。這些API函數(shù)在C++ Builder中包含在頭文件wingdi.h和winuser.h里面,因此,要使用這些API函數(shù)就要先在程序頭部加上包含頭文件的語句:

            include $#@60;wingdi.h$#@62;

            include $#@60;winuser.h$#@62;

              SetWindowRgn函數(shù)能改變一個(gè)窗口的區(qū)域,該函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)hWnd是欲設(shè)置區(qū)域的窗口句柄,第二個(gè)參數(shù)hRgn是欲設(shè)置的區(qū)域,第三個(gè)參數(shù)bRedraw一般設(shè)為true,即立即重畫窗口。

              用來創(chuàng)建區(qū)域的API函數(shù)有多個(gè),最常用的有三個(gè):

              1、CreateRectRgn函數(shù),用來創(chuàng)建一個(gè)由X1、Y1和X2、Y2坐標(biāo)點(diǎn)確定的矩形區(qū)域。當(dāng)坐標(biāo)點(diǎn)X1和Y1相等、X2和Y2也相等的時(shí)候,創(chuàng)建的是一個(gè)正方形。

              例子:

            //創(chuàng)建長方形

            HRGN hRect=CreateRectRgn(0,0,400,200);

            SetWindowRgn(Handle,hRect,true);

            //創(chuàng)建正方形

            HRGN hRect=CreateRectRgn(0,0,300,300);

            SetWindowRgn(Handle,hRect,true);

              2、CreateEllipticRgn函數(shù),用來創(chuàng)建一個(gè)由X1、Y1和X2、Y2坐標(biāo)點(diǎn)確定的矩形所內(nèi)切的橢圓。同樣,X1、Y1和X2、Y2坐標(biāo)點(diǎn)所確定的矩形為正方形時(shí),創(chuàng)建的就是一個(gè)圓形。

              例子:

            //創(chuàng)建橢圓

            HRGN hElliptic=CreateEllipticRgn(0,0,400,250);

            SetWindowRgn(Handle,hElliptic,true);

            //創(chuàng)建圓形

            HRGN hElliptic=CreateEllipticRgn(0,0,400,400);

            SetWindowRgn(Handle,hElliptic,true);

              3、CombineRgn函數(shù),能將兩個(gè)區(qū)域組合為一個(gè)新區(qū)域,它有四個(gè)參數(shù),第一個(gè)參數(shù)hrgnDest保存合并后的新區(qū)域,第二個(gè)參數(shù)hrgnSrc1、三個(gè)參數(shù)hrgnSrc2為欲合并的兩個(gè)區(qū)域,第四個(gè)參數(shù)fnCombineMode是區(qū)域組合的方式,它的值是為下面組合方式之一:

              組合方式 說明

            RGN_AND 建立兩個(gè)區(qū)域的交集

            RGN_COPY 建立hrgnSrc1的拷貝

            RGN_DIFF 建立兩個(gè)區(qū)域不相交的部分

            RGN 建立兩個(gè)區(qū)域的并集

            RGN_XOR 建立除兩個(gè)區(qū)域并集之外的部分

              例子:

            //創(chuàng)建一個(gè)圓形和長方形交集的組合形狀

            HRGN hRect=CreateRectRgn(0,0,300,300);

            HRGN hElliptic=CreateEllipticRgn(0,0,400,250);

            CombineRgn(hRect,hRect,hElliptic,RGN_OR);

            SetWindowRgn(Handle,hRect,true);

              當(dāng)需要將窗口還原為標(biāo)準(zhǔn)Windows矩形窗口時(shí),只要將SetWindowRgn函數(shù)的hRgn參數(shù)設(shè)為0就行了,如:

            SetWindowRgn(Handle,0,true);


            API技巧集 (二)



              (二)得到系統(tǒng)聲卡的個(gè)數(shù)

              當(dāng)我們編寫一個(gè)多媒體程序(如播放器)的時(shí)候,有時(shí)需要檢測一下計(jì)算機(jī)中是否安裝了聲卡,如果沒有裝聲卡程序則會(huì)終止運(yùn)行。

              在這里,我們就要使用API函數(shù)waveOutGetNumDevs,調(diào)用這個(gè)函數(shù)可返回系統(tǒng)中安裝了的聲卡的個(gè)數(shù)。在C++ Builder 5.0中,它被包含在頭文件“mmsystem.h”里面。

              例子:

              1、首先在程序頭部加入包含頭文件的代碼:

            #include $#@60;mmsystem.h$#@62;

              2、在窗體的OnCreate事件中加入下面的代碼:

            int Num;

            //得到聲卡的個(gè)數(shù)

            Num=waveOutGetNumDevs();

            if(Num)

            ShowMessage("你有安裝了"+IntToStr(Num)+"塊聲卡");

            else

            {

            ShowMessage("你沒有安裝聲卡!\n程序終止運(yùn)行!");

            Close();

            }

              3、編譯運(yùn)行程序。

            API技巧集 (二)


              (三)獲得、設(shè)置鼠標(biāo)雙擊的間隔時(shí)間

              在指定間隔的時(shí)間內(nèi),連續(xù)兩次鼠標(biāo)單擊操作稱為雙擊,雙擊間隔的時(shí)間可以在控制面板中的鼠標(biāo)屬性里面改變。若要在自編的應(yīng)用程序中能獲得或設(shè)置鼠標(biāo)雙擊的間隔時(shí)間,我們只需使用Windows的兩個(gè)API函數(shù)GetDoubleClickTime和SetDoubleClickTime。調(diào)用GetDoubleClickTime可以返回鼠標(biāo)雙擊的間隔時(shí)間,而使用SetDoubleClickTime則可以設(shè)置鼠標(biāo)雙擊間隔的時(shí)間。

              下面讓我們來做一個(gè)獲得和設(shè)置鼠標(biāo)雙擊間隔時(shí)間的簡單的程序:

              首先,在Borland C++ Builder 5.0 中新建一個(gè)工程,往窗體Form1中添加兩個(gè)Button組件,把它們的Caption屬性分別改為“獲取雙擊間隔時(shí)間”和“設(shè)置雙擊間隔時(shí)間”,再添加一個(gè)Edit組件,將Edit1的Text屬性改為“200”,添加一個(gè)Label組件,把Caption屬性改為“毫秒”。

              然后,雙擊按鈕Button1,在它的OnClick(單擊)事件中加入下面的代碼:

            //返回鼠標(biāo)雙擊間隔時(shí)間

            ShowMessage("鼠標(biāo)雙擊間隔時(shí)間為"+IntToStr(GetDoubleClickTime())+"毫秒");

              再雙擊按鈕Button2,也在它的OnClick事件中加入代碼:

            //設(shè)置鼠標(biāo)雙擊間隔時(shí)間

            SetDoubleClickTime(StrToInt(Edit1-$#@62;Text));

              最后,按F9編譯運(yùn)行一下程序。點(diǎn)擊窗口中的“獲取雙擊間隔時(shí)間”按鈕就會(huì)彈出一個(gè)顯示當(dāng)前系統(tǒng)鼠標(biāo)雙擊間隔的時(shí)間,若要設(shè)置鼠標(biāo)雙擊間隔的時(shí)間,只要改變文本框中的數(shù)值,比如300吧,再點(diǎn)擊“設(shè)置雙擊間隔時(shí)間”按鈕就可以了。需要注意的是,鼠標(biāo)雙擊間隔時(shí)間的單位是毫秒,設(shè)置的值越小,間隔的時(shí)間就越小,雙擊的速度就越快,系統(tǒng)默認(rèn)的是400毫秒,可不要設(shè)得太小了,否則“我的電腦”會(huì)打不開的(你雙擊的速度不夠快,^_^)。





             API技巧集 (二)



              (四)啟動(dòng)控制面板控制臺(tái)應(yīng)用程序

              在控制面板里有許多的控制面板項(xiàng)目,這些項(xiàng)目就是控制臺(tái)應(yīng)用程序,它們都是標(biāo)準(zhǔn)的DLL(動(dòng)態(tài)鏈接庫)文件,我們經(jīng)常需要通過它們來對(duì)Windows進(jìn)行配置。rundll32.exe就是專門用來調(diào)用DLL文件的程序,在C++ Builder編程中,我們可以通過使用API函數(shù)WinExec運(yùn)行外部程序rundll32.exe調(diào)用DLL來實(shí)現(xiàn)啟動(dòng)控制面板的控制臺(tái)應(yīng)用程序。下面是收集的一些調(diào)用DLL啟動(dòng)控制臺(tái)應(yīng)用程序的例子:

              1、打開控制面板  

            WinExec("rundll32.exe shell32.dll,Control_RunDLL",SW_SHOWNORMAL);

              2、打開方式對(duì)話框

            WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL "c:\\autoexec.bat"",SW_SHOWNORMAL);

              3、添加Modem

            WinExec("rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add",SW_SHOWNORMAL);

              4、添加打印機(jī)

            WinExec("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter",SW_SHOWNORMAL);

              5、復(fù)制磁盤

            WinExec("rundll32.exe diskcopy.dll,DiskCopyRunDll",SW_SHOWNORMAL);

              6、鼠標(biāo)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL main.cpl",SW_SHOWNORMAL);

              7、網(wǎng)絡(luò)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl",SW_SHOWNORMAL);

              8、密碼

            WinExec("rundll32.exe shell32.dll,Control_RunDLL password.cpl",SW_SHOWNORMAL);

              9、游戲控制器

            WinExec("rundll32.exe shell32.dll,Control_RunDLL joy.cpl",SW_SHOWNORMAL);

              10、日期/時(shí)間

            WinExec("rundll32.exe shell32.dll,Control_RunDLL timedate.cpl",SW_SHOWNORMAL);

              11、Internet 屬性
            WinExec("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl",SW_SHOWNORMAL);

              12、添加/刪除程序

            //安裝/卸載

            WinExec("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1",SW_SHOWNORMAL);

            //Windows 安裝

            WinExec("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2",SW_SHOWNORMAL);

            //啟動(dòng)盤

            WinExec("rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3",SW_SHOWNORMAL);

              13、區(qū)域設(shè)置

            //區(qū)域設(shè)置

            WinExec("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0",SW_SHOWNORMAL);

            //數(shù)字

            WinExec("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1",SW_SHOWNORMAL);

            //貨幣

            WinExec("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2",SW_SHOWNORMAL);

            //時(shí)間

            WinExec("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3",SW_SHOWNORMAL);

            //日期

            WinExec("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4",SW_SHOWNORMAL);

              14、輔助選項(xiàng)

            //鍵盤

            WinExec("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1",SW_SHOWNORMAL);

            //聲音

            WinExec("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2",SW_SHOWNORMAL);

            //顯示

            WinExec("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3",SW_SHOWNORMAL);

            //鼠標(biāo)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4",SW_SHOWNORMAL);

            //常規(guī)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5",SW_SHOWNORMAL);

              15、多媒體

            //音頻

            WinExec("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0",SW_SHOWNORMAL);

            //視頻

            WinExec("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1",SW_SHOWNORMAL);

            //MIDI

            WinExec("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2",SW_SHOWNORMAL);

            //CD 音樂

            WinExec("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3",SW_SHOWNORMAL);

            //設(shè)備

            WinExec("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4",SW_SHOWNORMAL);

              16、系統(tǒng)

            //常規(guī)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0",SW_SHOWNORMAL);

            //設(shè)備管理器

            WinExec("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1",SW_SHOWNORMAL);

            //硬件配置文件

            WinExec("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2",SW_SHOWNORMAL);

            //性能

            WinExec("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3",SW_SHOWNORMAL);

              17、顯示器

            //背景

            WinExec("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0",SW_SHOWNORMAL);

            //屏幕保護(hù)

            WinExec("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1",SW_SHOWNORMAL);

            //外觀

            WinExec("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2",SW_SHOWNORMAL);

            //設(shè)置

            WinExec("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3",SW_SHOWNORMAL);  

              這些例子在Windows 98和Windows 2000中都可以使用通過,前提是在控制面板中安裝了該項(xiàng)目。

            API技巧集(三) 

              (一)閃爍程序的標(biāo)題欄

              在某些專業(yè)的應(yīng)用程序中,當(dāng)程序需要提醒用戶或要引起用戶的注意時(shí),就不停地閃爍程序的標(biāo)題欄。要實(shí)現(xiàn)這個(gè)功能,只需要一個(gè)Timer組件和使用一個(gè)API函數(shù)--FlashWindow。

              使用API函數(shù)FlashWindow可以閃爍顯示指定窗口,讓窗口在活動(dòng)與非活動(dòng)的狀態(tài)之間切換,它有兩個(gè)參數(shù):hwnd和bInvert,頭文件為“winuser.h”。其中,參數(shù)hwnd為要閃爍的窗口句柄,參數(shù)bInvert是一個(gè)bool變量,設(shè)為true時(shí),程序窗口標(biāo)題欄從活動(dòng)切換到非活動(dòng)狀態(tài)、或反向切換,當(dāng)設(shè)為false時(shí),窗口標(biāo)題欄還原為最初的狀態(tài)。如果配合一個(gè)時(shí)間組件(Timer組件),以一定的時(shí)間間隔執(zhí)行語句:

            FlashWindow(Form1-$#@62;Handle,true);

            程序窗口的標(biāo)題欄就在活動(dòng)、非活動(dòng)的狀態(tài)之間不停地切換。若把hwnd指定成為應(yīng)用程序的句柄(Application-$#@62;Handel),將會(huì)閃爍程序在任務(wù)欄上的標(biāo)題欄。

              下面就讓我們來做一個(gè)閃爍窗口標(biāo)題欄和任務(wù)欄上標(biāo)題欄的程序。

              首先,在Form1中添加三個(gè)按鈕Button1、Button2和Button3,把它們的屬性分別為“閃爍窗口標(biāo)題欄”、“閃爍任務(wù)標(biāo)題欄”和“停止閃爍”,再加入兩個(gè)時(shí)間組件Timer1和Timer2,將兩個(gè)Timer組件的Enabled屬性都設(shè)為false,將Interval屬性都設(shè)為為500(即半秒),改變這個(gè)屬性的值可以修改閃爍的頻率。

              然后,雙擊Timer1,在OnTimer事件中加入:

            FlashWindow(Form1-$#@62;Handle,true);

              雙擊Timer2,在OnTimer事件中加入:

            FlashWindow(Application-$#@62;Handel,true);

              雙擊Button1,在Button1的OnClick事件中加入:

            Timer1-$#@62;Enabled=true;

              雙擊Button2,在Button2的OnClick事件中加入:

            Timer2-$#@62;Enabled=true;

              最后,雙擊Button3,在Button3的OnClick事件中加入:

            Timer1-$#@62;Enabled=false;

            Timer2-$#@62;Enabled=false;

            FlashWindow(Form1-$#@62;Handle,false);

            FlashWindow(Application-$#@62;Handel,false);

              這樣,一個(gè)簡單的例子就完成了。按F9編譯運(yùn)行程序,你就可閃爍窗口標(biāo)題欄或是閃爍任務(wù)欄上? 題欄了。


              (二)拖動(dòng)無標(biāo)題窗體

              現(xiàn)在的Windows應(yīng)用程序,大都使用了圖形化的界面、不規(guī)則窗口技術(shù),使得程序界面更加漂亮了。但是,使用界面一般要先把窗體的標(biāo)題欄去掉(在BCB中,將窗體的BorderStyle屬性設(shè)為bsNone,就可以把窗體的標(biāo)題欄去掉),這樣就不能使用原來的標(biāo)題欄了,出現(xiàn)了窗口不能移動(dòng)的問題。沒有標(biāo)題欄怎樣用鼠標(biāo)拖動(dòng)窗體呢?我們可以使用Windows的API函數(shù)SendMessage來解決這個(gè)問題。

              首先,新建一個(gè)工程,把窗體的BorderStyle屬性設(shè)為bsNone去掉窗體的標(biāo)題欄,按F12鍵切換到代碼編輯窗口,在頭部加入包含頭文件"winuser.h"的代碼:

            #include $#@60;winuser.h$#@62;

              然后,在窗體的 OnMouseDown 事件中加入下面的代碼:

            if(Button == mbLeft)//判斷是否按了鼠標(biāo)左鍵

            {

            ReleaseCapture();//釋放鼠標(biāo)操作

            SendMessage( Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);

            }

              這樣,用鼠標(biāo)左鍵點(diǎn)住窗口拖動(dòng),就可以實(shí)現(xiàn)拖動(dòng)沒有標(biāo)題的窗口了。也可以在窗體上添加組件,然后在該組件的 OnMouseDown 事件中加入上面的代碼,這樣也可以點(diǎn)住這個(gè)組件拖動(dòng)窗口。你還可以把SendMessage函數(shù)的第一個(gè)參數(shù)修改為這個(gè)組件的句柄,如:往窗體添加一個(gè)Button組件,在它的 OnMouseDown 事件中加入上面的代碼,其中把SendMessage那行語句改為:

            SendMessage( Button1-$#@62;Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);

            這樣就可以在程序運(yùn)行時(shí),用鼠標(biāo)在窗口的范圍內(nèi)移動(dòng)Button1了。

              (三)隱藏程序在任務(wù)欄的圖標(biāo)

              使用API函數(shù)ShowWindow可以隱藏一個(gè)程序在任務(wù)欄的圖標(biāo),它被包含在頭文件“winuser.h”里面。

              1、隱藏任務(wù)欄圖標(biāo)的代碼就是:

            ShowWindow(Application-$#@62;Handle, SW_HIDE);

              2、要重新顯示的時(shí)候就使用:

            ShowWindow(Application-$#@62;Handle, SW_SHOW);

              但是,如果將程序最小化后,在任務(wù)欄的圖標(biāo)就會(huì)重新出現(xiàn)。若要在程序還原最小化后,程序在任務(wù)欄的圖標(biāo)重新被隱藏起來,可以在窗體的OnPaint事件中加入隱藏程序在任務(wù)欄的圖標(biāo)的代碼,這樣,程序只有在最小化時(shí)任務(wù)欄才會(huì)出現(xiàn)圖標(biāo),當(dāng)程序還原最小化時(shí)圖標(biāo)又會(huì)重新被隱藏起來。


            API技巧集(三)




              (四)重啟、關(guān)閉Windows

              當(dāng)用戶修改了Windows里面的一些設(shè)置,Windows經(jīng)常會(huì)提問是否要重新啟動(dòng)計(jì)算機(jī),當(dāng)用戶點(diǎn)Yes的時(shí)候,計(jì)算機(jī)將會(huì)自動(dòng)重啟。這個(gè)就是API函數(shù)ExitWindowsEx的一個(gè)典型的應(yīng)用。

              ExitWindowsEx,顧名思義就是退出Windows的函數(shù),它有兩個(gè)參數(shù),第一個(gè)是退出Windows的選項(xiàng),常用的有:EWX_REBOOT(重新啟動(dòng)計(jì)算機(jī)),EWX_SHUTDOWN(關(guān)閉計(jì)算機(jī)),EWX_LOGOFF(注銷當(dāng)前用戶),第二個(gè)參數(shù)系統(tǒng)保留沒有使用,可設(shè)為0。

              在自編的程序中(如:注冊(cè)表修改程序),當(dāng)用戶修改了某項(xiàng)設(shè)置需要重新啟動(dòng)計(jì)算機(jī)的時(shí)候,就要使用EWX_REBOOT選項(xiàng)重啟計(jì)算機(jī)。如:

            ExitWindowsEx(EWX_REBOOT,0);

              使用WX_SHUTDOWN選項(xiàng),可以實(shí)現(xiàn)關(guān)機(jī)。如:

            ExitWindowsEx(EWX_SHUTDOWN,0);

              當(dāng)需要注銷的時(shí)候,就使用EWX_LOGOFF選項(xiàng)。如:

            ExitWindowsEx(EWX_LOGOFF,0);

            api技巧集(四)



            函數(shù)名:

              SetWindowPos

            頭文件:

              winuser.h

            函數(shù)原型:

              BOOL SetWindowPos
              (
              HWND hWnd, //窗口句柄
              HWND hWndInsertAfter, //排列順序的句柄
              int X, //水平坐標(biāo)
              int Y, //垂直坐標(biāo)
              int cx, //寬
              int cy, //高
              UINT uFlags //窗口定位標(biāo)識(shí)
              );

            說明:

              這個(gè)函數(shù)能改變窗口的大小、位置和設(shè)置子窗口、彈出窗口或頂層窗口的排列順序。
              返回值:

              BOOL,如果返回值非零表示成功,返回零表示失敗。錯(cuò)誤信息請(qǐng)參看GetLastError函數(shù)。

            參數(shù)表:

              參數(shù) 類型及說明
              hwnd HWND,欲定位的窗口句柄
              hWndInsertAfter HWND,置于hwnd前面的窗口句柄。這個(gè)參數(shù)必須是窗口的句柄或是下面的值之一:   HWND_BOTTOM 將窗口置于其它所有窗口的底部
              HWND_NOTOPMOST 將窗口置于其它所有窗口的頂部,并位于任何最頂部窗口的后面。如果這個(gè)窗口非頂部窗口,這個(gè)標(biāo)記對(duì)該窗口并不產(chǎn)生影響
              HWND_TOP 將窗口置于它所有窗口的頂部
              HWND_TOPMOST 將窗口置于其它所有窗口的頂部,并位于任何最頂部窗口的前面。即使這個(gè)窗口不是活動(dòng)窗口,也維持最頂部狀態(tài)

            x: 
             
              int,指定窗口新的X坐標(biāo)

            Y:  

              int,指定窗口新的Y坐標(biāo)

            cx:  

              int,指定窗口新的寬度

            cy:  

              int,指定窗口新的高度

            wFlags:

              UINT,指定窗口狀態(tài)和位置的標(biāo)記。這個(gè)參數(shù)使用下面值的組合: SWP_DRAWFRAME 圍繞窗口畫一個(gè)框
              SWP_FRAMECHANGED 發(fā)送一條WM_NCCALCSIZE消息進(jìn)入窗口,即使窗口的大小沒有發(fā)生改變。如果不指定這個(gè)參數(shù),消息WM_NCCALCSIZE只有在窗口大小發(fā)生改變時(shí)才發(fā)送
              SWP_HIDEWINDOW 隱藏窗口
              SWP_NOACTIVATE 不激活窗口
              SWP_NOCOPYBITS 屏蔽客戶區(qū)域
              SWP_NOMOVE 保持當(dāng)前位置(X和Y參數(shù)將被忽略)
              SWP_NOOWNERZORDER 不改變所有窗口的位置和排列順序
              SWP_NOREDRAW 窗口不自動(dòng)重畫
              SWP_NOREPOSITION 與SWP_NOOWNERZORDER標(biāo)記相同 r>   SWP_NOSENDCHANGING 防止這個(gè)窗口接受WM_WINDOWPOSCHANGING消息
              SWP_NOSIZE 保持當(dāng)前大小(cx和cy會(huì)被忽略)
              SWP_NOZORDER 保持窗口在列表的當(dāng)前位置(hWndInsertAfter將被忽略)
              SWP_SHOWWINDOW 顯示窗口


            備注:

              如果設(shè)置了SWP_SHOWWINDOW或SWP_HIDEWINDOW標(biāo)記,這個(gè)窗口不發(fā)生移動(dòng)或改變大小。窗口成為最頂級(jí)窗口后,它的所有子窗口也會(huì)進(jìn)入最頂級(jí)。一旦將其設(shè)為非最頂級(jí),則它的所有子窗口也會(huì)轉(zhuǎn)為非最頂級(jí)。

            相關(guān)函數(shù):

              MoveWindow,SetActiveWindow,SetForegroundWindow

            例子:

              //設(shè)置頂層窗口
              SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);

              //取消頂層窗口
              SetWindowPos( Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);



            api技巧集(四)





            超級(jí)鏈接效果

              在很多共享軟件的關(guān)于對(duì)話框里有一些模仿網(wǎng)頁的超級(jí)鏈接,如主頁URL或E-Mail之類的,當(dāng)鼠標(biāo)移到它上面的時(shí)候,文字變成紅色的,當(dāng)鼠標(biāo)離開時(shí),文字又變回原來的藍(lán)色,如果用鼠標(biāo)點(diǎn)擊這個(gè)鏈接則會(huì)彈出瀏覽器窗口打開指定的URL或是運(yùn)行默認(rèn)的E-Mail程序撰寫新郵件,就和真的超鏈接一樣。你是不是也想在你的程序里做一個(gè)呢?其實(shí),我們只要調(diào)用API函數(shù)ShellExecute和在鼠標(biāo)移動(dòng)時(shí)改變一下文字的顏色,就可以在自己的程序中出現(xiàn)這種效果。

              首先新建一個(gè)工程,在窗體Form1上添加兩個(gè)Label組件,它們的Name屬性使用默認(rèn)的Label1和Label2。

              然后在Form1的OnCreate事件中加入代碼:

            Label1-$#@62;Cursor=crHandPoint;

            Label2-$#@62;Cursor=crHandPoint;

            Label1-$#@62;Font-$#@62;Color =clBlue;

            Label2-$#@62;Font-$#@62;Color =clBlue;

            Label1-$#@62;Caption="主頁:初學(xué)者之家網(wǎng)站";

            Label2-$#@62;Caption="E-Mail:fdlweb@sina.com";

              再在Label1的OnClick(單擊)事件中加入:

            //藍(lán)色的字請(qǐng)改成自己的主頁地址

            ShellExecute(Handle,NULL,"http://fdlweb.myrice.com/",NULL,NULL,SW_SHOWNORMAL);

              在OnMouseMove事件中加入:

            Label1-$#@62;Font-$#@62;Color=clRed;

              在Label2的OnClick事件中加入:

            //藍(lán)色的字請(qǐng)改成自己郵箱地址

            ShellExecute(Handle,NULL,"mailto:fdlweb@sina.com",NULL,NULL,SW_SHOWNORMAL);

              在OnMouseMove事件中加入:

            Label2-$#@62;Font-$#@62;Color=clRed;

              最后在Form1的OnMouseMove事件中加入:

            Label1-$#@62;Font-$#@62;Color=clBlue;

            Label2-$#@62;Font-$#@62;Color=clBlue;

              代碼輸入完了,按F9編譯運(yùn)行程序就看到效果了。



            拷貝屏幕

              BitBlt函數(shù)可以將一幅位圖從一個(gè)設(shè)備場景拷貝到另一個(gè)設(shè)備場景,這個(gè)函數(shù)經(jīng)常用在抓圖程序和游戲編程方面,也可以用來做基于桌面的屏幕保護(hù)程序。下面讓我們用BitBlt函數(shù)來做一個(gè)虛假桌面的程序:

              首先,添加一個(gè)Image組件到窗體中,將窗體Form1的BorderStyle屬性設(shè)為:bsNone。

              接著在窗體的OnCreate事件加入程序代碼:

            Left=0;

            Top=0;

            Width=Screen-$#@62;Width;

            Height=Screen-$#@62;Height;

            Image1-$#@62;Left=0;

            Image1-$#@62;Top=0;

            Image1-$#@62;Width=Screen-$#@62;Width;

            Image1-$#@62;Height=Screen-$#@62;Height;

            //這句代碼就是將桌面拷貝到組件Image1中來存放,

            // 其中GetDC(0)返回桌面設(shè)備的句柄(HDC)

            BitBlt(Image1-$#@62;Canvas-$#@62;Handle,0,0,Screen-$#@62;Width,Screen-$#@62;Height,GetDC(0),0,0,SRCCOPY);

              按F9運(yùn)行,一個(gè)假的桌面就出來了,在這個(gè)“桌面”上怎么按鼠標(biāo)都沒有反應(yīng),可以用來捉弄人喔!。有些桌面的小游戲也是這么干的,你可以在這個(gè)程序的基礎(chǔ)上加上更多的功能,如在窗體上加上Label組件和Timer組件,用Timer組件來控制Label組件在窗體上移動(dòng),再在窗體Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入關(guān)閉窗口的代碼“Close();”,最后將編譯了的程序的擴(kuò)展名改為scr,這就成了一個(gè)文字在桌面上亂動(dòng)的屏幕保護(hù)程序了。






            取得磁盤總空間和剩余空間

              要取得磁盤總空間和剩余空間,最簡單直接的方法是調(diào)用API函數(shù) GetDiskFreeSpace。

              GetDiskFreeSpace函數(shù)有5個(gè)參數(shù),第一個(gè)參數(shù)是要判斷可用空間的驅(qū)動(dòng)器名,第二個(gè)參數(shù)是一個(gè)存放每簇扇區(qū)數(shù)的變量,第三個(gè)參數(shù)是一個(gè)存放每扇區(qū)字節(jié)數(shù)的變量,第四個(gè)參數(shù)是存放剩余簇?cái)?shù)的變量,第五個(gè)參數(shù)是存放總簇?cái)?shù)的變量。套用相應(yīng)計(jì)算磁盤空間的公式即可得出指定驅(qū)動(dòng)器的總空間或剩余空間。

            磁盤總空間和剩余空間的計(jì)算公式分別為:

              磁盤上剩余空間(字節(jié)) = 簇的扇區(qū)數(shù) * 扇區(qū)的字節(jié)數(shù) * 剩余簇?cái)?shù)

              磁盤上總空間(字節(jié)) = 簇的扇區(qū)數(shù) * 扇區(qū)的字節(jié)數(shù) * 總簇?cái)?shù)

            下面就是取得C盤的總空間和剩余空間的例子:

            unsigned long Sectors,Bytes,Free,Total;

            GetDiskFreeSpace("C:\\",&Sectors,&Bytes,&Free,&Total);

            //可用空間(單位:MB)

            int FreeKB = Bytes * Sectors * Free / 1024;

            //總空間(單位:MB)

            int TotalKB = Bytes * Sectors * Total / 1024;

            ShowMessage("C盤的可用空間有:" + IntToStr(FreeKB) + "MB,總空間有:" + IntToStr(TotalKB) +"MB");

            api技巧集(五) 

            提取圖標(biāo)


              調(diào)用API函數(shù)ExtractIcon可以提取出在程序文件中的圖標(biāo),它的頭文件是shellapi.h,原型為:

            HICON ExtractIcon
            (
            HINSTANCE hInst, //實(shí)例句柄
            LPCTSTR lpszExeFileName, //要提取圖標(biāo)的那個(gè)程序的文件名
            UINT nIconIndex //要提取的圖標(biāo)的索引
            );

              調(diào)用該函數(shù)時(shí),參數(shù)hInst一般設(shè)為當(dāng)前應(yīng)用程序的實(shí)例句柄,如:Form1-$#@62;Handle。

              參數(shù)lpszExeFileName為需要提取圖標(biāo)的程序文件的完整路徑,這個(gè)程序文件可以是EXE文件、DLL文件、ICO文件等,只要是包含有圖標(biāo)資源的文件一般都可以提取圖標(biāo)。

              當(dāng)參數(shù)nIconIndex指定一個(gè)圖標(biāo)的索引可以返回指向圖標(biāo)的句柄,如指定的文件中不存在圖標(biāo),則返回零,當(dāng)參數(shù)nIconIndex設(shè)為-1,函數(shù)返回文件的圖標(biāo)總數(shù)。

              函數(shù)返回的句柄可以賦給一個(gè)用TIcon類聲明的變量,再使用該變量的SaveToFile方法就可以把圖標(biāo)保存出來。

            例子:

            TIcon *Icon = new TIcon();
            AnsiString FileName = "C:\\WINDOWS\\SYSTEM\\SHELL32.DLL";
            int TotalIcon;
            //得到文件SHELL32.DLL的總圖標(biāo)數(shù)
            TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);
            //提取第一個(gè)圖標(biāo),0為第一個(gè),1為第二個(gè),類推...
            Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);
            //保存圖標(biāo)
            Icon->SaveToFile("C:\\1.ICO");
              下面給出一個(gè)完整的圖標(biāo)提取程序源碼。

              這個(gè)程序需要四個(gè)按鈕控件(Button)、四個(gè)文本標(biāo)簽控件(Label)、兩個(gè)文本框控件(Edit)、一個(gè)水平滾動(dòng)條控件(ScrollBar)、一個(gè)打開文件對(duì)話框控件(OpenDialog)、一個(gè)保存文件對(duì)話框控件(SaveDialog)和一個(gè)圖片控件(Image),還有一個(gè)Panel控件是裝飾用的。界面如圖所示:

                         

              把各個(gè)控件排列好,再把四個(gè)Label控件的Caption屬性修改一個(gè),最后輸入程序代碼,運(yùn)行程序,一個(gè)提取圖標(biāo)的程序就出來了,你以后也就不會(huì)為沒有圖標(biāo)資源可用而發(fā)愁了。

            程序清單(Unit1.cpp):
            //--------------------------------------- ----------------------
            #include $#@60;vcl.h$#@62;
            #pragma hdrstop
            #include "Unit1.h"
            //----------------------------------------------------------------
            #pragma package(smart_init)
            #pragma resource "*.dfm"
            TForm1 *Form1;
            AnsiString FileName;
            TIcon *Icon = new TIcon();
            int TotalIcon;
            //----------------------------------------------------------------
            __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
            {
            }

            //----------------------------------------------------------------

            void __fastcall TForm1::FormCreate(TObject *Sender)
            {

            Caption="圖標(biāo)小偷 1.0";
            Button1-$#@62;Caption="選擇文件";
            Button2-$#@62;Caption="保存圖標(biāo)";
            Button3-$#@62;Caption="保存所有";
            Button4-$#@62;Caption="退出";
            Edit1-$#@62;Text=0;
            Edit2-$#@62;Text=0;
            Image1-$#@62;Width=32;
            Image1-$#@62;Height=32;
            OpenDialog1-$#@62;Filter="可執(zhí)行文件(*.exe,*.dll)|*.exe;*.dll|圖標(biāo)文件(*.ico)|*.ico|所有文件(*.*)|*.*";
            SaveDialog1-$#@62;Filter="圖標(biāo)文件|*.ico";
            ScrollBar1-$#@62;Enabled=false;
            Button2-$#@62;Enabled=false;
            Button3-$#@62;Enabled=false;

            }
            //----------------------------------------------------------------
            void __fastcall TForm1::Button1Click(TObject *Sender)
            {

            if(OpenDialog1-$#@62;Execute())
            {

            TotalIcon = (int)ExtractIcon( Form1-$#@62;Handle, OpenDialog1-$#@62;FileName.c_str(), -1 );
            if(TotalIcon$#@62;0)
            {

            if(TotalIcon$#@60;2)

            ScrollBar1-$#@62;Enabled=false;

            else

            ScrollBar1-$#@62;Max=TotalIcon-1;

            Button2-$#@62;Enabled=true;
            Button3-$#@62;Enabled=true;
            FileName = OpenDialog1-$#@62;FileName;
            Edit1-$#@62;Text =TotalIcon;
            Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), 0);
            Image1-$#@62;Picture-$#@62;Icon=Icon;
            Edit2-$#@62;Text=1;

            }
            else
            {

            ShowMessage("該文件沒有圖標(biāo)");

            }

            }

            }
            //----------------------------------------------------------------
            void __fastcall TForm1::Button2Click(TObject *Sender)
            {

            if(SaveDialog1-$#@62;Execute())
            {

            //保存圖標(biāo)
            Icon-$#@62;SaveToFile( SaveDialog1-$#@62;FileName);

            }

            }
            //----------------------------------------------------------------
            void __fastcall TForm1::Button3Click(TObject *Sender)
            {

            if(SaveDialog1-$#@62;Execute())
            //提取所有的圖標(biāo)
            for(int i=0;i$#@60;TotalIcon-1;i++)
            {

            Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), i);
            Icon-$#@62;SaveToFile(SaveDialog1-$#@62;FileName+(AnsiString)i+".ico");

            }

            }
            //----------------------------------------------------------------
            void __fastcall TForm1::Button4Click(TObject *Sender)
            {

            Close();

            }
            //----------------------------------------------------------------
            void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
            {

            Edit2-$#@62;Text=ScrollBar1-$#@62;Position+1;
            Icon-$#@62;Handle = ExtractIcon(Form1-$#@62;Handle, FileName.c_str(),ScrollBar1-$#@62;Position);
            Image1-$#@62;Picture-$#@62;Icon=Icon;

            }
            //----------------------------------------------------------------

            判斷驅(qū)動(dòng)器的類型


              使用API函數(shù)GetDriveType能判斷一個(gè)驅(qū)動(dòng)器的類型,該函數(shù)返回一個(gè)int型的值,當(dāng)返回值為2時(shí),是軟盤;為3時(shí),是硬盤;為4時(shí),是網(wǎng)絡(luò)映射盤;為5時(shí),是光驅(qū);為6時(shí),是 RAM 磁盤;為其它值時(shí),是非法的盤符。這個(gè)API函數(shù)包含在winbase.h頭文件中,首先在程序頭部加上語句:

            include $#@60;winbase.h$#@62;

            包含頭文件,然后在程序中加入以下代碼就可以判斷驅(qū)動(dòng)器的類型:

            int drv;
            //這里的"C:\\"為要判斷的盤符
            drv=GetDriveType("C:\\");
            switch (drv) //判斷drv的值
            {
            case 2 : //DRIVE_REMOVABLE

            ShowMessage("軟盤");
            break;

            case 3 : //DRIVE_FIXED

            ShowMessage("硬盤");
            break;

            case 4 : //DRIVE_REMOTE

            ShowMessage("網(wǎng)絡(luò)映射盤");
            break;

            case 5 : //DRIVE_CDROM

            ShowMessage("光驅(qū)");
            break;

            case 6 : //DRIVE_RAMDISK

            ShowMessage("RAM 磁盤");
            break;

            default :

            ShowMessage("這個(gè)磁盤不存在!");
            break;

            }

            注:case語句后的數(shù)值也可以用注釋后的常數(shù)替換。如2可用常數(shù) DRIVE_REMOVABLE 來替換。

            api技巧集(七)

            窗口最小化、最大化和恢復(fù)

              通過調(diào)用API函數(shù)ShowWindow可以控制指定窗口的狀態(tài),如將窗口最小化、最大化或者是恢復(fù)原來的狀態(tài),等等。

              雖然通過窗口標(biāo)題欄上的控制按鈕也可以將窗口最小化、最大化或者是恢復(fù),但ShowWindow函數(shù)能實(shí)現(xiàn)更多的功能,又如隱藏窗口、將窗口最小化到桌面等,這些是標(biāo)準(zhǔn)的控制按鈕所做不到的。

              下面介紹一個(gè)ShowWindow函數(shù)的例子。這個(gè)例子演示了如何將一個(gè)窗口最小化到桌面或最小化到任務(wù)欄和最大化、恢復(fù)窗口原始狀態(tài)。

              首先,在C++ Builder中新建一個(gè)工程,為了方便演示,工程需要兩個(gè)窗口。添加第二個(gè)窗口Form2的方法是:選擇“File”菜單下的“New Form”。添加了新窗口后,選擇“File”菜單下的“Include Unit Hdr...”包含窗口Form2的頭文件“Unit2.h”,或是直接在Form1的代碼編輯窗口的頭部加上“#include "Unit2.h"”語句。然后在Form1上放上四個(gè)按鈕,它們的Caption屬性分別為“最大化”、“最小化到桌面”、“恢復(fù)”和“最小化到任務(wù)欄并恢復(fù)”。

              接著,雙擊窗件Form1,在它的OnCreate事件中加入:

            void __fastcall TForm1::FormCreate(TObject *Sender)

            {

              //設(shè)置Form1為頂層窗口

            Form1-$#@62;FormStyle=fsStayOnTop;

            }

              雙擊按鈕Button1,在它的OnClick事件中加入:

            void __fastcall TForm1::Button1Click(TObject *Sender)

            {

              //最大化

            ShowWindow(Form2-$#@62;Handle, SW_MAXIMIZE);

            }

            雙擊按鈕Button2,在它的OnClick事件中加入:


            void __fastcall TForm1::Button2Click(TObject *Sender)

            { //最小化到桌面

            ShowWindow(Form2-$#@62;Handle, SW_MINIMIZE);

            }

            雙擊按鈕Button3,在它的OnClick事件中加入:

            void __fastcall TForm1::Button3Click(TObject *Sender)

            {

              //恢復(fù)最小化

            ShowWindow(Form2-$#@62;Handle, SW_RESTORE);

            }

            {{秪峈最唗郔苤趙恄魊蛹鞶 酸傿蒚鰽蔑棠奴 埶朒鍤◆ 芼硌斯譬 賱?chuàng)荟豺蜿m棠 utton4腔OnClick岈璃笢〔峈賸?虴別載隴珆ㄛ笢潔樓?珨跺晊奀腔測鎢ㄩ

            void __fastcall TForm1::Button4Click(TObject *Sender)

            {

              //最小化到任務(wù)欄

            ShowWindow(Application-$#@62;Handle, SW_MINIMIZE);

              //延時(shí)1秒

            Sleep(1000);

              //恢復(fù)最小化

            ShowWindow(Application-$#@62;Handle, SW_RESTORE);

            }

              最后,編譯運(yùn)行程序。

              獲取磁盤序列號(hào)、卷標(biāo)和文件系統(tǒng)類型

              使用API函數(shù)GetVolumeInformation,可以獲取一個(gè)磁盤的有關(guān)信息,如磁盤的序列號(hào)、卷標(biāo)、文件系統(tǒng)類型。有些軟件就是利用磁盤的序列號(hào)來加密的。

              需要獲取磁盤信息的時(shí)候,加入下面的代碼就可以了:

              //定義長度為255的卷標(biāo)字符串變量緩沖區(qū):

            AnsiString VolumeName=AnsiString::StringOfChar(" ", 255);

              //序列號(hào)

            unsigned long SerialNumber;

              //定義長度為20的文件系統(tǒng)類型字符串緩沖區(qū)

            AnsiString SystemName = AnsiString::StringOfChar(" ",20);

              //獲取磁盤信息

            GetVolumeInformation("C:\\", VolumeName.c_str(), 255, &SerialNumber, 0, 0, SystemName.c_str(), 20);

            ShowMessage("C盤的卷標(biāo):" + Trim(VolumeName));

            ShowMessage("C盤的序列號(hào):" + IntToStr(SerialNumber));

            ShowMessage("C盤的文件系統(tǒng)類型:" + Trim(SystemName));
              屏幕放大鏡

              你一定用過Windows98自帶的那個(gè)屏幕放大鏡吧,你想不想自已做一個(gè)呢?其它,這個(gè)程序的關(guān)鍵是使用了API函數(shù)StretchBlt。

              調(diào)用API函數(shù)StretchBlt可以把一個(gè)設(shè)備中指定大小的位圖從拷貝到另一個(gè)設(shè)備,在拷貝的過程中,還可以根據(jù)需要來縮放位圖。

              下面是它的原型和參數(shù)說明:

            BOOL StretchBlt

            (

            HDC hdcDest, //目標(biāo)設(shè)備句柄

            int nXOriginDest, //目標(biāo)矩形左上角的X坐標(biāo)

            int nYOriginDest, //目標(biāo)矩形左上角的Y坐標(biāo)

            int nWidthDest, //目標(biāo)矩形的寬度

            int nHeightDest, //目標(biāo)矩形的高度

            HDC hdcSrc, //源設(shè)備句柄

            int nXOriginSrc, //源矩形左上角的X坐標(biāo)

            int nYOriginSrc, //源矩形左上角的Y坐標(biāo)

            int nWidthSrc, //源矩形的寬度

            int nHeightSrc, //源矩形的高度

            DWORD dwRop //光柵運(yùn)算操作

            );

              StretchBlt函數(shù)的頭文件為“wingdi.h”。其中,它的dwRop參數(shù)有15種操作,最常用的就是拷貝運(yùn)算SRCCOPY了。當(dāng)源設(shè)備和目標(biāo)設(shè)備指定的矩形大小不相等時(shí),函數(shù)會(huì)根據(jù)源矩形和目標(biāo)矩形的大小比例對(duì)位圖進(jìn)行放大或縮小操作后,拷貝到目標(biāo)設(shè)備中。

              下面就是一個(gè)把屏幕上左上角坐標(biāo)為0x0、寬和高都為100的矩形位圖縮小2倍后拷貝到圖片控件Image1中的例子:

            StretchBlt(Image1-$#@62;Canvas-$#@62;Handle, 0, 0, 50, 50, GetDC(0), 0, 0, 100, 100, SRCCOPY);

              這句代碼的GetDC(0)語句為取得桌面設(shè)備的句柄。

              如果不斷地使用上面那句代碼,把屏幕縮小放到Image1中,這就成一個(gè)“屏幕縮小鏡”了。當(dāng)然,縮小屏幕并沒有什么實(shí)際的用處,我們只要把它改一下就可以做成“屏幕放大鏡”了。

              要做這個(gè)“屏幕放大鏡”,首先要運(yùn)行Borland C Builder,在窗體Form1上放上一個(gè)圖片控件Image1和一個(gè)時(shí)間控件Timer1。

            雙擊窗體Form1,在它的OnCreate事件中加入代碼:

            void __fastcall TForm1::FormCreate(TObject *Sender)

            {

            Image1-$#@62;Width=200;

            Image1-$#@62;Height=200;

            Timer1-$#@62;Interval=10;
              //設(shè)置頂層窗口

            SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE);

            }

              雙擊時(shí)間控件Timer1,在它的OnTimer事件中加入以下代碼:

            void __fastcall TForm1::Timer1Timer(TObject *Sender)

            {

            int x,y;

            POINT CurPos;

              //取得鼠標(biāo)當(dāng)前坐標(biāo)

            GetCursorPos(&CurPos);

              //保證拷貝的圖象不在屏幕外

            if(CurPos.x $#@62;Screen-$#@62;Width - 100)

            x=Screen-$#@62;Width - 100;

            else if(CurPos.x $#@60;50)

            x=0;

            else

            x=CurPos.x-50;

            if(CurPos.y $#@62;Screen-$#@62;Height-100)

            y=Screen-$#@62;Height-100;

            else if(CurPos.y $#@60;50)

            y=0;

            else

            y=CurPos.y-50;

            Caption="坐標(biāo):" + IntToStr(CurPos.x) + "," + IntToStr(CurPos.y);

            Image1-$#@62;Canvas-$#@62;FillRect(Rect(0,0,200,200));
              //拷貝放大圖象

            StretchBlt(Image1-$#@62;Canvas-$#@62;Handle, 0, 0, 200, 200, GetDC(0), x, y, 100, 100, SRCCOPY);

            }

              代碼輸入完了,按F9或點(diǎn)擊運(yùn)行按鈕運(yùn)行程序。怎么樣?和Windows自帶的那個(gè)差不多吧!

              需要注意的是:C++ Builder并象VB那樣圖片控件可以是非持久性的,在C++ Builder中,并不能直接不斷地調(diào)用StretchBlt函數(shù)來得到連貫的圖象,而是要先使用圖片控件的FillRect方法填充圖片框(相當(dāng)于清空?qǐng)D片框),再調(diào)用StretchBlt函數(shù)才行。

              時(shí)間的延遲

              延遲在程序設(shè)計(jì)中非常有意義!比如,程序啟動(dòng)時(shí)的等待畫面,又或者你需要等待一個(gè)過程的完成才能運(yùn)行程序下面的代碼,這時(shí)就要使用到時(shí)間的延遲了。

              但是在很多編程語言中一般都沒有現(xiàn)成的延遲函數(shù)。在Dos的C時(shí)代,當(dāng)程序需要延遲時(shí),有不少人使用的是for循環(huán):

            for(int i=0;i$#@60;10000;i++);

              到現(xiàn)在也可能還有人在用吧。到了Win32時(shí)代,在系統(tǒng)的API函數(shù)庫里已經(jīng)提供有時(shí)間延遲的函數(shù)了,它就是Sleep函數(shù)。當(dāng)然,在Windows編程中,你也可以使用Timer控件,但使用Sleep函數(shù)更方便、快捷。我們只需簡單的調(diào)用一下Sleep函數(shù),就可以實(shí)現(xiàn)時(shí)間的延遲。

              Sleep函數(shù)只有一個(gè)參數(shù)cMilliseconds,用來指定需要延遲的時(shí)間,它的單位是毫秒。讓我們看下面的例子,請(qǐng)?jiān)谝粋€(gè)按鈕的單擊(OnClick)事件中加入下面的代碼:

            Sleep(3000);//延遲三秒

            ShowMessage("本對(duì)話框已經(jīng)延遲了三秒!");

              這個(gè)例子演示了一個(gè)延時(shí)的對(duì)話框,單擊了該按鈕,本應(yīng)立即彈出的對(duì)話框延遲了三秒鐘的時(shí)間才彈出。

             

            轉(zhuǎn)自 http://www.xici.net/ 西祠胡同

            返回主頁

            posted on 2007-06-15 10:30 我風(fēng) 閱讀(754) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 327232
            • 排名 - 75

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99久久国产宗和精品1上映 | 精品久久香蕉国产线看观看亚洲| 亚洲精品tv久久久久久久久| 婷婷综合久久中文字幕蜜桃三电影 | 日日噜噜夜夜狠狠久久丁香五月| 日产精品久久久久久久性色| 麻豆精品久久久一区二区| 欧美精品一区二区久久| 伊人久久无码中文字幕| 精品国产婷婷久久久| 99久久无色码中文字幕人妻| 精品久久久久久无码免费| 久久婷婷激情综合色综合俺也去| 久久e热在这里只有国产中文精品99| 99久久国产宗和精品1上映| 久久精品无码一区二区三区日韩| 久久久一本精品99久久精品66| 久久久久99精品成人片三人毛片| 久久亚洲AV成人出白浆无码国产| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 99久久婷婷国产一区二区| 亚洲AV无码久久精品成人| 久久精品一区二区影院| 久久99国产精品一区二区| 亚洲成色WWW久久网站| 一本久久免费视频| 久久久久亚洲精品无码网址| 72种姿势欧美久久久久大黄蕉| 亚洲国产高清精品线久久| 精品综合久久久久久97超人 | 精品永久久福利一区二区| 国产成人精品三上悠亚久久| 日韩精品无码久久一区二区三| 久久午夜电影网| 久久久中文字幕| 久久被窝电影亚洲爽爽爽| 亚洲综合婷婷久久| 99久久国产主播综合精品| 国产激情久久久久影院老熟女| 国产精品美女久久久久AV福利| 精品久久久久久久|