MFC窗口创建机制

简介: MFC窗口创建机制

一、重写父类的成员虚函数


1、在应用程序框架中声明虚函数InitApplication()


class CMyWinApp : public CWinApp
{
public:
    CMyWinApp();
    virtual BOOL InitInstance();
    virtual BOOL InitApplication();
    virtual int Run();
    virtual BOOL OnIdle(LONG ICount);
    virtual int ExitInstance();
};


2、重写该方法


int CMyWinApp::ExitInstance()
{
    AfxMessageBox("善后处理");
    return CWinApp::ExitInstance();
}
BOOL CMyWinApp::OnIdle(LONG ICount)
{
    //AfxMessageBox("空闲处理");//死循环
    return CWinApp::OnIdle(ICount);
}
int CMyWinApp::Run()
{
    CWinApp::Run();
    AfxMessageBox("消息循环");
    return 0;
}
BOOL CMyWinApp::InitApplication()
{
    AfxMessageBox("初始化");
    return CWinApp::InitApplication();
}


运行结果:


先弹窗初始化,再弹窗善后处理,再弹窗消息新欢



二、窗口创建


BOOL CMyWinApp::InitInstance()
{//此函数中的this为&theApp
    CMyFrameWnd* pFrame = new CMyFrameWnd;
    pFrame->Create(NULL, "测试");
    this->m_pMainWnd = pFrame;
    //pFrame->ShowWindow(SW_SHOW);//相当于下面的语句
    ::ShowWindow(pFrame->m_hWnd, SW_SHOW);
    //pFrame->UpdateWindow();相当于下面的语句
    ::UpdateWindow(pFrame->m_hWnd);
    return TRUE;
}


运行结果:


0a2653c851af460fa595bd959398a8f1.png


三、创建窗口处理函数


class CMyFrameWnd : public CFrameWnd
{
public:
    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); //声明虚函数
};
//实现虚函数
LRESULT CMyFrameWnd::WindowProc(
    UINT message, WPARAM wParam, LPARAM lParam)
{//此函数的this为pFrame
    switch (message) {
    case WM_CREATE:
        AfxMessageBox("WM_CREATE消息被处理");
        break;
    case WM_PAINT:
    {
        PAINTSTRUCT ps = { 0 };
        HDC hdc = ::BeginPaint(this->m_hWnd, &ps);
        ::TextOut(hdc, 100, 100, "hello", 5);
        ::EndPaint(this->m_hWnd, &ps);
    }
   
    }
    return CFrameWnd::WindowProc(message, wParam, lParam);
}

运行结果:


0eacb84100b54626af849e6b562bf92a.png


四、跟随鼠标移动,鼠标到那,创建的窗口到那


关键代码


class CMyFrameWnd : public CFrameWnd
{
public:
    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    int m_x;
    int m_y;
};
case WM_MOUSEMOVE:
    {
        m_x = LOWORD(lParam);//wParam传递的是否按左键右键ctrl等键
        m_y = HIWORD(lParam);
        ::InvalidateRect(this->m_hWnd, NULL, TRUE);//重画
    }

2d65d23f6d4748949b924e4057485923.png

目录
相关文章
|
7月前
Qt3个窗口类的区别
一个普通的窗口,不包含菜单栏、状态栏,除了登录界面,新建项目时建议使用QWidget,因为大部分的窗口可能都要做成无边框窗口,需要自定义标题栏,实现拉伸等;QMainWindow使用的场景不多。:对话框,常用来做登录窗口、弹出窗口(例如设置界面):包含菜单栏、工具栏、状态栏。
65 0
10 MFC - 对话框应用程序框架介绍
10 MFC - 对话框应用程序框架介绍
103 0
|
6月前
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
94 0
|
C++ Windows
09 MFC - 创建基于对话框的 MFC 应用程序框架
09 MFC - 创建基于对话框的 MFC 应用程序框架
100 0
|
7月前
MFC应用程序对话框架构
MFC应用程序对话框架构
41 0
|
7月前
MFC的视图窗口
MFC的视图窗口
42 0
|
编译器 API 开发工具
Windows编程基础,第一个Windows程序,注册窗口,创建窗口(上)
Windows编程基础,第一个Windows程序,注册窗口,创建窗口
Windows编程基础,第一个Windows程序,注册窗口,创建窗口(下)
Windows编程基础,第一个Windows程序,注册窗口,创建窗口
MFC窗口创建机制
MFC窗口创建机制
98 0
MFC窗口创建机制
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
395 0