Nana C++ Library: 2011年再赚一次眼球

Jinhao 2011-12-06 03:00:01
Nana C++ Library
项目地址
下载地址

欢迎大家试用。一些老的帖子:
不明白的可以查看这个介绍
该库的作用是提高开发效率,看这个

有人问
Q:虽然符合C++标准甚至可以使用Lambda,那为什么还要支持比较老的编译器呢?
A:因为有些比较老的编译器能够很好的支持C++98,Nana库为了能够和其他的老代码一起工作因此需要考虑这些老的编译器。

Q:界面看上去并不炫
A:提供的控件都是最简单的美。“炫”这个概念在每个设计人员那里定义是不一样的,因此“炫”是留给设计人员完成的工作,可以用这个库去实现比较炫的控件。

基于Nana C++ Library开发的软件

...全文
623 55 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice1835 2012-12-28
  • 打赏
  • 举报
回复
求 股票实例的 源码
zzhgb 2012-08-31
  • 打赏
  • 举报
回复
最新下载的始终配置不成功,哪里有中文的图文说明的
hukui161 2011-12-09
  • 打赏
  • 举报
回复
好漂亮的内裤。
Jinhao 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 vanxining 的回复:]

想问一下,楼主的本职工作是?
感觉这个项目应该是你业余的爱好吧
[/Quote]

感觉真准。这项目是纯业余爱好,本质工作是一名碌碌无为的C++程序员
vanxining 2011-12-08
  • 打赏
  • 举报
回复
想问一下,楼主的本职工作是?
感觉这个项目应该是你业余的爱好吧
机智的呆呆 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 jinhao 的回复:]
引用 38 楼 demon__hunter 的回复:
多谢指点。可以具体说下,有相关资料吗?如果有的话,俺就不用找了。


俺不是微软的人,不知道有什么资料。只有GOOGLE可以用。嘿嘿
[/Quote]
Jinhao 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 demon__hunter 的回复:]
多谢指点。可以具体说下,有相关资料吗?如果有的话,俺就不用找了。
[/Quote]

俺不是微软的人,不知道有什么资料。只有GOOGLE可以用。嘿嘿
Jinhao 2011-12-08
  • 打赏
  • 举报
回复
贴一个例子:用treebox把文件夹以树结构的形式列出来。如图



#include <nana/gui/wvl.hpp>
#include <nana/gui/widgets/treebox.hpp>
#include <nana/filesystem/file_iterator.hpp>

typedef nana::gui::treebox<int> treebox_t;

class treebox_trigger
: public treebox_t::event_trigger_type
{
public:
treebox_trigger(treebox_t &tbox)
: treebox_(tbox)
{}

void expand(nana::gui::widget &widget, node_type node, bool exp)
{
if(!exp) return; //如果没有展开则退出

nana::string path = treebox_.make_key_path(node, STR("/")) + STR("/");

//遍历path目录下的子目录
nana::filesystem::file_iterator i(path), end;
for(; i != end; ++i)
{
if(false == i->directory) continue; //不是文件夹,跳过。

node_type child = treebox_.insert(node, i->name, i->name, 0);
if(0 == child) continue;

//继续在子文件夹中遍历,如果该子目录下找到文件夹,就将该文件夹插入到child项中,
//这样child项的前面就会出现一个箭头,表示该目录可以展开并显示其中的子目录。
nana::filesystem::file_iterator u(path + i->name);
for(; u != end; ++u)
{
if(false == u->directory) continue; //不是目录这跳过。
treebox_.insert(child, u->name, u->name, 0);
break; //跳出循环,只需要插入一个用来表示该目录下还包含有目录。
}
}
}
private:
treebox_t &treebox_;
};

int main()
{
using namespace nana::gui;

form fm(API::make_center(300, 300),
appear::decorate<appear::taskbar, appear::sizable>());
fm.caption(STR("Nana C++ Library - Treebox Sample."));

treebox_t tbox(fm, 0, 0, 300, 300);

#if defined(NANA_WINDOWS)
treebox_t::node_type node = tbox.insert(STR("C:"), STR("Local Drive(C:)"), 0);
nana::filesystem::file_iterator i(STR("C:\\")), end;
#elif defined(NANA_LINUX)
treebox_t::node_type node = tbox.insert(STR("/"), STR("Root/"), 0);
nana::filesystem::file_iterator i(STR("/")), end;
#endif
for(; i != end; ++i)
{
if(false == i->directory) continue;

tbox.insert(node, i->name, i->name, 0);
break;
}

treebox_trigger tt(tbox);
tbox.event_trigger(tt);

fm.show();
exec();
}
evencoming 2011-12-07
  • 打赏
  • 举报
回复
good.
再次支持
善良超锅锅 2011-12-07
  • 打赏
  • 举报
回复
好库的界面
  • 打赏
  • 举报
回复
Jinhao 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 vanxining 的回复:]

嗯,感觉还好吧,我也想写一个这样的库...
但有点疑惑的是,所有控件都是在栈上创建,这样岂不是由编译器来管理它的生存期了吗?按照常理,子控件的生存期应该是由父控件来管理才对
[/Quote]

窗口和引用窗口的对象是两个东西。例如
form fm; //窗口
button btn(fm); //按钮创建在fm上。
而不是
form fm;
fm.button.create(...);

另外,创建在栈和堆上的对象,跟窗口没有必然联系,就好比对象创建在栈和堆上是没区别的。只是局部对象会在函数退出时自动析构而已。如果引用窗口的对象被自动析构了,那窗口肯定也关闭了。反过来,窗口被关闭了,引用该窗口的对象并不会销毁,只是它没有引用窗口而已。
zhuwanglove 2011-12-07
  • 打赏
  • 举报
回复
机智的呆呆 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jinhao 的回复:]
引用 25 楼 demon__hunter 的回复:

引用 24 楼 jinhao 的回复:
引用 23 楼 demon__hunter 的回复:

请教lz一个问题:

using namespace ::nana::gui;
vc10不支持命名空间嵌套吗?


没明白。

C/C++ code

#include <nana/gui/wvl.hpp>
#inc……
[/Quote]
多谢指点。可以具体说下,有相关资料吗?如果有的话,俺就不用找了。
奋斗小青年 2011-12-07
  • 打赏
  • 举报
回复
vanxining 2011-12-07
  • 打赏
  • 举报
回复
嗯,感觉还好吧,我也想写一个这样的库...
但有点疑惑的是,所有控件都是在栈上创建,这样岂不是由编译器来管理它的生存期了吗?按照常理,子控件的生存期应该是由父控件来管理才对
Jinhao 2011-12-07
  • 打赏
  • 举报
回复
这是建议的目的很好,只是我觉得这不会是学习的成本。像traits这样的技术,主要用来构建库的,仅仅使用库来做开发的话,很少会接触到这些东西,或者说,模板都可能很少用到,只需要很基础的模板知识就能使用这些库。例如使用STL基本上不需要很高深的模板知识。其次还是应该尽量避免名字的冲突,虽然namespace可以解决这个问题,但可能会造成使用上的混乱。
FrankHB1989 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jinhao 的回复:]

引用 17 楼 frankhb1989 的回复:

LZ的库的一些基本接口(例如traits/function object)比起Boost或TR1中实现类似功能的部分有什么优越之处吗?


这些都是比较基础的技术,没有优势这一说,提供这些东西只是为了避免库的依赖,在比较老的编译环境中可以直接编译。其次,如果使用的最新的标准库,也鼓励使用标准库的东西。例如,事件的注册是接纳一个nana……
[/Quote]
如果一些功能可以相互替代的话,建议命名向标准库靠拢,这样可能减少一些用户在迁移时的学习成本。

crakme 2011-12-07
  • 打赏
  • 举报
回复
看样子很不错 支持~~
多加旺 2011-12-07
  • 打赏
  • 举报
回复
新手路过,学习一下。
加载更多回复(28)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧