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的显示。把关闭、最大化、最小化按钮画上去。
- babyos (八)—— 简单图形界面
- babyos (九) —— 显示bitmap
- babyos (十二) —— 键盘中断
- babyos (六)—— 显示ASCII字符和汉字
- babyos (七)—— 简易图形库
- babyos (十一) —— baby, 1/0 = ? (异常和中断)
- babyos (一)——利用BIOS 中断INT 0x10显示字符和字符串
- babyos (二)——使用BIOS以及直接写显存绘制图形
- babyos (三)——利用BIOS INT 0x13读取软盘
- babyos (四)—— SVGA、VBE基础与切换到髙分辨率模式
- babyos (五)—— 跳转到保护模式并显示一个LOGO
- babyos (十) —— 通过IO端口读取硬盘扇区
- babyos (十三) —— 运行在优先级0 的拼图游戏
- babyos (一)——利用BIOS 中断INT 0x10显示字符和字符串
- babyos (三)——利用BIOS INT 0x13读取软盘
- Java八数码(图形界面)
- Java笔记(八)——Swing图形界面编程之菜单
- python——图形界面的简单实用 easygui
- Android休眠与唤醒
- Axure RP 6.5 正式版和中文汉化包 新增功能及详细测试
- How to save a NSImage as a new file
- select 应用
- SQL Server 2008 收缩日志、清空删除大日志文件
- babyos (八)—— 简单图形界面
- 常用算法集合
- WebWorks SDK给BB 10安装debug token
- SharePoint 2010 的服务器部署
- 本地socket unix domain socket
- 安卓BitmapFactory.decodeStream()返回null的问题解决方法
- Android之TelephonyManager类的方法详解
- 提醒自己,makefile 里的gcc ,rm ,都是程序,都得加path
- 从字符串中删除某个字符(C++)