首先要寫類似於main函式的winmain,
int winapi winmain( hinstance hinstance,
hinstance hprevinstance,
lpstr lpcmdline,
int ncmdshow)
winapi是幹什麼的呢?它是呼叫宣告,相當於_stdcal。c++預設的呼叫宣告是_cdecl。兩者區別為:
_stdcal函式在結束後自己清棧,_cdecl由呼叫者(不是指人自己,指的是呼叫的程式)清棧。當函式引數個數可變的時候,只能_cdecl呼叫,在不知道個數的情況下,函式自己不知道怎麼清棧;不同的編譯器會按不同的方式堆疊,這樣會使得如果使用_cdecl宣告時,呼叫者不一定可以成功清棧。
(參考了
hinstance是windows為應用程式產生的例項控制代碼,可以看成這個就是程式的位址,跟蹤程式。
hprevinstance,現在已經不使用這個引數了。
lpcmdline,與main中的命令列差不多,基本寫程式時不用管。
ncmdshow,帶有如何開啟主應用程式視窗的資訊,比如最大化,最小化,一般用的多的是showwindow(),ncmd不怎麼用。
函式體怎麼寫呢?看看下面:
wndclas***是乙個類,因為你要建立乙個視窗,然後在上面輸入輸出操作,wndcls***可以看成乙個視窗類,而winclass可以看成例項(即變數),hwnd,msg,hdc在後面會講到,首先要做的是填winclass的各個屬性,後面的一大串全是設定屬性,比較重要的是 winclass.style,它指出了視窗的重要屬性,如視窗寬度變化後會重畫,高度變化後會重畫,剩下的引數查msdn就知道了。
然後你需要去註冊這個類,
if (!registerclas***(&winclass))
return(0);
外面的if,當沒註冊成功就返回0,防止程式沒註冊成功,往下執行出現未知的錯誤。
然後就是建立乙個視窗,
createwindowex()會返回乙個指向視窗的的控制代碼,相當於它的位址。
上面的一系列都可以直接複製張貼,根據需要,改一改屬性即可,然後我一般會編乙個迴圈,去處理訊息。
while(true)
// end if
} // end while
return(msg.wparam);
}其中if (peekmessage(&msg,null,0,0,pm_remove))
理解成先判斷有沒有訊息,有的話就傳遞給相應的程式處理,訊息可以使單擊滑鼠左鍵,關閉視窗等。
之後return,就寫好主函式。
除了主函式還需要寫乙個訊息處理函式,每個視窗都有乙個視窗處理函式,而關聯兩者,就是在設定視窗屬性時的winclass.lpfnwndproc= windowproc,windowproc是處理函式的名字,當視窗有相應的訊息的時候,就會呼叫處理函式處理.下面是乙個視窗處理函式:
lresult callback windowproc(hwnd hwnd,
uint msg,
wparam wparam,
lparam lparam)
break;
case wm_paint:
break;
case wm_destroy:
break;
default:break;
} return (defwindowproc(hwnd, msg, wparam, lparam));
} 首先看一下函式的引數,hwnd 是呼叫視窗的控制代碼,便於對視窗操作,msg有訊息型別的資訊,wparam,lparam包含具體訊息的細節。
總之其實上面的都可以直接複製張貼,至於該怎麼操作只需要改一下處理函式,還有在while迴圈裡做些填充。
建立乙個win32視窗程式
include stdafx.h 2hinstance g hinst null 3 視窗處理函式 lresult callback wndproc hwnd hwnd,視窗控制代碼 uint nmsg,視窗訊息id wparam wparam,訊息傳來的兩個引數 lparam lparam 返回預...
第乙個Win32程式
第乙個win32視窗.cpp 定義應用程式的入口點。include stdafx.h include 第乙個win32視窗.h include include stdio.h hwnd hwnd pchar szoutbuff lresult callback wndproc hwnd hwnd,u...
建立Win32視窗程式
建立win32視窗程式的步驟 建立win32視窗程式 int winapi winmain hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,int nshowcmd 構造視窗 winmain wndclas wndclass w...