自己写一个窗口管理器

libbyliugang 2004-09-25 07:41:09
我想自己写一个窗口框架,我花了一个星期设计好了
类层次但是开始写代码是有个问题一个却缠了我半个月:

窗口的页面位置产生变化时各个窗口是怎样画的(实际上就是一个“窗口管理器”)?

谁能给我一点提示?
...全文
345 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fixopen 2004-10-14
  • 打赏
  • 举报
回复
我原来的练习,希望对你有用
#include <vector>
#include <ctime>

class Widget
{
friend WidgetManager; //for change zOrder private member;
public:
void notify(Message const* const message)
{
processMessage(message);
}

Rectangle const getRect(void);
private:
virtual void processMessage(Message const* const message);
private:
int _x;
int _y;
int _width;
int _height;
int _zOrder;
};

class WidgetManager
{
public:
virtual int const run(void)
{
Message* message = 0;
std::vector<Widget*> widgets;
int maxZOrder = 0;
Widget* widget = 0;
while (message = getMessage())
{
switch (message->type)
{
case mtKey:
_currentWidget->notify(message);
break;
case mtMouse:
widgets = findWidgetsByLocation(mouseLocation);
for (std::vector<Widget*>::iterator i = _widgets.begin(); i != _widgets.end(); ++i)
{
if (maxZOrder < (*i)->_zOrder)
{
maxZOrder = (*i)->_zOrder;
widget = *i;
}
}
if (widget)
{
_currentWidget = widget;
widget->notify(message);
}
break;
case mtSysKey:
break;
case mt...
break;
default:
break;
}
}
}
private:
std::vector<Widget*> findWidgetsByLocation(Point p)
{
std::vector<Widget*> result;
for (std::vector<Widget*>::iterator i = _widgets.begin(); i != _widgets.end(); ++i)
{
if (pointInRect(p, *i))
{
result.push_back(*i);
}
}
return result;
}

static bool const pointInRect(Point p, Rectangle rect)
{
//return ...;
}
private:
Widget* _currentWidget;
std::vector<Widget*> _widgets;
};

class Message
{
public:
int id;
enum Type type;
struct std::tm timestamp;
struct Rectangle rect;
enum KeyboardStatus keyboardState; //shift alt control ...
enum KeyCode keyCode;
bool keyIsDown;
enum MouseButton mouseButton;
bool mouseButtonIsDown;
Point mouseLocation;
};
libbyliugang 2004-10-14
  • 打赏
  • 举报
回复
to daylove & Flood1984 >>>>>>
事实上,我用的是c语言,没有用c++ ,更别说vc++了;
原因是:::::
暑假我与参加了我们学校的一个培训。学校的目的是选
出一些优秀学员去参加省里的“电子设计大赛”。在培
训期间有传言大赛题目是:声控电动小车 和 简易GPRS
系统。其中,GPRS 要求将接收到的信息显示在一个LCD
上。我们就买了块 LCD 。我就帮着写驱动程序,也就
是编一些在LCD上能显示字符,数字,汉字和一些简单
的图形的函数;
那知道后来,参赛的题目根本有一个与
GPRS有很大的关系。培训结束以后我将这些函数作了修
改,增补。重点是加了不少绘图函数。有一次,我突然
想到用这些绘图函数或许可以做一个嵌入式窗口系统 。
但是,在自己搭的电路板上调试很“麻烦”。我就将一
些函数合并或分解成与turbo c里图形函数相同的形式
(但是,仍然有些无法实现),我先用turbo c编这个
窗口系统在微机上运行,然后移植到单片机上。经过实
验,所有的基本函数都已通过调试。
但是,我遇到了一个问题:各窗口大小变化,切换,
移动都很难处理:
1.显示,切换速度慢;
2.显示残缺;
3.存储空间太大;
很明显,这些都是设计的问题;需要一些好的设计;我
字学过c++和设计模式和其他一些ooa/ood的书;由于
都涉及到“面向对象”;就用c++设计了一个类层次希
望找到好的设计方案(由c++到c的转换我会),但是,
失败了!!!(好象类层次并不能解决这个问题)

没办法只好求教于网络;可惜,网上关于窗口管理的东西
很少;我e文差得要死;也没时间看那么多e文;就希望论
坛上的各位大哥大姐能帮帮忙!

somedummy 2004-10-10
  • 打赏
  • 举报
回复
回复人: Wolf0403(完美废人)(潜伏期。。。) ( ) 信誉:110 2004-9-26 16:57:01 得分: 0



窗口框架?GUI 类库?Window Manager?你在说什么?



某废果然是在Linux里面走火入魔了,阿弥陀佛。
daylove 2004-10-10
  • 打赏
  • 举报
回复
用vc吗?
libbyliugang 2004-10-10
  • 打赏
  • 举报
回复
有没有办法支持键盘响应(不用多线程)?
libbyliugang 2004-10-10
  • 打赏
  • 举报
回复
窗体的切换更新问题基本得到解决(反应有点慢,有待以后优化,存储器我扩展了一块flash);

有没有办法支持不规则窗体--圆角窗体?

mydup 2004-09-27
  • 打赏
  • 举报
回复
最基本的方法是:
Window Manager记录着各个窗口的位置、大小和Z序,在任何一个窗口的位置,大小和Z序改变了以后,推算出那个窗口受到影响,也就是某些窗口的某些位置需要重画,然后通知这些窗口就行了。也就是说,所有的窗口都知道自己什么样。只要通知他们需要画哪一部分,就行了,Window Manager并不负责真正的画出这些窗口的内容来。
另外,oo(为了名副其实,努力学习oo技术ing)说得保存每个窗口的(看作bitmap)copy,也是可以的,并且可以提高性能,就是占用了大量的内存,从Windows2000开始就有了这样的优化,号称LayerWindow。
oo 2004-09-27
  • 打赏
  • 举报
回复
闪烁的问题可以通过先写到ram中,然后再画来解决。
效率就麻烦了。
还有一个办法,就是每个窗口都保存一份画这个窗口前的screen的一个copy,
要重画时,先把这个copy输出,然后再画,不过这样占用内存很大。
libbyliugang 2004-09-27
  • 打赏
  • 举报
回复
难道是我的想法一开始就根本不对??????
libbyliugang 2004-09-27
  • 打赏
  • 举报
回复
后来,我参考了这个文章》》
http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-5/index.shtml
但是它只讲了基本原理,图片也太特殊了,我想不通minigui的窗口管理器是怎样实现的。
郁闷..........
libbyliugang 2004-09-27
  • 打赏
  • 举报
回复
To ---> oo :
我开始也是这么设想的,但是,我觉得这样效率太低了。
如果,下层有一个显示毫秒定时的label,它不断的刷新
,那么将造成显示不稳定。
newpuple 2004-09-26
  • 打赏
  • 举报
回复
父类为窗口菜单管理类,子类为分类。
当窗口页面发生变化时,就关闭一个类,重新建立一个
oo 2004-09-26
  • 打赏
  • 举报
回复
在窗口栈里找到这么一个窗口,它能容纳所有它上面的窗口,
从这个窗口开始重画,它上面的所有窗口依次重画。
hcj2002 2004-09-26
  • 打赏
  • 举报
回复
^_^
Flood1984 2004-09-26
  • 打赏
  • 举报
回复
用的什么开发工具?
VC?
不会是纯 C++把
Wolf0403 2004-09-26
  • 打赏
  • 举报
回复
窗口框架?GUI 类库?Window Manager?你在说什么?
yoyo82 2004-09-26
  • 打赏
  • 举报
回复
哎呀,往往想得好,做起来就不那么顺手了啊。一样一样,经常这样。只有多想想了啦!!
lall 2004-09-25
  • 打赏
  • 举报
回复
好像板块 不对
正在学vc 只有顶了

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧