C++学习:浅谈MFC |

  • A+
所属分类:Seay信息安全博客

显示不全请点击全屏阅读

API:Application Program Interface
Windows操作系统留给了我们两种接口,一种是用户接口(例如我们桌面的图标,可以方便用户取得系统的服务)。另一种是程序接口(通过一个个的API函数来实现和操作系统的交互)主要是面向程序员。
MFC:Microsoft Foundtion Class
MFC是微软把大部分的API函数给我们封装了,更方便我们编程。体验过Windows程序设计的都知道,它是相当复杂繁琐的。其中的许多过程都是重复的,比如窗口的创建,窗口的注册,窗口更新。如果把这些函数封装起来,可以减轻程序编写的工作量,提高效率。于是就有了MFC。
但是不论MFC编程,还是WIN32 SDK编程,都是基于消息,因此全面深刻的理解Windows的消息机制是进行Windows程序设计的基础。
下面的这段代码是一个简单的窗口类,它封装了CreateWindowEx,ShowWindow,UpdateWindow。可以帮助理解MFC是如何对API函数进行封装的。

/*—————————————————
   CWnd.c  — MFC program Demo
                 (c++) sixing, 2012.7.15
  —————————————————*/
#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(//回调函数
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

class CWnd  //窗口类,封装了窗口的创建,显示,更新3个API函数
{
public:
        BOOL CreateEx(DWORD dwExStyle,
                        LPCTSTR lpClassName,
                                LPCTSTR lpWindowName,
                                DWORD dwStyle,
                                int x,
                                int y,
                                int nWidth,
                                int nHeight,
                                HWND hWndParent,
                                HMENU hMenu,
                                HINSTANCE hInstance,
                                LPVOID lpParam);
    BOOL ShowWindow(int nCmdShow);  //这两个函数不在需要句柄参数,因为在类中定义了
        BOOL UpdateWindow();            //HWND m_hWnd,可以共用。
public:
        HWND m_hWnd;
};

BOOL CWnd::CreateEx(DWORD dwExStyle,
                        LPCTSTR lpClassName,
                                LPCTSTR lpWindowName,
                                DWORD dwStyle,
                                int x,
                                int y,
                                int nWidth,
                                int nHeight,
                                HWND hWndParent,
                                HMENU hMenu,
                                HINSTANCE hInstance,
                                LPVOID lpParam)
{
        m_hWnd=CreateWindowEx(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,
                                        nWidth,nHeight,hWndParent,hMenu,hInstance,
                                        lpParam);
        if(m_hWnd!=NULL)
                return TRUE;
        else
                return FALSE;

}

BOOL CWnd::ShowWindow(int nCmdShow)
{
        return ::ShowWindow(m_hWnd,nCmdShow);
}

BOOL CWnd::UpdateWindow()
{
        return ::UpdateWindow(m_hWnd);
}

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
        WNDCLASS wndcls;
        wndcls.cbClsExtra=0;
        wndcls.cbWndExtra=0;//两个额外的数值
        wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口客户区的颜色
        wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//加载光标
        wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//加载图标
        wndcls.hInstance=hInstance;//程序的实例
        wndcls.lpfnWndProc=WinSunProc;//指向回调函数
        wndcls.lpszClassName=”sixing”;//窗口的名字
        wndcls.lpszMenuName=NULL;//指向要调用的菜单地址
        wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的风格,发生水平和垂直改变时重新绘制窗口

        RegisterClass(&wndcls);

        CWnd wnd;
        wnd.CreateEx(WS_EX_ACCEPTFILES,”sixing”,”思行”,WS_OVERLAPPEDWINDOW,//创建窗口
                0,0,600,400,NULL,NULL,hInstance,NULL);
        wnd.ShowWindow(SW_SHOWNORMAL);
        wnd.UpdateWindow();

        MSG msg;//定义消息结构体
        while(GetMessage(&msg,NULL,0,0))//设定消息循环
        {
                TranslateMessage(&msg);//把消息进行转换,如把WM_KEYDOWN,WM_KEYUP转换成WM_CHAR消息
                DispatchMessage(&msg);//向应用程序投递消息
        }
        return 0;
}

LRESULT CALLBACK WinSunProc(//回调函数
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
        switch(uMsg)
        {
        case WM_CHAR://程序接受的键盘消息时显示按下键的ASCII码值
                TCHAR szChar[20];
                wsprintf(szChar,”char is %d”,wParam);
                MessageBox(hwnd,szChar,”思行”,0);
                break;
        case WM_LBUTTONDOWN://左键按下消息
                MessageBox(hwnd,”mouse clicked”,”思行”,0);
                HDC hdc;
                hdc=GetDC(hwnd);//获取设备环境句柄,向客户区显示内容时
                TextOut(hdc,0,50,”努力学习软件设计技术”,strlen(“努力学习软件设计技术”));
                ReleaseDC(hwnd,hdc);//释放设备环境句柄,必须有
                break;
        case WM_PAINT://窗口重绘消息
                HDC hDC;
                PAINTSTRUCT ps;
                hDC=BeginPaint(hwnd,&ps);//获取设备环境句柄
                TextOut(hDC,0,0,”多抽出一分钟学习 生命更加精彩”,strlen(“多抽出一分钟学习 生命更加精彩”));
                EndPaint(hwnd,&ps);//释放设备环境句柄,必须有
                break;
        case WM_CLOSE://窗口关闭消息
                if(IDYES==MessageBox(hwnd,”是否真的结束?”,”weixin”,MB_YESNO))
                {
                        DestroyWindow(hwnd);//会产生销毁窗口的消息WM_DESTROY
                }
                break;
        case WM_DESTROY://窗口销毁消息
                PostQuitMessage(0);
                break;
        default://对于程序不关心的消息默认的归宿
                return DefWindowProc(hwnd,uMsg,wParam,lParam);
        }
        return 0;
}

Tags:

C++资料,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡
C++学习:浅谈MFC |