Win32 多文档多视图

#include<Windows.h>
#include<tchar.h>
#include"resource.h"


//全局变量
LPSTR g_MainFrame = "主框架";
LPSTR  g_ClientFrame = "客户区框架";
LPSTR g_ChildFrame[] = { "子框架1","子框架2" };

//主窗口和子窗口回调函数,本程序子窗口公用一个子窗口回调函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

//函数执行的入口函数
int WINAPI WinMain(
    _In_         HINSTANCE hInstance,
    _In_opt_  HINSTANCE hPrevInstance,
    _In_         LPSTR lpCmdLine,
    _In_         int nShowCmd)
{

    //1.初始化需要注册的窗口信息
    WNDCLASS MainFrame = { 0 };
    MainFrame.hbrBackground = (HBRUSH)::GetStockObject(GRAY_BRUSH);//背景
    MainFrame.hCursor = ::LoadCursor(NULL, IDC_ARROW);
    MainFrame.hInstance = hInstance;
    MainFrame.lpfnWndProc = WndProc;
    MainFrame.lpszClassName = g_MainFrame;
    MainFrame.lpszMenuName = MAKEINTRESOURCE(IDR_MainFrame);//主菜单ID
    MainFrame.style = CS_VREDRAW | CS_HREDRAW;

    //2.注册MainFrame窗口类
    if (!RegisterClass(&MainFrame))
    {
        MessageBox(NULL, _T("主框架注册失败!"), _T("Error"), MB_OK | MB_ICONERROR);//_T() 需用用到tchar.h头文件
    }

    //附:注册俩个子窗口类,在子窗口中通过类名来调度
    MainFrame.lpfnWndProc = ChildProc;
    MainFrame.lpszClassName = g_ChildFrame[0];
    MainFrame.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
    MainFrame.lpszMenuName = MAKEINTRESOURCE(IDR_ChildMenu);//子菜单

    if (!RegisterClass(&MainFrame))
    {
        MessageBox(NULL, _T("子窗口1注册失败!"), _T("Error"), MB_OK | MB_ICONERROR);//_T() 需用用到tchar.h头文件
    }
    
    MainFrame.lpfnWndProc = ChildProc;
    MainFrame.lpszClassName = g_ChildFrame[1];
    MainFrame.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);
    MainFrame.lpszMenuName = MAKEINTRESOURCE(IDR_ChildMenu);;

    if (!RegisterClass(&MainFrame))
    {
        MessageBox(NULL, _T("子窗口2注册失败!"), _T("Error"), MB_OK | MB_ICONERROR);//_T() 需用用到tchar.h头文件
    }
    //3.创建窗口    
        HWND mainframe_hwnd;
        mainframe_hwnd= CreateWindow(
            g_MainFrame,
            g_MainFrame,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT,
            NULL, 
            NULL, 
            hInstance,
            NULL);
        if(!mainframe_hwnd)
            MessageBox(NULL, _T("主框架创建失败!"), _T("Error"), MB_OK | MB_ICONERROR);
    //4.显示窗口
        ShowWindow(mainframe_hwnd, nShowCmd);

    //5.刷新窗口
        UpdateWindow(mainframe_hwnd);

    //6.信息捕获
        MSG mainframe_msg;
        while (::GetMessage(&mainframe_msg, NULL, 0, 0))
        {
            ::TranslateMessage(&mainframe_msg);//TranslateMessage是用来把虚拟键消息转换为字符消息。
            ::DispatchMessage(&mainframe_msg);//消息调度
        }
        return mainframe_msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //处理消息
    static  HWND hClient = NULL,hChild=NULL;
    static HINSTANCE hInstance = NULL;
    CLIENTCREATESTRUCT cs = { 0 };
    switch (message)
    {
        /*1.关不窗口时,会收到该消息,PostQuitMessage()像系统表明终止当前线程,没有这个函数的话,窗口不会关闭*/
    case WM_DESTROY:
        PostQuitMessage(0);//用于相应关闭消息,否则线程不会关闭,导致系统阻塞
        return 0;

    case WM_CREATE:     
        
        cs.hWindowMenu =  GetSubMenu(GetMenu(hwnd), 10);
        cs.idFirstChild = 10;//第一个子窗口与之关联的菜单项ID
        hInstance = GetModuleHandle(NULL);
        hClient = CreateWindow(_T("MDICLIENT"), g_ClientFrame, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
            0, 0,100,100,
            hwnd, (HMENU)IDR_ClientMenu, hInstance, &cs);//第一个参数为MDICLIENT
        if (!hClient)
            MessageBox(NULL, _T("客户区创建失败!"), _T("Error"), MB_OK | MB_ICONERROR);
        return 0;
    case WM_COMMAND:
    {
            switch (LOWORD(wParam))
            {
                case ID_MCS1:
                {
                    //创建子窗口
                   MDICREATESTRUCT mcs = { 0 };
                   mcs.x = CW_USEDEFAULT;
                   mcs.y =  CW_USEDEFAULT;
                   mcs.cx =CW_USEDEFAULT;
                   mcs.cy =  CW_USEDEFAULT;//设置子窗口的大小
                    mcs.hOwner = hInstance;
                    mcs.style = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN;//设置了为子窗口WS_CHILD
                    mcs.szClass = g_ChildFrame[0];
                    mcs.szTitle = g_ChildFrame[0];

                    hChild = (HWND)::SendMessage(hClient, WM_MDICREATE,
                        0, (LPARAM)(LPMDICREATESTRUCT)&mcs);
                    if (!hChild)
                            MessageBox(NULL, _T(" 子窗口创建失败!"), _T("Error"), MB_OK | MB_ICONERROR);
                    
                    return 0;
                }
                return 0;
                default: return 0;
            }
        }
    return 0;
    }
    //将不需要处理的消息传递给系统作默认处理
    return DefFrameProc(hwnd, hClient,message, wParam, lParam);
    //return DefWindowProc(hwnd, message, wParam, lParam);在窗口程序中使用
}

LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HINSTANCE hInstance;
    HMENU hMenu, hSubMenu;
    switch (message)
    {
    case WM_CREATE:
    {
        //关联对应的菜单,本程序只拥有一个菜单,如果想每个子文档关联不同的菜单也是可以的,最后需要重绘菜单 DrawMenu
        hInstance = ::GetModuleHandle(NULL);
        hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MainFrame));
        hSubMenu = ::GetSubMenu(hMenu, 0);
        SendMessage(GetParent(hwnd), WM_MDISETMENU, (WPARAM)hMenu, (LPARAM)hSubMenu);
        
    }
    return 0;

    case WM_QUERYENDSESSION:
    case WM_CLOSE:
    {
        if (IDOK == MessageBox(hwnd, _T("确定?"), _T("关闭"), MB_ICONQUESTION | MB_OK))
        {
            break;
        }
    }
    return 0;

    default:
        break;
    }
    return DefMDIChildProc(hwnd, message, wParam, lParam);
}
 

注意:程序需要添加菜单资源,将本程序加黑的菜单ID更改为添加的菜单ID值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前沿技术】严重事故!实习生删除字节跳动所有轻量级机器学习模型

来源&#xff1a;智能研究院昨晚脉脉上有网友爆料&#xff0c;字节跳动一位实习生删除了公司所有轻量级别的机器学习模型&#xff01;什么是lite模型&#xff1f;该楼主表示&#xff0c;lite模型就是公司内几乎所有GB大小以下的机器学习模型&#xff0c;且全部被删除了&#xf…

机器人行业研究报告:智能化造就新时代,自动化生产成刚需

来源&#xff1a;东莞证券作者&#xff1a;黄秀瑜核心观点智能转型时代&#xff0c;机器人前景可期。智能化时代到来&#xff0c;工业机器人和服务 机器人逐渐普及。疫情后制造业走出低迷&#xff0c;中国工业机器人月产量创新 高。全球老龄化问题日益严重&#xff0c;中国作为…

bzoj 1596 电话网络

Description Farmer John决定为他的所有奶牛都配备手机&#xff0c;以此鼓励她们互相交流。不过&#xff0c;为此FJ必须在奶牛们居住的N(1 < N < 10,000)块草地中选一些建上无线电通讯塔&#xff0c;来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。…

指甲盖大小塞了500亿晶体管!领先台积电,IBM打造世界首款2纳米芯片!能耗仅为7纳米的1/4!...

文章来源&#xff1a;EETOP我们知道在2014年IBM已将其Microelectronics部门出售给GlobalFoundries时&#xff0c;IBM就已经宣告退出芯片代工业务。但这几年来&#xff0c;尽管IBM退出了代工业务&#xff0c;不过好像IBM在半导体先进工艺研发上一直没有放弃&#xff0c;时不时会…

人工智能浪潮褪去,冲刺IPO成AI企业生存关键?

来源&#xff1a; 大作此前&#xff0c;AI四小龙持续亏损、登科受阻&#xff0c;投影出“AI估值泡沫&#xff0c;风口浪潮已褪”的现实。反观AI四小龙同期的独角兽格灵深瞳&#xff0c;6月22日科创板IPO受理&#xff0c;拟募资10亿元用于AI算法平台升级、创新应用研发等项目。前…

【开源】iTest教学辅助系统源代码

iTest教学辅助系统 2020.10.16第一次更新 重置了下载链接 2020.12.21第二次更新 重置了下载链接 2021.05.07第三次更新 重置了下载链接 1.关于iTest教学辅助系统 i实验辅助教学平台是基于局域网开发&#xff0c;力求为教师和学生用户提供实验课堂辅助教学环境的计算机系统&…

KnockoutJS-与服务端交互

几乎所有Web应用程序都要和服务器端交换数据&#xff0c;交换数据时最方便的就是使用JSON格式。Knockout可以实现很复杂的客户端交互&#xff0c;对于前后端交互使用的技术最为基本且常用的是Ajax&#xff0c;本次利用Ajax和ko的双向绑定完成一些简单的功能&#xff0c;可以快速…

神经网络无法区分异同,而且这个缺陷是本质性的

来源&#xff1a;混沌巡洋舰1969年《芝麻街》的第一集中有一个片段叫做“这些东西中的一个与众不同”。观众们被要求考虑一张展示三个2和一个 w 的海报&#xff0c;然后一边跟着游戏的同名广告歌唱&#xff0c;一边决定哪个符号不属于这个标志。《芝麻街》中的很多集重复了这个…

matlab计算级数和

级数(series)是指将数列的项依次用加号连接起来的函数。典型的级数有正项级数、交错级数、幂级数、傅里叶级数等。 —百度百科 matlab提供了直接计算级数的两个方法&#xff0c;symsum的两种形式&#xff08;做题刚开始以为是重载&#xff0c;直接导致了上一篇帖子的产生 &…

北国风光

转载于:https://www.cnblogs.com/ssyfj/p/10214328.html

“期待已久的UFO报告”公布了

来源&#xff1a;环球网 作者&#xff1a;张晓雅多家美媒表示&#xff0c;调查没有得出确切结论。包括美国有线电视新闻网&#xff08;CNN&#xff09;、美联社、美国哥伦比亚广播公司&#xff08;CBS&#xff09;在内多家美媒最新消息&#xff0c;美国政府当地时间25日发布报告…

Bmp格式与编程读取解析

Bmp格式 DigitalImage图像类设计 图像加载函数,通过bmp图片路径&#xff0c;加载图像数据&#xff0c;通过类构造函数来实现。 DigitalImage::DigitalImage(LPCTSTR lpszPath) {StrCpy(m_FilePath, lpszPath);CFile RdBmp;if (!RdBmp.Open(m_FilePath, CFile::modeRead | CFil…

关于奈氏准则和香农公式

对于带宽固定的信道&#xff0c;提高信息传输速率有两种方式&#xff1a; 提高码元在信道中的传输速率&#xff1b;提高信噪比&#xff1b; 我们以高速公路的例子来理解&#xff1a; 码元相当于车辆&#xff0c;信道相当于公路&#xff0c;所有的汽车都在运输相同的货物&…

五角大楼公布UFO报告,不明飞行物到底是什么?(全文)

来源&#xff1a;大数据实验室五角大楼周五发布的一份有关不明飞行物的重要报告称&#xff0c;国防和情报分析人员缺乏足够的数据来确定军事飞行员观察到的神秘飞行物体的性质&#xff0c;包括它们是先进的地球技术、大气层还是外星天体。这份报告提交国会并向公众公布&#xf…

python 词云小demo

词云小demo jiebawordcloud一 什么是词云&#xff1f; 由词汇组成类似云的彩色图形。“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出&#xff0c;形成“关键词云层”或“关键词渲染”&#xff0c;从而过滤掉大量的文本信息&#xff0c;使浏览网页者只要一眼…

python--类与GUI编程框架

类属性 类的数据属性&#xff08;静态成员&#xff09;&#xff1a;仅仅是定义的类变量在类创建后被使用可以由类的方法来更新&#xff0c;也可以在主程序中更新类属性和实例无关&#xff0c;修改类属性需要使用类名 class Dog(object):counter0def __init__(self,name):self.…

信道复用技术之码分复用

2020730第一次修改&#xff1a;提升了图片的清晰度 1. 首先来说说什么是信道复用 信道复用&#xff0c;顾名思义&#xff0c;就是把多个用户使用的信道合并在一条信道&#xff0c;即一条信道承载着多个用户传输数据的任务&#xff1b; ps&#xff1a;信道&#xff1a;数据信息传…