Windows編程基礎(chǔ)
總結(jié):
25號(hào)開(kāi)始學(xué)習(xí)Windows編程基礎(chǔ)诵棵,MFC編程。Windows和MFS中的字符祝旷,和字符串理解的不好非春,基礎(chǔ)概念理解的也不好柱徙,下午看錄得視頻回顧缓屠,字符串得背奇昙,特別多,今天的重點(diǎn)就是MFC的編程敌完,老師上課給的3個(gè)例子和兩個(gè)作業(yè)題储耐,編程理解的還可以,都能做出來(lái)滨溉。剩余的時(shí)間多背背字符串什湘。
基礎(chǔ)知識(shí)
1.API: 調(diào)用的函數(shù)集合就是windows操作系統(tǒng)提供給應(yīng)用程序的編程接口
2.消息和消息隊(duì)列:
消息機(jī)制:操作系統(tǒng)將每個(gè)事件都包裝成一個(gè)稱為消息的結(jié)構(gòu)體MSG來(lái)傳遞給應(yīng)用程序
????? typedef struct tagMSG
{??? HWND hwnd ??????????(窗口句柄)
?? UINT message;???????? (消息的名字)
?????? ?WPARAM wParam???? (消息的附加參數(shù))
?????? ?LPARAM lParam;
?????? DWORD time;
?????? POINT pt;???????????? (發(fā)送消息的時(shí)間和位置)
?????? } MSG;
3.消息循環(huán)的處理過(guò)程:
MSG? msg;
While (GetMessage(&msg,NULL, 0,0))
{?? TranslateMessage(&msg);
??? DispatchMessage(&msg);
}
(1) GetMessage()函數(shù)不斷偵察應(yīng)用程序的消息隊(duì)列晦攒,若隊(duì)列為空闽撤,則該函數(shù)一直運(yùn)行,不返回脯颜;一旦發(fā)現(xiàn)隊(duì)列不為空哟旗,便取出一條消息,把它復(fù)制到msg結(jié)構(gòu)變量中栋操,同時(shí)該函數(shù)返回TRUE闸餐。
(2) 得到消息msg后,TranslateMessage()把來(lái)自鍵盤(pán)的命令翻譯成WM_XXX消息命令形式矾芙。
(3) DispatchMessage()函數(shù)通知Windows把每個(gè)消息分發(fā)給相應(yīng)的窗口函數(shù)舍沙。應(yīng)用程序并不直接調(diào)用窗口函數(shù),而由Windows根據(jù)消息去調(diào)用窗口函數(shù)剔宪,因此拂铡,窗口函數(shù)經(jīng)常被稱為回調(diào)函數(shù)。
4.句柄
句柄就是資源的標(biāo)識(shí)葱绒,我們要索引這樣一個(gè)資源感帅,就需要通過(guò)句柄去索引它。
5.編寫(xiě)WinMain函數(shù)
Windows程序的入口 函數(shù),WinMain函數(shù)頭內(nèi)容:
int WINAPI WinMain
?????????????????? (
?????????? ?? HINSTANCE??? hInstance,????????? (應(yīng)用程序句柄)
???? ??????????HINSTANCE??? hPrevInstance,????? (先前應(yīng)用程序?qū)嵗浔?
?LPSTR????? lpCmdLine, ????????命令行參數(shù)
?int?? ?nCmdShow ???????????????顯示的狀態(tài)哈街,最大化最小化
6.MFC編程
以C++類(lèi)的形式封裝了Windows API留瞳。它可以使用1.VC++進(jìn)行開(kāi)發(fā),并且是在使用VC++提供的各種向?qū)У那闆r下的MFC編程骚秦。
7.事件與消息
-
產(chǎn)生消息的來(lái)源有三個(gè):
?(1) 由操作系統(tǒng)產(chǎn)生她倘;
?(2) 由用戶觸發(fā)的事件轉(zhuǎn)換而來(lái);
?由另一個(gè)消息產(chǎn)生作箍。
b) 事件:只能由用戶通過(guò)外設(shè)的輸入產(chǎn)生硬梁。
例題模板
HelloWorld
void C例2HelloWorldView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
?????? CString str(_T("HelloWorld"));
?????? MessageBox(str);
?????? CView::OnLButtonDown(nFlags, point);
}
鼠標(biāo)消息
~view.h中為視圖類(lèi)的添加數(shù)據(jù)成員
????????? CString m_str;?? //顯示信息
????????? CPoint m_point;? //鼠標(biāo)位置
void C例3MouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
?????? // TODO: Add your message handler code here and/or call default
?????? m_str.Format(_T("鼠標(biāo)于(%d,%d)處按下"), point.x,point.y);
?????? m_point=point;
?????? Invalidate();? //調(diào)用重畫(huà)窗體命令,使系統(tǒng)自動(dòng)調(diào)用OnDraw()顯示文字
?????? CView::OnLButtonDown(nFlags, point);
}
//CDC是CClientDC的基類(lèi)
void C例3MouseMsgView::OnDraw(CDC* pDC)
{????? … …
?????? // TODO: add draw code for native data here
?? //在m_point位置輸出信息
?????? pDC->TextOutW(m_point.x,m_point.y,m_str);
}
OnChar
void C例4鍵盤(pán)消息View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
?????? // TODO: Add your message handler code here and/or call default
?????? if(nChar == VK_RETURN)??? //如按下回車(chē)鍵
????? {??
????????????? m_str=_T("");
?????? ??????? m_nLine++;
????? }
?????? ?else
????????????? m_str+=TCHAR(nChar);?? //新行信息連接輸入字符
?????? CClientDC dc(this);??????? //獲取DC設(shè)備
?????? dc.TextOut(0,m_nLine*20,m_str);? //在m_nLine行顯示一行信息
?????? CView::OnChar(nChar, nRepCnt, nFlags);
}
注意:
WNDCLASS? 窗口類(lèi)
Sln.??????? 工程文件
rc.???????? 資源文件
?