WINDOWS程序設計 複習(1)

學習《WINDOWS程序》這本書,學的比較偷懶,好多程序沒手打。所以記憶不是很牢固,知識比較容易忘記,寫篇總結,正好可以讓自己重複記憶,以後也可以看自己的。

WINDOWS編程,UNICODE編碼,感覺沒有啥好記,可能是我學的不精吧。然後了我們開始記憶WINDOWS編程比較重要的窗口和消息回顧。

先回憶類和函數吧,WINDOWS裏面的類總是大寫,一開始我學的一楞一愣的,書上不知道是我看的不仔細,還是什麼,我感覺書寫類的比較分散。

typedef struct _WNDCLASS {
UINT style;// 窗口類型
WNDPROC lpfnWndProc;//窗口處理函數
int cbClsExtra;//窗口擴展
int cbWndExtra;//窗口實例擴展
HINSTANCE hInstance;//實例句柄
HICON hIcon;//窗口的最小化圖標
HCURSOR hCursor;//窗口鼠標光標
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜單
LPCTSTR lpszClassName;// 窗口類名
} WNDCLASS, *LPWNDCLASS;//窗口類結構

有了WNDCLASS類了,然後要對他註冊.使用

ATOM RegisterClass(  __in  CONST WNDCLASS *lpWndClass);
typedefWORD ATOM;
typedefunsigned shortWORD;
lpfn
如果函數成功,返回值是唯一標識已註冊的類的一個原子;如果函數失敗,返回值爲0
然後我們開始創建窗口(是窗口)
CreateWindow(szAppNname, //窗口類名稱
TEXT("The Hello Program"),//窗口標題
WS_OVERLAPPEDWINDOW,//窗口風格,或稱窗口格式
CW_USEDEFAULT,//初始x座標
CW_USEDEFAULT,//初始y座標
CW_USEDEFAULT,//初始x方向尺寸
CW_USEDEFAULT,//初始y方向尺寸
NULL,//父窗口菜單句柄
NULL,//窗口菜單句柄
hInstance,//程序實例句柄
NULL);//創建參數
創建完了之後對窗口進行顯示,可以多個窗口類對一個窗口進行創建,這也是爲什麼要弄個窗口要這麼麻煩。
BOOL ShowWindow(HWND hWnd, int nCmdShow);//左邊是窗口的句柄,右邊是一些參數用來控制窗口
typedef struct tagMSG
{
HWND hwnd;//表示消息所屬的窗口
UINT message;//message指定了消息的標識符
WPARM wParam;//很多意思
LPARAM lParam,//很多意思
DWORD time;//投遞到消息隊列中的時間
POINT pt;//鼠標位置
}MSG,*PMSG;

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);立即更新無效區域

如果想做出效果比較好的滾動,可以加入一些其他的結構結合。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章