GCC 使用 VCL(LCL) https://github.com/ying32/liblcl

jfet 2020-12-24 11:28:03
项目地址:
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;
}
...全文
454 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jfet 2020-12-25
  • 打赏
  • 举报
回复
实际这是GO语言使用vcl的附带项目,我们现在更愿意用GO来写客户端,简单不出错。服务器端也用GO,移动端用flutter,开发工具用vscode,还有一个插件在Lazarus中设计界面生成GO代码
  • 打赏
  • 举报
回复
如果考虑跨平台和版权的话,用fpc/Lazarus就可以了,还可以静态链接gcc写的功能模块。当然如果能做到gcc静态链接fpc生成的obj,实用价值就更大了,几乎就是跨平台免费版的C++Builder了,但是难度不小。
  • 打赏
  • 举报
回复
好吧,典型的开源项目的杂凑模式~~~
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
类库封装成C库?界面设计怎么弄?
jfet 2020-12-24
  • 打赏
  • 举报
回复
更多的意义是跨平台和版权
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
CB有Linux版编译器,但是目前只支持x64,不支持x86、ARM、MIPS

交叉编译、运行、调试方面会麻烦一点。
  • 打赏
  • 举报
回复
CB有Linux版编译器,但是目前只支持x64,不支持x86、ARM、MIPS
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
如果有个C++版的Lazarus就好了,在Linux平台会比较方便。
  • 打赏
  • 举报
回复
感觉意义不大,不如UI用Lazarus搞,然后链接gcc写的功能模块,这样既可以动态链接也可以静态链接(Free Pascal也能静态链接C的obj)
jfet 2020-12-24
  • 打赏
  • 举报
回复
动态链接的,使用的是LCL库(Lazarus 那套库)
  • 打赏
  • 举报
回复
动态链接的?我曾经尝试gcc静态链接Delphi生成的obj,用到VCL、FMX的都没搞成功,没有外部依赖的是可以,但是意义不大
发帖
茶馆

542

社区成员

C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
帖子事件
创建了帖子
2020-12-24 11:28
社区公告
暂无公告