自己动手写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 -> 预览版

浙公网安备 33010602011771号