API學習經驗之談___1
問題1____句柄
相信這個"東西"足以讓各位朋友郁悶很長一段實際在"云里霧里"中(小生可能更嚴重)
其實,這是一個最不足以讓你去深究的東西,先聽聽"大師級人物"(個人認為)羅云彬老師在<<Windows 環境下32位匯編語言程序設計>>(好書啊!~_~)一書中對它的定義:
句柄只是一個數值而已,它的值對程序來說是沒什么有意義的,它只是Windows用來表示資源的編號而已,所以只有Windows才知道怎么使用它來引用各種資源!
明白了嗎?(鬼才明白~_~!)
好,舉例來說,屏幕上已經有10個窗口,Windows把他們從1道10編號,應用程序又建立了一個窗口,現在Windows把它編號位11,然后把11當做窗口句柄返回個應用程序,應用程序并不知道11代表的是什么,但在操作窗口的時候,把11當作句柄傳給Windows,Windows自然可以根據這個數值查出是哪個窗口.當該窗口關閉的時候,11這個編號就作廢了.第二次運行的時候,如果屏幕上又有5個窗口,那么現在句柄可能就是6了,所以,應用程序不用關心句柄的具體數值是多少.打個比方,可以把句柄當做是商場中寄放包包時營業員MM給的紙條,紙條上的標號代表什么,用戶不用去了解,但把它給營業員MM時,她自然會給你正確的包包啦!
明白了嗎?(要是還不明白就改行算了!你小子的天賦不在學計算機上~_~!)
問題2____新建項目(以VC.NET/6.0為例)
要想編譯一段API代碼,可以考慮走明星路線(我就是我生活中的明星,呵呵,說笑)
VC.NET
在新建項目中選擇"Win32項目"為模板,前提是你選擇Visual C++為項目類型
填了名字下一步后,停下,選擇應用程序設置,給附加選項的空項目打上鉤
好了,你就可以隨心所欲了,每次看到這個界面,我就忍不住欲火焚身啊!(不要誤解,是寫程序的欲火)
我先在源文件里添加了一個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;
}
然后我在資源文件里添加一個.rc的文件(在添加新項里有),取名叫pic7.rc,接著雙擊pic7.rc就可以看到資源視圖,里面有個文件夾就叫pic7.rc,右擊,選擇添加資源,選擇Bitmap,再導入一張.bmp圖片(system32這個文件夾下這種圖片很多的),右擊導入的圖片,可以看到選項屬性,你把它的ID改為"tomato"(我隨便找了張tomato的圖片,你也可以把它定義為apple啊,或者banana啊什么的都行,只是你要在程序中改下它的名字就行了)好了,perfect!你運行下看看,有了吧!
現在介紹API的書有,介紹VC.NET的書也有,就是沒有如何實際寫程序時改怎么用的書!連基本的操作都不交,程序就沒法編譯了,程序都沒法去驗證,怎么叫人家繼續學下去呢?中國人注重理論知識一定要過硬,不過就我個人認為還是老外的注重實際操作的學習方式更值得我們去提倡啊!
問題3____數據類型
很多人搞不懂API里面"亂七八糟"的數據類型,哎呀,其實是你看的或寫的太少的緣故罷了!
這個我不說了,雖然確實是個問題,不過有點腦子的人都知道,上網可以找嘛,真的很多的,要是真的找不到,沒辦法,問我好了(我的個人隱私QQ:275913977)
暫時想不到什么問題了,反正你只要知道程序的入口是int WINAPI WndMain(HINSTANCE,HINSTANCE,LPSTR,int){}
當事件發生了,就要用到switch(message){case}結構了,因為發生了不同的事件要用不同的方式去處理,這個過程是在函數LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)里執行的,主要是(WndProc)!