自己动手写c++界面库 SmUI

SmUI 界面库纯使用api实现, 所以不需要携带多余的运行时库。

界面库使用过程中最重要的就是消息捕获, 想要灵活操作控件, 就要能够捕获控件的各种消息, 实现这个目标有3个方案选择:

1、使用SetWindowsHookEx安装WH_CBT钩子

2、超类化标准控件类

3、创建控件后子类化控件 --> 使用这个方式有缺点: 会有多个事件不能捕获, 最主要的是WM_CREATE

这里我们使用第三个方案, 我们要实现的控件库以"简单易用"为目标, 不必一开始就把一切都完美的处理好。事情到了需要的时候才去做, 多余用不到的先不予理会,辅助类能少就少。

先简述下界面库结构:

先取个名称: SimpleUI 简称 SmUI, 本项目在 gcc + CodeBlocks 环境下开发, 在 Wine下也能正常运行。

 

1. ObjBase: 基类

2. WinApp类: 为程序入口, 封装WinMain函数

3. WndBase类: 窗体及控件基类

4. Form, Dialog, Button, CheckBox, RadioButton ... 等基本控件类

5. ListView, TreeView, ToolBar, StatusBar ... 等扩展控件类

6. Map类, 辅助类, 自己实现, 不将C++ std标准库编译进界面库中, 减小目标程序大小.

 

例程源代码: main.cpp

#include "SmUI.h"

class MyApp: public WinApp{
public:
    MyApp()=default;
    virtual ~MyApp()=default;

    virtual int OnAppInit(HINSTANCE hIns, TCHAR *pCmdLine, int nCmdShow);
    virtual void OnAppExit();

    bool MainForm_OnLoad(WndBase *pWnd, WPARAM wParam, LPARAM lParam);
    bool Btn_OnClick(WndBase *pWnd, WPARAM wParam, LPARAM lParam);

    Form MainForm;

    Button *pBtn=NULL;

private:

};

int MyApp::OnAppInit(HINSTANCE hIns, TCHAR *pCmdLine, int nCmdShow){
    int iRet=0;

    MainForm.SetMsgFunc(WM_CREATE, (MsgFunction)MainForm_OnLoad);
    MainForm.SetCmdFunc(1001, BN_CLICKED, (MsgFunction)Btn_OnClick);

    if(MainForm.Create()==true){
        MainForm.MoveCenter();

        MainForm.Show();
        MainForm.Update();

        iRet=Run();
    }

    return iRet;
}

void MyApp::OnAppExit(){
    WinApp::OnAppExit();
}

bool MyApp::MainForm_OnLoad(WndBase *pWnd, WPARAM wParam, LPARAM lParam){
    // MessageBox(pWnd->m_hWnd, _T("MainForm_OnLoad"), _T("Main Form"), MB_OK|MB_ICONINFORMATION);
    // pBtn=(Button *)(pWnd->AddChild(WT_BUTTON, 1001, 100, 30));
    pBtn=pWnd->AddChild<Button>(WT_BUTTON, 1001, 100, 30);

    return true;
}

bool MyApp::Btn_OnClick(WndBase *pWnd, WPARAM wParam, LPARAM lParam){
    if(pWnd==pBtn){
        MessageBox(pWnd->m_hWnd, _T("Btn_OnClick"), _T("Main Form"), MB_OK|MB_ICONINFORMATION);
    }

    pBtn->SetText(_T("&Hello"));
    pBtn->Move(31, 31, 100, 32);

    MessageBox(pBtn->m_hWnd, _T(pBtn->Text()), "Main Form", MB_OK);
    pBtn->SetAsDefault(true);

    return true;
}

MyApp theApp;

 

 源代码下载: SmUI.rar   -> 预览版

 

posted @ 2021-01-12 11:09  cpp100  阅读(820)  评论(0)    收藏  举报