厚德载物 发表于 2026-1-28 00:18:26

封库终于变得简单了,无需VS纯火山代码即可简单封库

目前研究的MFC类库封装,WTL也类似,首先看最想要的结果:是直接继承MFC类,结果发现是不行的,只能曲线绕了

先看效果图:




以下是代码:注意是MFC程序

<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 启动类 <公开 基础类 = 窗口程序类>
{
    变量 主窗口对象 <类型 = 我的主窗口 标题 = "我的主窗口">

    方法 启动方法 <公开 类型 = 整数>
    {
      主窗口对象.创建主窗口 ()
      返回 (1)
    }
}

# ===

类 我的主窗口 <基础类 = 窗口 注释 = "样例主窗口" @视窗.布局 = "client_size = \"308, 306\"">
{
    变量 按钮1 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = \"87, 218, 134, 64\"" 标题 = "火山自带按钮">
    变量 我的按钮1 <类型 = 我的按钮类>
    变量 我的按钮2 <类型 = 我的按钮类>

    方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件" 折叠>
    参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    {
      我的按钮1.创建 (取窗口句柄 (), "封装按钮1", 0, 0, 100, 50)
      我的按钮2.创建 (取窗口句柄 (), "封装按钮2", 120, 0, 100, 50)
      返回 (0)

    }

    方法 我的按钮类_被单击 <接收事件 类型 = 整数 折叠>
    参数 来源对象 <类型 = 我的按钮类 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    {
      如果 (来源对象 == 我的按钮1)
      {
            信息框 ("按钮1被单击了!", , )
            标题 = "自创按钮"
      }
      否则 (来源对象 == 我的按钮2)
      {
            信息框 ("按钮2被单击了!", , )
      }
      否则
      {
            信息框 ("不知道谁被单击了!", , )
      }
      返回 (0)
    }
}

类 我的按钮类
{

    # @begin
    # //*********** 头文件类的声明 **************************
    # <> <include>
    # class MyButton : public CButton //定义一个核心封装类
    # {
    #   protected:
    #         int id = 0;//定义的一个测试变量
    #   private:
    #         DECLARE_MESSAGE_MAP()   //消息映射申明
    #   public:
    #         @sn<current_class>* theobj = NULL;//与火山类对象对接,实现互调
    #         afx_msg void OnBnClicked();//消息映射函数
    #         int display();//自定义的一个测试函数
    # };
    # MyButton btn;//内部核心操作对象,封装本事就是操作本对象
    # <> </include>
    # //*********** 头文件类的实现和消息映射 **************************
    # using MyButton = @sn<current_class>::MyButton;//简化接下来对封装类的使用,以后不再需要范围域指定
    # BEGIN_MESSAGE_MAP(MyButton, CButton)//消息映射表
    #      ON_CONTROL_REFLECT(BN_CLICKED, &MyButton::OnBnClicked)
    # END_MESSAGE_MAP()
    # void MyButton::OnBnClicked()   //消息映射转发
    # {
    #      theobj->@<被单击>();//转发到火山对象
    # }
    #
    # int MyButton::display() //自定义的一个测试函数
    # {
    #   return 123;
    # }
    #
    # @end

    方法 创建 <公开 类型 = 整数 注释 = "封装的方法">
    参数 父窗口句柄 <类型 = 变整数>
    参数 按钮标题 <类型 = 文本型>
    参数 左边位置 <类型 = 整数>
    参数 顶边位置 <类型 = 整数>
    参数 创建宽度 <类型 = 整数>
    参数 创建高度 <类型 = 整数>
    {
      @ CWnd* pWnd = CWnd::FromHandle((HWND)@<父窗口句柄>);
      @ btn.Create(@<按钮标题>,BS_PUSHBUTTON,CRect(@<左边位置>,@<顶边位置>,@<左边位置>+@<创建宽度>,@<顶边位置>+@<创建高度>),pWnd,123456+@<左边位置>);
      @ btn.ShowWindow(SW_SHOW);
      @ btn.UpdateWindow();
      @ btn.theobj=this;
      返回 (0)
    }

    方法 被单击 <公开 定义事件 类型 = 整数 注释 = "消息映射">
    {

    }
}










hmyroot 发表于 2026-1-28 00:38:43

曲线救火山PC

aycap 发表于 2026-1-28 09:30:05

加油

承易 发表于 2026-1-28 19:30:48

如果用LUA包装一层,是不是就简单点呢
页: [1]
查看完整版本: 封库终于变得简单了,无需VS纯火山代码即可简单封库