您的位置:首页 > 编程语言

MFC编程学习心得 计科0702 彭志勋

2010-03-09 13:42 337 查看
去年自己参加了齐鲁软件大赛,刚开始学VC时虽然也曾化一些时间来看,但总觉得收获不大,经过一段时间的程序设计实践,到大赛结束时,对VC也有了一定的认识!
《深入浅出MFC》是本人一直想深读的一本书,寒假自己的特地好好看看了,现在回过头来看这些东西,觉得有了不少收获,或许这正是我喜欢这本书的原因所在,越读越有味道,越读越觉得书中的东西能够弥补自己的缺憾,这样的才算是真正的得到了阅读的乐趣吧。下面摘抄一些原文,并总结了一些学习心得,权当作一点小小的学习收获吧,也希望在写作和阅读的过程中获得更多的理解和体会。
我是刚从vc的sdk编程过渡到这个MFC编程当中的,有些不适应,出了错误改起来很费力,打击了我不小的积极性,于是我苦思良久,看了看一下MFC的CWnd类的函数表,关注到了这个函数--WindowProc,这个函数是cwnd类的一个虚函数,功能就是处理窗口的消息的,跟sdk编程中的窗口消息函数是一回事,写法大同小异,用这个方法写的程序,开发效率要快很多呢(对于MFC的初学者),下面我来介绍一下吧。
我的开发环境是Microsoft Visual C++ 6.0;
选择WIN32 Application工程建一个空的工程,然后加一个.cpp文件,关键的一部是alt—f7打开settings选项,在general选项中的MICROSOFT foundation classes选项中选择use MFC in a static library,这样就可以在这个工程中使用MFC基础类库编程了,这样可以大大的提高编程的效率,减小了出错的几率。
大家都知道MFC工程中有界面的程序肯定有两个类,一个是CWND类,另一个就是应用程序类CWINAPP类,所以今天讲那这两个类写程序例子(很基础的,但是很关键).
定义一个类,是CWINAPP类的派生类,写法是这样的大家看代码吧。
大家可以把下面的类定义写在一个头文件里,留着备用。
class CMyApp::public CWinApp
{
public:
virtual BOOL InitInstance(); //这个类中就这一个函数,他的作用就是创建一个CWnd 类的一个,大家笼统的就这么理解吧,关键还是看代码去理解吧。
};
下面在定义个CWND类的派生类:
class CMyWnd::public CWnd
{
public:
CMyWnd(); //这个函数是构造函数,一些东西要在这里初始化呢
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam ); //今天的主角就是这个函数了
}
在添加一个.cpp文件吧;下面就是这些类函数的实现代码了,在.cpp文件中写的
现看看CWyApp类中的InitInstance函数吧;
最先定义一个CMyApp类的对象:
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd=new CMyWnd;
::ShowWindow(*m_pMainWnd,this->m_nCmdShow);
::UpdateWindow(*m_pMainWnd);
return TRUE; //这个函数就这样完成了,三行代码,很简单,主要是显示窗口,更新窗口重头戏在后面呢!
}
CMyWnd::CMyWnd()
{
LPCTSTR lpszClassName=AfxRegisterWndClass(CS_HREDRAW |CS_VREDRAW,::LoadCursor(NULL,IDC_ARROW), //注册窗口
(HBRUSH)(COLOR_3DFACE+1)); //注册窗口
CreateEx(WS_EX_CLIENTEDGE,lpszClassName,"新的开始",
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0); //创建窗口

}
关键的代码就是下面的这段,可以是说一个窗口的消息函数,所有的消息都要在这个函数中处理,和SDK编程中的消息写法一样,不用象在MFC中那样添加消息映射了,理解起来很方便,很直观。
LRESULT CMyWnd::WindowProc(UINT message,WPARAM wParam,LPARAM lparam)// 这个函数相当于WinMain函数中的窗口函数
{
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
{
::SetWindowText(m_hWnd,"hello First WND");
::CreateWindowEx(0,"button","测试",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,50,50,110,30,m_hWnd,
(HMENU)IDB_BUTTON,AfxGetApp()->m_hInstance,0);
break;
}
case WM_COMMAND: // 这个消息是用来接收控件发送来的消息的,
{
switch (LOWORD(wParam))
{
case IDB_BUTTON: //我们的按钮控件的ID
{
//::SendMessage(m_hWnd,WM_CLOSE,0,0); //测试只用
HWND findwnd=::FindWindow(NULL,"你要找的窗口的名字"); //返回你要找的窗口的窗口句柄
::SetWindowText(findwnd,"text"); //设置你要找的窗口的名字
break;
}
}
break;
}
case WM_NCDESTROY:
{
::PostQuitMessage(0);
//delete this; //不注释会出错的
break;
}
case WM_PAINT: //窗口重画是调用这个函数
{
hdc=::BeginPaint(m_hWnd,&ps);
::TextOut(hdc,50,50,"hello First WND",strlen("hello First WND"));
break;
}
case WM_CLOSE: //窗口关闭时调用这个消息
{
int confirm;
confirm=::MessageBox(NULL,"确定关闭么"," ",MB_YESNO|MB_ICONQUESTION);

break;
}

}
return Default(); //交给系统处理
} //CWND类的WindowProc函数给重载了,然后就像在SDK编程中窗口函数中写法是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: