GCC 使用 VCL(LCL) https://github.com/ying32/liblcl
https://github.com/ying32/liblcl
熟悉的库跨平台开源无版权问题
c语言调用liblcl示例
// main.c : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "liblcl.h"
#ifdef _WIN32
// UTF8解码
char *UTF8Decode(char* str) {
int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
wchar_t* wCharBuffer = (wchar_t*)malloc(len * sizeof(wchar_t) + 1);
MultiByteToWideChar(CP_UTF8, 0, str, -1, wCharBuffer, len);
len = WideCharToMultiByte(CP_ACP, 0, wCharBuffer, -1, 0, 0, 0, NULL);
char* aCharBuffer = (char*)malloc(len * sizeof(char) + 1);
WideCharToMultiByte(CP_ACP, 0, wCharBuffer, -1, aCharBuffer, len, 0, NULL);
free((void*)wCharBuffer);
return aCharBuffer;
}
#endif
// 按钮单击事件
void onButton1Click(TObject sender) {
ShowMessage("Hello world!");
}
// 文件拖放事件
void onOnDropFiles(TObject sender, void* aFileNames, intptr_t len) {
printf("aFileNames: %p, len=%d\n", aFileNames, len);
intptr_t i;
// GetFPStringArrayMember 为一个从Lazarus的string数组中获取成员的函数。
for (i = 0; i < len; i++) {
#ifdef _WIN32
// 由于liblcl使用的是UTF-8编码,所以获取或者传入的在Windows下都要经过UTF-8编/解码
char *filename = UTF8Decode(GetFPStringArrayMember(aFileNames, i));
#else
// Linux与macOS默认都是UTF-8,则无需编/解码
char *filename = GetFPStringArrayMember(aFileNames, i);
#endif
printf("file[%d]=%s\n", i+1, filename);
#ifdef _WIN32
free((void*)filename);
#endif
}
}
// 窗口键盘按下事件
void onFormKeyDown(TObject sender, Char* key, TShiftState shift) {
printf("key=%d, shift=%d\n", *key, shift);
if (*key == vkReturn) {
ShowMessage("press Enter!");
}
TShiftState s = Include(0, ssAlt);
if (InSet(s, ssAlt)) {
printf("ssAlt1\n");
}
s = Exclude(s, ssAlt);
if (!InSet(s, ssAlt)) {
printf("ssAlt2\n");
}
}
// 编辑框内容改变事件
void onEditChange(TObject sender) {
printf("%s\n", Edit_GetText(sender));
}
int main()
{
// 加载库
#ifdef _WIN32
if (load_liblcl("liblcl.dll")) {
#endif
#ifdef __linux__
if (load_liblcl("liblcl.so")) {
#endif
#ifdef __APPLE__
if (load_liblcl("liblcl.dylib")) {
#endif
// 主窗口显示在任务栏,仅Windows有效
Application_SetMainFormOnTaskBar(Application, TRUE);
// 应用程序标题,影响到:比如ShowMessage的标题。
Application_SetTitle(Application, "Hello LCL");
// 初始化应用程序
Application_Initialize(Application);
// 创建窗口
TForm form = Application_CreateForm(Application, FALSE);
// 设置窗口标题
Form_SetCaption(form, "LCL Form");
// 设置窗口位置
Form_SetPosition(form, poScreenCenter);
// --- 拖放文件测试 ---
// 接受文件拖放
Form_SetAllowDropFiles(form, TRUE);
// 拖放文件事件
Form_SetOnDropFiles(form, onOnDropFiles);
// 窗口优先接受按键,不受其它影响
Form_SetKeyPreview(form, TRUE);
// 窗口按键事件
Form_SetOnKeyDown(form, onFormKeyDown);
// ---------- 从内存流或者文件加载UI布局文件 ----------
// 从文件加载窗口设置
// 从流加载
//TMemoryStream mem = NewMemoryStream();
//MemoryStream_Write(mem, data, datalen);
//MemoryStream_SetPosition(mem, 0);
//ResFormLoadFromStream(mem, form);
//MemoryStream_Free(mem);
// 从文件加载
//ResFormLoadFromFile("./Form1.gfm", form);
// ---------- 动态创建控件 ----------
// 创建一个按钮
TButton btn = Button_Create(form);
// 设置子父窗口
Button_SetParent(btn, form);
// 设置按钮单击事件
Button_SetOnClick(btn, onButton1Click);
// 设置按钮标题
Button_SetCaption(btn, "button1");
// 设置按钮在Parent的左边位置
Button_SetLeft(btn, 100);
// 设置按钮在Parent的顶边位置
Button_SetTop(btn, 100);
// 创建一个单行文件框(多行为TMemo)
TEdit edit = Edit_Create(form);
// 设置子父窗口
Edit_SetParent(edit, form);
// 设置左边
Edit_SetLeft(edit, 10);
// 设置顶边
Edit_SetTop(edit, 10);
// 设置编辑器内容改变事件
Edit_SetOnChange(edit, onEditChange);
// 运行app
Application_Run(Application);
// 释放liblcl库
close_liblcl();
}
return 0;
}
相关推荐
电信运营基于分类模型的客户流失预警系统:数据挖掘驱动的精准挽留策略设计
内容概要:本文围绕电信客户流失预警与挽留策略,构建了一套从数据探索、预处理、特征工程、分类建模、模型评估与解释到业务落地的端到端数据挖掘实战方案。基于公开的 Telco Customer Churn 数据集,项目聚焦于识别高流失风险客户,并通过逻辑回归、随机森林和XGBoost等模型进行对比分析,结合ROC-AUC、精确率、召回率、F1等指标评估性能,利用SHAP等方法实现模型可解释性,最终将预测结果转化为可操作的客户分层与差异化挽留策略。文中强调了数据泄漏防范、类别不平衡处理、模型可复现性及A/B测试验证增量收益的重要性,并明确指出当前图表为示意性质,需通过附录代码运行真实数据生成结果。; 适合人群:具备一定数据分析与机器学习基础,从事数据科学、用户运营或客户留存相关工作的从业者,尤其是工作1-3年希望提升实战能力的研发与分析人员。; 使用场景及目标:①掌握客户流失预测的全流程方法论,包括数据清洗、特征工程、建模调参与模型解释;②学习如何将机器学习模型输出转化为可运营的客户触达策略;③理解模型评估与业务目标之间的衔接,如预算约束下的优先级排序与A/B测试设计; 阅读建议:此资源以实际业务场景驱动,不仅关注算法实现,更重视从业务定义到策略落地的闭环逻辑。建议结合附录提供的完整Python代码,在本地环境中下载数据集并复现分析流程,重点关注数据预处理防泄漏机制、模型管道构建、超参数调优策略及SHAP解释应用,避免将文中的示意图表误认为实测结果。
旋转高频信号注入法在PMSM零低速无位置控制中的仿真研究(Matlab代码实现)
内容概要:本文系统研究了旋转高频信号注入法在永磁同步电机(PMSM)零低速无位置传感器控制中的应用,并提供了基于Matlab/Simulink的完整仿真代码实现。针对PMSM在启动及低速运行时反电动势微弱导致传统观测器失效的问题,该方法通过在定子绕组中注入高频旋转电压信号,利用电机自身凸极效应产生的响应电流特征,实现对转子位置的高精度在线估计。文中详细阐述了该技术的理论基础、数学建模过程、仿真系统架构设计以及关键参数整定方法,全面验证了其在零速和低速工况下对转子初始位置辨识与动态跟踪的准确性、有效性及强鲁棒性。; 适合人群:具备电机控制理论基础知识和Matlab/Simulink仿真能力的电气工程、自动化、电力电子等相关专业的硕士研究生、博士研究生、科研人员以及从事高性能电机驱动系统研发的工程师。; 使用场景及目标:① 深入理解高频信号注入类无位置传感器控制技术的工作原理、信号处理机制与工程实现细节;② 掌握利用Matlab/Simulink搭建PMSM高性能矢量控制系统及高级观测器的仿真方法;③ 为开发高精度、低成本、全速度范围适用的PMSM无位置传感器驱动器提供坚实的理论依据和技术验证平台。; 阅读建议:建议读者结合文中详尽的理论推导与所提供的仿真代码进行对照学习,亲自动手运行、调试仿真模型,通过改变负载、转速、注入信号参数等工况,观察系统响应与控制效果的变化,从而深刻掌握旋转高频注入法的内在工作机制与设计要点。
Python小Demo实例源码爬取网易云音乐评论
Python小Demo实例源码爬取网易云音乐评论
Python3 finally执行铁律
finally代码块无论try内部是否报错、是否执行return,都会强制执行。唯一例外:调用os._exit()直接终止解释器,跳过finally。业务场景:数据库连接、网络套接字、文件句柄回收,放入finally保证资源释放。特殊细节:try内部return不会立刻返回,会先执行finally内部代码,再返回结果。新手易错:在finally内部写入return,会覆盖try原有返回值,导致业务数据异常,严禁在finally使用return语句。 tiyu.xastone.com www.yingjie168.com 17kuaibu.com www.0760yx.net 1900kk.com
基于线性时变MPC的无人驾驶车辆双移线轨迹跟踪仿真研究(Matlab代码、Simulink仿真实现)
基于线性时变MPC的无人驾驶车辆双移线轨迹跟踪仿真研究(Matlab代码、Simulink仿真实现)


茶馆
