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

来源:互联网 发布:域名购买后备案 编辑:程序博客网 时间:2024/05/22 17:14

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

原创粉丝点击