📄 winos.txt
字号:
WinOS 1.0 应用文档
WinOS 的全称是SeekFor Windows On System,是一个类似Windows操作系统的GUI(甚至可以说是个操作系统,因为它本身支持抢先式分时多任务).
WinOS的设计思想来源于Windows,所以GDI和GUI大部分都兼容Windows(当然是在API上).
WinOS系统需求比较小,只需要最少1K的RAM和300K左右的ROM空间(软件代码在25K左右,其他是ASC16和HZK16字库),RAM的需要量和窗口的多少有关
,在只需要一个窗口的情况下,RAM只需要500Bytes左右.
WinOS的最初设计目标就是尽量保持和Windows兼容,保持和外部程序的完美嵌合.因此提供的API都基本兼容Win32 API,在界面上也仿Windows,当然
也支持自画窗口,所以即使不是点阵屏,也可以使用WinOS实现窗口操作(这时候必须使用自画功能).
使用WinOS后,可以发现程序的模块化程度又增强了,使用系统的标准窗口,用户可以实现和Windows相差不大的界面,而且在编程上,也是和Win32 SDK
编程风格一致.如果你会Win32 SDK,你会发现,使用WinOS竟然是如此简单!呵呵,剩下的事情就交给你吧!!
WinOS非常适合使用在ARM上,如果需要LCD或者其他显示,需要友好的人机界面,WinOS就是最好的选择!
1.WinOS基本兼容Windows,其中GDI大部分兼容,GUI绝大部分兼容
2.WinOS体系思想
(1)系统初始化后有一个缺省的窗口--桌面窗口,用户建立的窗口都是该窗口的子窗口
(2)系统提供一些标准控件(STATIC,PUSHBUTTON,EDIT等),所有控件的行为和Windows控件的行为基本一致,但有一些属性和消息没有被支持.
(3)用户的一个窗口就是一个应用程序,系统在该窗口有消息的时候调用该窗口的回调函数.回调函数的参数说明发生了什么消息.
(4)系统采用消息缓冲作为窗口和窗口的通信,可以使用标准消息,也可以自定义消息,但自定义消息必须在WM_USER~0xff之间
(5)系统支持子程序嵌套,在当前版本下,对多窗口支持的不是很好,单窗口应用已经非常稳定.
3.使用WinOS必须提供的条件
(1)必须提供一个画点函数和读点函数,最好提供一个优化的填充区域的函数,这些函数在调用GUI_Init()的时候传入进行注册.
(2)必须提供一个用来malloc()使用的大的缓冲区,大小和MAX_WINDOWS有关(当然越大越好).
(3)必须先正确调用GUI_Init(),然后必须在主程序循环(或定时程序)中调用GUI_Message,退出的时候必须调用GUI_Quit()
4.WinOS的订制
WinOS订制是通过include目录下的limits.h,cfg.h和color.h来实现的.limits.h定义了最大的参数,可以实现很小的系统需求.
而cfg.h则定义了API的取舍,如果不使用一个API,则把该API对应的开关定义成0(如不使用ShowWindow,则#define ShowWindow_EN 0)
color.h定义了16种标准颜色,使用不同类型的屏则可以通过该变这些宏定义实现理想的显示
5.WinOS在主程序中的使用
(1)定义好画点函数,读点函数,和区域填充函数(可以不提供),申请一块足够的内存,调用GUI_Init()初始化GUI
void putpoint(PIXEL *pl) /*参数必须是PIXEL结构指针*/
{
putpixel(pl->x,pl->y,pl->color);
}
void getpoint(PIXEL *pl) /*参数必须是PIXEL结构指针*/
{
pl->color=getpixel(pl->x,pl->y);
}
static char Buffer[1024*10];/*申请一块大内存*/
GUI_Init(640,480,Buffer,1024*10l,putpoint,getpoint,(lpfnCLRSCR)NULL);/*屏幕大小640X480,不提供区域清除函数*/
(2)初始化后,用CreateWindow() API建立一个或多个窗口,请参看API参考和示范
(3)进入主程序循环后,必须调用GUI_Message()
while(1)
{
do_other();
if(!GUI_Message()) break;/*GUI_Message()总是返回1,如果返回0说明用户调用了ExitWindows()退出GUI*/
}
(4)一般情况下,退出GUI后要调用GUI_Quit();
注意:GUI_Message可以在主程序循环中调用,也可以在定时程序中调用,要保证执行间隔比较短,否则容易出现屏幕闪动
6.驱动程序和WinOS的通讯
所有的驱动程序(如键盘驱动,触摸屏驱动)都做在GUI外部,驱动程序通过发送消息和GUI联系.
1.按键驱动程序.比如说外部按下了'A'键盘,怎么样可以让GUI知道呢?可以这样:
SendMessage(GetActiveWindow(),WM_KEYDOWN,'A',0);/*向GUI前台窗口发送'A'按下的消息*/
注意:一般GUI是前台窗口才能有键盘输入焦点,所以SendMessage()的第一个参数用GetActiveWindow(),如果你用其他的HWND也是可以的,
但这时候画图可能会出现问题,请小心使用
2.鼠标驱动程序.可以通过向前台窗口发送WM_MOUSEMOVE,WM_LBUTTONDOWN,...等消息通知GUI
3.其他驱动程序.可以通过向前台窗口发送自定义消息,然后自己在窗口的回调函数自己处理该消息即可
7.系统消息参考
WinOS支持大部分Windows标准的消息,而且参数和Windows标准基本一致.
窗口最重要的消息有WM_CREATE,WM_NCPAINT,WM_ERASEBKGND,WM_PAINT(按先后发生的顺序排列的,也就是说WM_CREATE最先发送,接下来会发送WM_NCPAINT)
(1)WM_CREATE:窗口建立消息
这个消息在调用CreateWindow()的时候发送给窗口的回调函数,是一个窗口最先发送的消息,可以在处理这条消息的时候
进行添加子窗口或初始化的一些操作.
(2)WM_NCPAINT:窗口非客户区绘图消息
当系统需要绘制非客户区域(标题栏)的时候发送此消息,可以在回调中处理这条消息(进行绘图操作),如果不处理或处理完成后返回0系统会继续调用
DefWindowProc()用来绘制标准窗口(也就是说,如果用户不处理此消息,则系统绘制标准标题栏,如果有标题栏的画)
(3)WM_ERASEBKGND:窗口客户区域清除背景消息
系统需要清除客户区域的时候发送此消息.用户返回0则调用缺省DefWindowProc()清除区域
(4)WM_PAINT:窗口需要重新绘制的时候发送此消息
系统在重画客户区域的时候发送此消息,这时可以在回调中处理用来实现在客户区域中输出文字,绘制图形等.不管用户返回什么值系统都会调用
DefWindowProc(),因为这时候需要绘制该窗口的子窗口
(5)WM_KEYDOWN:按键被按下消息
此消息需要键盘驱动程序自己发送,GUI不会自动发送该消息.GUI中已经预先定义了一些键作为系统操作键,如下:
VK_TAB:切换POPUP窗口
VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN:在子窗口中切换焦点
VK_F5:刷新当前窗口
VK_SPACE,VK_RETURN:确认一个操作,这个键确认后会向窗口发送其他一些消息(比如按钮会发送WM_COMMAND消息让回调函数区分是哪个键按下了)
(6)其他消息和参数请参考Win32.hlp,一般情况下消息名称和参数都和Win32系统兼容
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -