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

    去年自己参加了齐鲁软件大赛,刚开始学VC时虽然也曾化一些时间来看,但总觉得收获不大,经过一段时间的程序设计实践,到大赛结束时,对VC也有了一定的认识!

《深入浅出MFC》是本人一直想深读的一本书,寒假自己的特地好好看看了,现在回过头来看这些东西,觉得有了不少收获,或许这正是我喜欢这本书的原因所在,越读越有味道,越读越觉得书中的东西能够弥补自己的缺憾,这样的才算是真正的得到了阅读的乐趣吧。下面摘抄一些原文,并总结了一些学习心得,权当作一点小小的学习收获吧,也希望在写作和阅读的过程中获得更多的理解和体会。
    
我是刚从vcsdk编程过渡到这个MFC编程当中的,有些不适应,出了错误改起来很费力,打击了我不小的积极性,于是我苦思良久,看了看一下MFCCWnd类的函数表,关注到了这个函数--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编程中窗口函数中写法是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值