注:以下代码为原创,若发现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的显示。把关闭、最大化、最小化按钮画上去。