Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1532560
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: LINUX

2007-07-30 00:10:57

北京理工大学 20981 陈罡
a1200的触摸屏开发,如果完全从底层开发的话,那就是对/dev/touchscreen设备文件的访问和操作了。
但是有一个很郁闷的问题,那就是本身手机的gui环境——ezx,就在使用着这个文件,我编写程序测试过,
我用程序直接打开/dev/touchscreen,得到每次16个字节的数据,可以知道起总0xffff后面的就是真实触摸屏数据了,但是系统会对鼠标动作进行处理和响应,直接会切出你的程序。
所以,只有两个选择,第一个是在你的程序启动以后,把ezx系统的qwe的windowserver环境关掉,就不会影响/dev/touchscreen文件数据读取和响应;第二个是利用现有的ezx破解头文件,重载其中的可以处理鼠标事件的类,完成鼠标事件的捕获。
#include
#include
#include
#include
class MyApplication:public QApplication{
  //Q_OBJECT, 这里没有用qt常用的宏,不知道是为什么。。。可能破解不完全吧。
public:
  MyApplication(int argc,char **argv):QApplication(argc,argv) {}
  virtual ~MyApplication() {}
  virtual bool   qwsEventFilter( QWSEvent * event) {
    QApplication::qwsEventFilter(event);
    QWSMouseEvent * mouse = NULL;
    QWSFocusEvent * focus = NULL ;
    int x,y,z;
    if(!event) return false;
    switch(event->type){
    case QWSEvent::NoEvent:
      //printf("no event\n");
      break;
    case QWSEvent::Connected:
      //printf("connected\n");
      break;
    case QWSEvent::Mouse:
      mouse = event->asMouse();
      if(mouse==0) return false;
      x=mouse->simpleData.x_root;
      y=mouse->simpleData.y_root;
      z=mouse->simpleData.state;
      printf("mouse: x=%d,y=%d,state=%d\n",x,y,z);
//这里的x,y代表触摸笔在触摸屏上的坐标,z代表当前的按压状态,z=1时,代表触摸笔是贴在触摸屏上的,z=0时,代表触摸笔离开触摸屏,我们可以通过对z值变化的判断来确定触摸笔的单击或者双击,例如:z值从1变为0,代表用户按下后,又离开触摸屏,代表一次click事件。当z全为1,并且x值有增大趋势时,代表用户向上滑动触摸笔,反之代表向下滑动触摸笔,由此可以计算出滑动的速度,加速度,利用这些参数,就可以做出类似苹果的iphone界面效果的ui出来。
      break;
    case QWSEvent::Focus:
      focus=(QWSFocusEvent *)event;
      printf("focus %d\n",focus->simpleData.get_focus);
      break;
    case QWSEvent::Key:
      //printf("key\n");
      break;
    }
    return false ;
  }
};
 
int main (int argc, char** argv)
{
   MyApplication app (argc, argv);
   QWidget* w = new QWidget ;
   app.setMainWidget ((QWidget *)w);
   w->showFullScreen();
   return app.exec();
}
 
编译的时候,偶是直接编写makefile的,没有用openezx项目中提到的工具。所以稍微繁琐一点:
EZX_BASE=..
XPREFIX=arm-linux-
CXX=$(XPREFIX)g++
CC=$(XPREFIX)gcc
STRIP=$(XPREFIX)strip
CXXFLAGS=-fno-exceptions -fno-rtti -DQWS -Wall -g
MOC=$(EZX_BASE)/moc/moc
INCLUDE=-I$(EZX_BASE)/include/qt -I$(EZX_BASE)/include/ezx
LIBDIRS=-L$(EZX_BASE)/lib -L$(EZX_BASE)/lib/ezx/lib
LIBS= -lezxappsdk -lipp-jp -lezxopenwindow -lipp-miscGen -lezxappbase -lqte-mt -lezxjpeg -lezxpm -lpthread
OBJS=t3.o
APP=t3
all: $(APP)
dist: $(APP).pkg
t3.o: t3.cpp t3.moc
$(APP).pkg: $(APP).o
 $(STRIP) $(APP)/$(APP)
 tar cvfz $(APP).tar.gz $(APP)
 mv $(APP).tar.gz $(APP).pkg
clean:
 rm -f $(OBJS) $(APP)/$(APP) $(APP).pkg *~ $(APP)/*~ *.moc
%.o: %.cpp
 $(CXX) $(CXXFLAGS) $(INCLUDE) -c $<
%.moc: %.cpp
 $(MOC) $< -o $@
$(APP): $(OBJS)
 $(CXX) $^ -o $(APP)/$@ $(LIBDIRS) $(LIBS)
下面是telnet运行后的输出:
 
阅读(3876) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~