青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

Windows API 技巧集

一)不規(guī)則窗口

  Windows提供的只是標(biāo)準(zhǔn)的矩形窗口,要想建立一個(gè)不規(guī)則的窗口就需要調(diào)用API函數(shù)來(lái)實(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ù)就要先在程序頭部加上包含頭文件的語(yǔ)句:

include <wingdi.h>

include <winuser.h>

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

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

  1、CreateRectRgn函數(shù),用來(lái)創(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)建長(zhǎ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ù),用來(lái)創(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ū)域組合的方式,它的值是為下面組合方式之一:

  組合方式 說(shuō)明

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

RGN_COPY 建立hrgnSrc1的拷貝

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

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

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

  例子:

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

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

(一)閃爍程序的標(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í)行語(yǔ)句:

FlashWindow(Form1->Handle,true);

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

  下面就讓我們來(lái)做一個(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->Handle,true);

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

FlashWindow(Application->Handel,true);

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

Timer1->Enabled=true;

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

Timer2->Enabled=true;

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

Timer1->Enabled=false;

Timer2->Enabled=false;

FlashWindow(Form1->Handle,false);

FlashWindow(Application->Handel,false);

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

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

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

#include <winuser.h>

  然后在窗體的 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那行語(yǔ)句改為:

SendMessage( Button1->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->Handle, SW_HIDE);

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

ShowWindow(Application->Handle, SW_SHOW);

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

----------------------------
函數(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í)
  );

說(shuō)明:

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

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

參數(shù)表:

  參數(shù) 類型及說(shuō)明
  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)記相同
  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);
超級(jí)鏈接效果

   在很多共享軟件的關(guān)于對(duì)話框里有一些模仿網(wǎng)頁(yè)的超級(jí)鏈接,如主頁(yè)URL或E-Mail之類的,當(dāng)鼠標(biāo)移到它上面的時(shí)候,文字變成紅色的,當(dāng)鼠標(biāo)離開時(shí),文字又變回原來(lái)的藍(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->Cursor=crHandPoint;

Label2->Cursor=crHandPoint;

Label1->Font->Color =clBlue;

Label2->Font->Color =clBlue;

Label1->Caption="主頁(yè):初學(xué)者之家網(wǎng)站";

Label2->Caption="E-Mail:fdlweb@sina.com";

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

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

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

  在OnMouseMove事件中加入:

Label1->Font->Color=clRed;

  在Label2的OnClick事件中加入:

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

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

  在OnMouseMove事件中加入:

Label2->Font->Color=clRed;

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

Label1->Font->Color=clBlue;

Label2->Font->Color=clBlue;

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

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

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

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

Left=0;

Top=0;

Width=Screen->Width;

Height=Screen->Height;

Image1->Left=0;

Image1->Top=0;

Image1->Width=Screen->Width;

Image1->Height=Screen->Height;

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

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

BitBlt(Image1->Canvas->Handle,0,0,Screen->Width,Screen->Height,GetDC(0),0,0,SRCCOPY);

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

  要取得磁盤總空間和剩余空間,最簡(jiǎn)單直接的方法是調(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");
--------------------------
 
提取圖標(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->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)保存出來(lái)。

例子:

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)的程序就出來(lái)了,你以后也就不會(huì)為沒有圖標(biāo)資源可用而發(fā)愁了。

程序清單(Unit1.cpp):
//----------------------------------------------------------------
#include <vcl.h>
#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
->Caption="選擇文件";
Button2
->Caption="保存圖標(biāo)";
Button3
->Caption="保存所有";
Button4
->Caption="退出";
Edit1
->Text=0;
Edit2
->Text=0;
Image1
->Width=32;
Image1
->Height=32;
OpenDialog1
->Filter="可執(zhí)行文件(*.exe,*.dll)|*.exe;*.dll|圖標(biāo)文件(*.ico)|*.ico|所有文件(*.*)|*.*";
SaveDialog1
->Filter="圖標(biāo)文件|*.ico";
ScrollBar1
->Enabled=false;
Button2
->Enabled=false;
Button3
->Enabled=false;

}

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

if(OpenDialog1->Execute())
{

TotalIcon 
= (int)ExtractIcon( Form1->Handle, OpenDialog1->FileName.c_str(), -1 );
if(TotalIcon>0)
{

if(TotalIcon<2)

ScrollBar1
->Enabled=false;

else

ScrollBar1
->Max=TotalIcon-1;

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

}

else
{

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

}


}


}

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

if(SaveDialog1->Execute())
{

//保存圖標(biāo)
Icon->SaveToFile( SaveDialog1->FileName);

}


}

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

if(SaveDialog1->Execute())
//提取所有的圖標(biāo)
for(int i=0;i<TotalIcon-1;i++)
{

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

}


}

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

Close();

}

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

Edit2
->Text=ScrollBar1->Position+1;
Icon
->Handle = ExtractIcon(Form1->Handle, FileName.c_str(),ScrollBar1->Position);
Image1
->Picture->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頭文件中,首先在程序頭部加上語(yǔ)句:
include <winbase.h>
包含頭文件,然后在程序中加入以下代碼就可以判斷驅(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語(yǔ)句后的數(shù)值也可以用注釋后的常數(shù)替換。如2可用常數(shù) DRIVE_REMOVABLE 來(lái)替換。

posted on 2006-01-25 16:19 夢(mèng)在天涯 閱讀(4585) 評(píng)論(0)  編輯 收藏 引用 所屬分類: CPlusPlusMFC/QTWindows API

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812961
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美国产一区二区在线观看 | 99国产精品视频免费观看| 国产精品久久久久久久久久免费看| 欧美福利一区二区| 欧美日韩国产综合久久| 欧美日韩精品二区| 欧美日韩在线观看一区二区三区| 欧美午夜免费电影| 国产午夜精品美女毛片视频| 在线观看中文字幕亚洲| 亚洲精品韩国| 亚洲一区二区三区在线播放| 欧美一区二区视频在线| 老司机一区二区三区| 亚洲电影观看| 亚洲美女色禁图| 亚洲欧美日韩在线不卡| 久久综合网络一区二区| 欧美色欧美亚洲另类二区| 国产精品久久久久7777婷婷| 伊人婷婷欧美激情| 亚洲影院免费| 欧美激情91| 亚洲永久精品国产| 欧美freesex交免费视频| 国产精品美女久久久久久2018| 韩国女主播一区| 一本色道久久综合亚洲精品小说| 欧美中文字幕在线视频| 日韩亚洲视频在线| 一本色道久久综合狠狠躁的推荐| 亚洲欧美久久| 欧美日韩精品是欧美日韩精品| 国产美女高潮久久白浆| 日韩午夜激情| 卡一卡二国产精品| 亚洲视频一起| 欧美激情精品久久久久久黑人 | 久久国产直播| 一本久道久久综合狠狠爱| 久久av红桃一区二区小说| 欧美午夜精品久久久| 亚洲欧洲三级电影| 久久午夜影视| 香蕉成人伊视频在线观看| 欧美三级电影一区| 在线午夜精品自拍| 亚洲激情电影在线| 六月婷婷一区| 在线日韩日本国产亚洲| 久久久噜噜噜久久人人看| 亚洲一区二区三区激情| 欧美日韩在线播放三区四区| 99re国产精品| 日韩视频免费在线| 欧美日韩亚洲一区二区| 亚洲免费观看在线视频| 亚洲国产精品久久人人爱蜜臀| 久久深夜福利免费观看| 在线欧美视频| 欧美成人日本| 欧美不卡视频一区| 亚洲精品一区在线| 亚洲日本视频| 欧美日韩另类在线| 亚洲欧美国产日韩天堂区| 日韩一级在线观看| 欧美性色综合| 欧美一区二区三区在线观看| 久久国内精品视频| 亚洲电影欧美电影有声小说| 欧美成人精品高清在线播放| 欧美a级理论片| 亚洲性感激情| 久久精品二区| avtt综合网| 亚洲欧美日韩国产成人| 国产日韩欧美日韩| 欧美成va人片在线观看| 欧美日韩国产欧| 久久精品99国产精品| 久久婷婷亚洲| 亚洲天堂久久| 久久精品女人| 一区二区福利| 久久久久久久久一区二区| 午夜日韩av| 久久国产66| 亚洲三级免费观看| 亚洲精品国产精品国自产观看浪潮| 欧美大片免费观看在线观看网站推荐| 亚洲免费观看| 亚洲欧美www| 亚洲激情网站| 欧美伊人久久| 一区二区免费在线观看| 亚洲欧洲av一区二区三区久久| 一区二区在线视频观看| 亚洲最新色图| 最新亚洲一区| 欧美资源在线| 亚洲午夜久久久久久久久电影院 | 一区二区av| 午夜宅男欧美| 99国产精品视频免费观看| 性xx色xx综合久久久xx| 夜久久久久久| 久久综合伊人77777| 亚洲欧美国产高清| 欧美aⅴ99久久黑人专区| 欧美中日韩免费视频| 欧美日本亚洲| 欧美黑人在线观看| 国产一区二区三区观看 | 一区二区三区精品| 1024成人网色www| 亚洲免费视频一区二区| 一区二区三区日韩欧美精品| 久久久亚洲精品一区二区三区| 欧美一级一区| 欧美日韩国产色综合一二三四| 欧美成人午夜77777| 国产亚洲精品一区二555| 亚洲午夜精品久久久久久浪潮| 日韩亚洲欧美一区| 麻豆精品精品国产自在97香蕉| 久久久91精品国产| 国产精品超碰97尤物18| 99热在这里有精品免费| 日韩亚洲在线| 欧美成人免费全部| 欧美激情一区二区三区| 亚洲破处大片| 欧美成人在线免费观看| 亚洲福利在线看| 亚洲黄网站在线观看| 你懂的成人av| 亚洲精品一二三区| 亚洲视频在线一区观看| 国产精品国产三级国产a| 宅男精品视频| 欧美一区国产一区| 国产一区二区日韩精品| 久久裸体艺术| 亚洲国产精品久久久久婷婷884| 亚洲精选视频免费看| 欧美日韩精品免费看| 亚洲一区免费看| 久久久亚洲欧洲日产国码αv| 久久亚洲私人国产精品va| 欧美色网一区二区| 亚洲一区国产| 久久九九99视频| 韩国v欧美v日本v亚洲v| 蜜臀va亚洲va欧美va天堂| 最近中文字幕日韩精品| 亚洲网站啪啪| 国产日韩欧美精品一区| 久久久久亚洲综合| 亚洲精品国产无天堂网2021| 亚洲欧美色婷婷| 在线观看国产日韩| 欧美日韩一区在线观看视频| 午夜一级久久| 亚洲高清一二三区| 午夜精品亚洲一区二区三区嫩草| 国产欧美在线视频| 免费观看久久久4p| 一区二区三区欧美视频| 久久亚洲私人国产精品va| 99精品国产在热久久下载| 国产精品一页| 欧美大片免费观看在线观看网站推荐| 夜夜嗨av一区二区三区四区| 久久精品视频在线播放| 亚洲美女91| 国内一区二区在线视频观看| 欧美日韩国产精品一区| 久久精品视频播放| 亚洲一区二区成人在线观看| 亚洲电影免费观看高清完整版在线| 亚洲欧美文学| 日韩天堂av| ●精品国产综合乱码久久久久| 欧美手机在线| 欧美成人资源网| 欧美在线观看天堂一区二区三区| 91久久久久久| 免费久久久一本精品久久区| 性欧美办公室18xxxxhd| 在线亚洲精品福利网址导航| 亚洲高清不卡一区| 国产一区在线看| 国产精品一二| 国产精品久久国产愉拍| 欧美日韩国产成人在线91| 麻豆国产精品777777在线| 欧美专区在线播放| 午夜日韩激情| 亚洲综合国产|