學習《WINDOWS程序》這本書,學的比較偷懶,好多程序沒手打。所以記憶不是很牢固,知識比較容易忘記,寫篇總結,正好可以讓自己重複記憶,以後也可以看自己的。
WINDOWS編程,UNICODE編碼,感覺沒有啥好記,可能是我學的不精吧。然後了我們開始記憶WINDOWS編程比較重要的窗口和消息回顧。
先回憶類和函數吧,WINDOWS裏面的類總是大寫,一開始我學的一楞一愣的,書上不知道是我看的不仔細,還是什麼,我感覺書寫類的比較分散。
有了WNDCLASS類了,然後要對他註冊.使用
ATOM
RegisterClass( __in CONST WNDCLASS *lpWndClass);
typedef
WORD
ATOM
;
typedef
unsigned
short
WORD
;
lpfn
while(GetMessage(&msg,NULL,0,0))//對消息進行檢索
{
TranslaeMessage(&msg);//用於將虛擬鍵消息轉換爲字符消息。
DispatchMessage(&msg);//該函數分發一個消息給窗口程序
}
消息有分爲隊列消息與非隊列消息
隊列消息:使用者輸入結果(輸入有很多形式,比如鼠標,按鍵),也有時鐘消息,退出消息
非隊列消息:調用特特定函數
先列出一些,常用的消息,其他的慢慢複習的出來
WM_CREATE///第一次創建窗口會調用
WM_SIZE//客戶區大小改變是調用,還有窗口第一次顯示也調用
WM_SIZE//關閉程序
下面來說文本輸出
嗯,先說一下消息吧,文本輸出很多都是在WM_PAINT裏面,然後當圖形重新繪製的時候涉及到2個概念,
有效矩形//不需要重新繪製的區域
無效矩形//需要重新繪製的區域
如何判斷是否需要重新繪製了,可以用InvaliddateRect(HWND hWnd,CONST RECT *lpRect,BOOL bFrase);
hWnd//表示所要重繪的窗體句柄
lpRect//表示重繪區域的結構體指針,NULL就是客戶區
bFrase//true重新繪製背景false不重新繪製
進入下階段吧,獲取環境句柄
第一種方法hdc=BeginPaint(hwnd,&ps);
//添加你需要的東西吧
EndPaint(hwnd,&ps);
第二種方法hdc=Get(hwnd);
//添加你需要的東西
ReleaseDC(hwnd,hdc);
先分析第一種方法,hwnd窗口句柄,&ps是一個名爲PAINSTRUCT的結構具體如下
typedef struct tagPAINSTRUCT
{
HDC hdc;//設別環境句柄
BOOL fEerase;//設置爲0,意味着Windows在先前的BeginPaint函數中已經擦除了無效區域的背景
RECT rcPaint;//一個無效矩形,同時也是裁剪區域
BOOL fRestore;//系統 一般用不到
BOOL fInUpdate;//系統 一般用不到
BYTE rgbReserved[32];//系統 一般用不到
}PAINTSTURCT;
第一種與第二種的很重要的一個區別,給出書上2種需求說法
第一種:這種方法可以再處理WM_PAINT消息時使用
第二種:儘管最好讓程序處理WM_PAINT消息是才更新整個客戶區,但有時也會發現在處理非WM_PAITN消息繪製部分客戶去也是有用的
如果使用第一種,使用完了就完了,但是使用第2種使用完了,會到WM_PAINT消息裏面去
開始文本輸出
TextOut(hdc,x,y,psText,iLength);//很明顯的參數說明吧
至於像素神馬的,我們下次再一起復習吧。
文本輸出,字體這個很蛋疼的東西是需要複習的。
typedef struct tagTEXTMETRIC
{
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLead;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
//只關注前7個
}TEXTMETRIC,*PTEXTMETRIC
以上貌似也就夠了。。。
然後就到了一個比較具體的東西了,就是滾動條。
我們先是說下按鍵消息吧
設置函數可以用SetScrollPos(hwnd,iBar,iPos,bRedraw);
用UpdateWindow(hwnd);立即更新無效區域
如果想做出效果比較好的滾動,可以加入一些其他的結構結合。