babyos (八)—— 简单图形界面

注:以下代码为原创,若发现bug,万望指出,若有问题,欢迎交流,转载请指明出处。若能有助于一二访客,幸甚。

欢迎关注babyos 的成长历程和宝贝计划:https://github.com/guzhoudiaoke/babyos/wiki


前面已经实现了一个简易的图形库,那么实现一个简单的图形界面是理所当然的事。

babyos走的是好玩、可爱、漂亮的路线,怎么好玩怎么来,怎么漂亮怎么来,所以这个图形界面还是着实费了一番功夫的,属于高级山寨。虽然没有什么技术含量,但画面着实焕然一新,也算作一点进步。

系统已经定名为babyos,翻译作宝贝/宝宝操作系统,则她画出来的界面叫做“涂鸦”也是情理之中的事儿,当然这是高级山寨涂鸦喽~

图形界面暂时定名为graffiti,译作“涂鸦”,虽然是髙仿真Ubuntu Gnome的一种情景模式,但实现方法与它毫无关系(当然是水的多了)。

注:此前babyos已经切换到800x600 24bit颜色显示模式——不为别的,只为与《30天》不同,或者内心深处希望比鬼子做的好一点,所以界面是髙仿真linux以与《30天》低仿真windows做比较~o(∩∩)o...哈哈

实验结果:



主要代码:

/*************************************************************************
	> File:		graffiti.c
	> Describe: 系统叫baby,其界面名曰graffiti,取儿童涂鸦之意
	> Author:	孤舟钓客
	> Mail:		guzhoudiaoke@126.com 
	> Time:		2013年01月05日 星期六 00时29分31秒
 ************************************************************************/
#include <graffiti.h>

static u32 screen_cx;
static u32 screen_cy;


static BOOL init_graffiti()
{
	screen_cx = get_screen_width();
	screen_cy = get_screen_height();

	return TRUE;
}


/* 绘制桌面背景 */
BOOL draw_background()
{
	color24 old_color = set_color(RGB(background_color.r, background_color.g, background_color.b));
	fill_rectangle(0, 0, screen_cx, screen_cy);
	set_color(old_color);

	return TRUE;
}

/* position 暂时只支持0或1,0表示在屏幕最上面画,1表示在最下面 */
BOOL draw_panel(u8 position)
{
	s32 top, bottom, y;
	color24 old_color;

	if (position == 0)
	{
		top = 0; bottom = PANEL_HEIGHT;
	}
	else
	{
		bottom = screen_cy; top = bottom-PANEL_HEIGHT;
	}

	old_color = get_current_color();
	
	for (y = top; y < bottom; y++)
	{
		set_color_t(panel_color[y-top]);
		fill_rectangle(0, y, screen_cx, 1);
	}
	
	set_color(old_color);

	return position;
}

/* 绘制一个窗口 */
BOOL draw_window(s32 left, s32 top, u32 width, u32 height)
{
	s32 right, bottom, y, i;
	color24 old_color;

	if (width < MIN_WINDOW_WIDTH) 
		width = MIN_WINDOW_WIDTH;

	right = left + width;
	bottom = top + height + W_HEAD_HEIGHT;
	
	y = top;
	i = 0;
	old_color = get_current_color();
	
	/* 窗体头 */
	for (i = 0; i < W_ROUND_RECT_HEIGHT; i++)
	{
		set_color_t(w_head_color[i]);
		fill_rectangle(left+w_round_rect_width[i], y++, width-w_round_rect_width[i]*2, 1);
	}
		
	set_color_t(w_head_color[0]);
	for (i = 0; i < W_ROUND_RECT_POINT_NUM; i++)
	{
		set_pixel(left+w_round_rect_border_points[i].x, top+w_round_rect_border_points[i].y);
		set_pixel(right-w_round_rect_border_points[i].x-1, top+w_round_rect_border_points[i].y);
	}

	for (; i < W_HEAD_HEIGHT; i++)
	{
		set_color_t(w_head_color[i]);
		fill_rectangle(left, y++, width, 1);
	}

	/* 窗体 */
	set_color_t(w_boday_color);
	fill_rectangle(left, top+W_HEAD_HEIGHT, width, height-W_ROUND_RECT_HEIGHT);

	y = bottom - 1;
	for (i = 0; i < W_ROUND_RECT_HEIGHT; i++)
	{
		fill_rectangle(left+w_round_rect_width[i], y--, width-w_round_rect_width[i]*2, 1);
	}

	set_color_t(w_bottom_color);
	for (i = 0; i < W_ROUND_RECT_POINT_NUM; i++)
	{
		set_pixel(left+w_round_rect_border_points[i].x, bottom-w_round_rect_border_points[i].y-1);
		set_pixel(right-w_round_rect_border_points[i].x-1, bottom-w_round_rect_border_points[i].y-1);
	}

	/* 窗体边框 */
	set_color_t(w_bottom_color);
	fill_rectangle(left+w_round_rect_border_points[0].x, bottom-1, width-w_round_rect_border_points[0].x*2, 1);

	for (i = 0; i < W_BORDER_WIDTH; i++)
	{
		set_color_t(w_border_color[i]);
		fill_rectangle(left+i, top+W_HEAD_HEIGHT, 1, height-W_ROUND_RECT_HEIGHT);
		fill_rectangle(right-i-1, top+W_HEAD_HEIGHT, 1, height-W_ROUND_RECT_HEIGHT);
	}

	/* 关闭按钮 */

	set_color(old_color);
	
	return TRUE;
}


/* 安装graffiti界面 */
BOOL install_graffiti()
{
	init_graffiti();
	
	draw_background();
	
	draw_panel(0);
	draw_panel(1);

	return TRUE;
}

下一步的目标是实现bitmap或简化版bitmap的显示。把关闭、最大化、最小化按钮画上去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值