Windows編程基礎
總結:
25號開始學習Windows編程基礎,MFC編程。Windows和MFS中的字符,和字符串理解的不好,基礎概念理解的也不好,下午看錄得視頻回顧,字符串得背,特別多,今天的重點就是MFC的編程,老師上課給的3個例子和兩個作業題,編程理解的還可以,都能做出來。剩余的時間多背背字符串。
基礎知識
1.API: 調用的函數集合就是windows操作系統提供給應用程序的編程接口
2.消息和消息隊列:
消息機制:操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序
????? typedef struct tagMSG
{??? HWND hwnd ??????????(窗口句柄)
?? UINT message;???????? (消息的名字)
?????? ?WPARAM wParam???? (消息的附加參數)
?????? ?LPARAM lParam;
?????? DWORD time;
?????? POINT pt;???????????? (發送消息的時間和位置)
?????? } MSG;
3.消息循環的處理過程:
MSG? msg;
While (GetMessage(&msg,NULL, 0,0))
{?? TranslateMessage(&msg);
??? DispatchMessage(&msg);
}
(1) GetMessage()函數不斷偵察應用程序的消息隊列,若隊列為空,則該函數一直運行,不返回;一旦發現隊列不為空,便取出一條消息,把它復制到msg結構變量中,同時該函數返回TRUE。
(2) 得到消息msg后,TranslateMessage()把來自鍵盤的命令翻譯成WM_XXX消息命令形式。
(3) DispatchMessage()函數通知Windows把每個消息分發給相應的窗口函數。應用程序并不直接調用窗口函數,而由Windows根據消息去調用窗口函數,因此,窗口函數經常被稱為回調函數。
4.句柄
句柄就是資源的標識,我們要索引這樣一個資源,就需要通過句柄去索引它。
5.編寫WinMain函數
Windows程序的入口 函數,WinMain函數頭內容:
int WINAPI WinMain
?????????????????? (
?????????? ?? HINSTANCE??? hInstance,????????? (應用程序句柄)
???? ??????????HINSTANCE??? hPrevInstance,????? (先前應用程序實例句柄)
?LPSTR????? lpCmdLine, ????????命令行參數
?int?? ?nCmdShow ???????????????顯示的狀態,最大化最小化
6.MFC編程
以C++類的形式封裝了Windows API。它可以使用1.VC++進行開發,并且是在使用VC++提供的各種向導的情況下的MFC編程。
7.事件與消息
-
產生消息的來源有三個:
?(1) 由操作系統產生;
?(2) 由用戶觸發的事件轉換而來;
?由另一個消息產生。
b) 事件:只能由用戶通過外設的輸入產生。
例題模板
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);
}
鼠標消息
~view.h中為視圖類的添加數據成員
????????? CString m_str;?? //顯示信息
????????? CPoint m_point;? //鼠標位置
void C例3MouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
?????? // TODO: Add your message handler code here and/or call default
?????? m_str.Format(_T("鼠標于(%d,%d)處按下"), point.x,point.y);
?????? m_point=point;
?????? Invalidate();? //調用重畫窗體命令,使系統自動調用OnDraw()顯示文字
?????? CView::OnLButtonDown(nFlags, point);
}
//CDC是CClientDC的基類
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鍵盤消息View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
?????? // TODO: Add your message handler code here and/or call default
?????? if(nChar == VK_RETURN)??? //如按下回車鍵
????? {??
????????????? m_str=_T("");
?????? ??????? m_nLine++;
????? }
?????? ?else
????????????? m_str+=TCHAR(nChar);?? //新行信息連接輸入字符
?????? CClientDC dc(this);??????? //獲取DC設備
?????? dc.TextOut(0,m_nLine*20,m_str);? //在m_nLine行顯示一行信息
?????? CView::OnChar(nChar, nRepCnt, nFlags);
}
注意:
WNDCLASS? 窗口類
Sln.??????? 工程文件
rc.???????? 資源文件
?