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. 资源文件