API學(xué)習(xí)經(jīng)驗(yàn)之談___1
問題1____句柄
相信這個(gè)"東西"足以讓各位朋友郁悶很長一段實(shí)際在"云里霧里"中(小生可能更嚴(yán)重)
其實(shí),這是一個(gè)最不足以讓你去深究的東西,先聽聽"大師級(jí)人物"(個(gè)人認(rèn)為)羅云彬老師在<<Windows 環(huán)境下32位匯編語言程序設(shè)計(jì)>>(好書啊!~_~)一書中對(duì)它的定義:
句柄只是一個(gè)數(shù)值而已,它的值對(duì)程序來說是沒什么有意義的,它只是Windows用來表示資源的編號(hào)而已,所以只有Windows才知道怎么使用它來引用各種資源!
明白了嗎?(鬼才明白~_~!)
好,舉例來說,屏幕上已經(jīng)有10個(gè)窗口,Windows把他們從1道10編號(hào),應(yīng)用程序又建立了一個(gè)窗口,現(xiàn)在Windows把它編號(hào)位11,然后把11當(dāng)做窗口句柄返回個(gè)應(yīng)用程序,應(yīng)用程序并不知道11代表的是什么,但在操作窗口的時(shí)候,把11當(dāng)作句柄傳給Windows,Windows自然可以根據(jù)這個(gè)數(shù)值查出是哪個(gè)窗口.當(dāng)該窗口關(guān)閉的時(shí)候,11這個(gè)編號(hào)就作廢了.第二次運(yùn)行的時(shí)候,如果屏幕上又有5個(gè)窗口,那么現(xiàn)在句柄可能就是6了,所以,應(yīng)用程序不用關(guān)心句柄的具體數(shù)值是多少.打個(gè)比方,可以把句柄當(dāng)做是商場中寄放包包時(shí)營業(yè)員MM給的紙條,紙條上的標(biāo)號(hào)代表什么,用戶不用去了解,但把它給營業(yè)員MM時(shí),她自然會(huì)給你正確的包包啦!
明白了嗎?(要是還不明白就改行算了!你小子的天賦不在學(xué)計(jì)算機(jī)上~_~!)
問題2____新建項(xiàng)目(以VC.NET/6.0為例)
要想編譯一段API代碼,可以考慮走明星路線(我就是我生活中的明星,呵呵,說笑)
VC.NET
在新建項(xiàng)目中選擇"Win32項(xiàng)目"為模板,前提是你選擇Visual C++為項(xiàng)目類型
填了名字下一步后,停下,選擇應(yīng)用程序設(shè)置,給附加選項(xiàng)的空項(xiàng)目打上鉤
好了,你就可以隨心所欲了,每次看到這個(gè)界面,我就忍不住欲火焚身啊!(不要誤解,是寫程序的欲火)
我先在源文件里添加了一個(gè)Cpp文件,叫做first.cpp,為了讓你們爽下,帶碼也考給你們算了,要是覺得太簡單,不要K我啊!(我躲):
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HDC hdc;
HDC hdcmem;
HBITMAP hBm;
BITMAP bm;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
char lpszClassName[]=" ";
char lpszTitle[]="Example";
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
wndclass.hIcon=LoadIcon(NULL,IDC_ARROW);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=lpszClassName;
wndclass.lpszMenuName=0;
wndclass.style=0;
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_ USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,
hInstance,NULL);
hBm=LoadBitmap(hInstance,"tomato");
GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
hdcmem=CreateCompatibleDC(hdc);
ReleaseDC(hwnd,hdc);
case WM_PAINT:
//back=LoadBitmap(hInstance,
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdcmem,hBm);
BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
DeleteObject(hBm);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
然后我在資源文件里添加一個(gè).rc的文件(在添加新項(xiàng)里有),取名叫pic7.rc,接著雙擊pic7.rc就可以看到資源視圖,里面有個(gè)文件夾就叫pic7.rc,右擊,選擇添加資源,選擇Bitmap,再導(dǎo)入一張.bmp圖片(system32這個(gè)文件夾下這種圖片很多的),右擊導(dǎo)入的圖片,可以看到選項(xiàng)屬性,你把它的ID改為"tomato"(我隨便找了張tomato的圖片,你也可以把它定義為apple啊,或者banana啊什么的都行,只是你要在程序中改下它的名字就行了)好了,perfect!你運(yùn)行下看看,有了吧!
現(xiàn)在介紹API的書有,介紹VC.NET的書也有,就是沒有如何實(shí)際寫程序時(shí)改怎么用的書!連基本的操作都不交,程序就沒法編譯了,程序都沒法去驗(yàn)證,怎么叫人家繼續(xù)學(xué)下去呢?中國人注重理論知識(shí)一定要過硬,不過就我個(gè)人認(rèn)為還是老外的注重實(shí)際操作的學(xué)習(xí)方式更值得我們?nèi)ヌ岢?
問題3____數(shù)據(jù)類型
很多人搞不懂API里面"亂七八糟"的數(shù)據(jù)類型,哎呀,其實(shí)是你看的或?qū)懙奶俚木壒柿T了!
這個(gè)我不說了,雖然確實(shí)是個(gè)問題,不過有點(diǎn)腦子的人都知道,上網(wǎng)可以找嘛,真的很多的,要是真的找不到,沒辦法,問我好了(我的個(gè)人隱私QQ:275913977)
暫時(shí)想不到什么問題了,反正你只要知道程序的入口是int WINAPI WndMain(HINSTANCE,HINSTANCE,LPSTR,int){}
當(dāng)事件發(fā)生了,就要用到switch(message){case}結(jié)構(gòu)了,因?yàn)榘l(fā)生了不同的事件要用不同的方式去處理,這個(gè)過程是在函數(shù)LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)里執(zhí)行的,主要是(WndProc)!