Windows MFC编程入门——应用程序框架

 一、SDK应用程序与MFC应用程序运行过程对比

  程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain。MFC程序也是从这个入口开始的。Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行开发。

  下面就是SDK应用程序示例

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";
    
    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

 上面的程序运行的流程是:进入WinMain函数->初始化WNDCLASS,调用RegisterClass函数注册窗口类->调用CreateWindowEx函数->调用ShowWindow显示窗口->进入消息循环。关于消息循环再简单说下,Windows应用程序是消息驱动的,系统或用户让应用程序进行某项操作或完成某个任务时会发送消息,进入程序的消息队列,然后消息循环会将消息队列中的消息取出,交予相应的窗口过程处理,此程序的窗口过程函数就是myWndProc函数,窗口过程函数处理完消息就完成了某项操作或任务。

  1. 设计窗口
  2. 注册窗口
  3. 创建窗口
  4. 显示和更新
  5. 通过循环取消息
  6. 处理消息(窗口过程)

WINAPI在我环境下被定义为__stdcall  ,即参数的传递顺序:参数列表从右到左依次入栈,并在函数返回前清空堆栈

MFC应用程序:编写MFC程序需要包含#include<afxwin.h>头文件

自己创建MFC应用程序框架:自定义类继承自CWinApp应用程序类,创建MyApp app应用程序对象(有且只有一个)。程序入口为InitInstance()函数。在程序入口函数中创建自定义框架类(MyFrame继承自CFrameWnd)。在MyFrame类构造函数中创建窗口Create。显示更新窗口并保存框架类对象指针。

使用应用程序向导生成单文档应用程序框架:

消息映射是一个将消息和成员函数相互关联的表。比如,框架窗口接收到一个鼠标左击消息,MFC将搜索该窗口的消息映射,如果存在一个处理WM_LBUTTONDOWN消息的处理程序,然后就调用OnLButtonDown。

将消息映射添加到一个类中所做的全部工作:

1)在所操作类中,声明消息映射宏

2)通过放置标识消息的宏来执行消息映射,相应的类将在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。

3)对应消息处理函数分别在类中声明,类外定义

发布了134 篇原创文章 · 获赞 141 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/80100507