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

目录
相关文章
|
缓存 异构计算 Perl
【毅力挑战】PCIe 每日一问一答(2022.04 归档)
【毅力挑战】PCIe 每日一问一答(2022.04 归档)
4212 3
【毅力挑战】PCIe 每日一问一答(2022.04 归档)
|
SQL 缓存 Java
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
|
机器学习/深度学习 人工智能 自然语言处理
《AI与NLP:开启元宇宙社交互动新纪元》
元宇宙正从概念走向现实,社交互动成为其核心魅力。AI与NLP技术的迅猛发展,使自然语言交互、个性化体验和情感交流成为可能,打破了沟通壁垒,满足多元需求,并赋予社交温度。实时翻译技术支持跨语言交流,构建全球社交网络。尽管仍面临挑战,未来前景广阔,将带来更加真实、高效的虚拟社交体验。
297 6
|
机器学习/深度学习 运维 资源调度
深度学习在资源利用率优化中的应用:让服务器更聪明
深度学习在资源利用率优化中的应用:让服务器更聪明
564 6
|
安全 Java Go
Go语言有哪些优势
【10月更文挑战第10天】Go语言有哪些优势
568 0
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
386 2
|
存储 缓存 网络协议
linux各个目录的作用
本文源自天翼云开发者社区,作者技术小白,介绍了Linux中多个关键目录的用途:/bin/和/sbin/存放可执行命令,前者单用户模式也可用;/usr/bin/和/usr/sbin/同样存放命令,但非系统必备;/boot/存储启动文件;/dev/为设备文件;/etc/配置文件的家;/home/是普通用户的主目录;/lib/包含系统库;/lost+found/用于恢复文件系统;/media/和/mnt/是挂载点,前者用于媒体设备,后者用于额外设备;/opt/存储第三方软件;/proc/和/sys/提供系统和内核信息;/root/是超级用户家目录。
342 3
|
弹性计算 自然语言处理 Windows
通义灵码 Visual Studio 下载安装指南(附安装包)
本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。
137098 21
|
JavaScript
vue拖拽 —— vuedraggable 表格拖拽行
vue拖拽 —— vuedraggable 表格拖拽行
881 1