DFB 用键盘和鼠标控制图片移动的小例子

    技术2022-05-20  48

    #include <stdio.h> #include <unistd.h> #include <directfb/directfb.h> static IDirectFB *dfb = NULL; static IDirectFBEventBuffer        *events  = NULL; static IDirectFBSurface *primary = NULL; static IDirectFBSurface *logo = NULL;//此IDirectFBSurface为用于显示的图片    static DFBSurfaceDescription dsc; static IDirectFBImageProvider *provider;    //要显示图片,必须要有一个IDirectFBImageProvider,                                             //此接口一般用于收集图片信息,                                             //并将图片提供给IDirectFBSurface显示 static int screen_width = 0; static int screen_height = 0; static int pic_x = 0;    //图片的x坐标 static int pic_y = 0;    //图片的y坐标 int myBitBlit(int x, int y)//绘制图形 {     primary->FillRectangle(primary, 0, 0, screen_width - 1,screen_height - 1);     primary->Blit(primary, logo, NULL, x, y);     //primary->Blit(primary, logo, NULL, i, (screen_height- dsc.height) / 2);     //上面Blit函数原型为:     //Blit(IDirectFBSurface *thiz, IDirectFBSurface *source, const DFBRectangle *source_rect, int x, int y);     //如果source_rect为NULL,则使用整个平面。DFBRctangle为一个矩形框,由两个点的坐标确定。     //x, y为图像左上角在屏幕上的坐标。     primary->Flip(primary, NULL, DSFLIP_WAITFORSYNC);     return 0; } int exit_app( void)//注销函数,销毁申请的变量 {      /* Release the event buffer. */     if (events){         events->Release( events );     }     if(logo){         logo->Release(logo);     }         if(primary){         primary->Release(primary);     }         if(dfb){         dfb->Release(dfb);     }         exit(0); } int actionMonitor(void) {     DFBEvent    evt;     events->WaitForEvent(events);    //等待事件     while(events->GetEvent(events, &evt) == DFB_OK){         if(evt.clazz != DFEC_INPUT){//判断是否是输入事件             break;         }         if(evt.input.type == DIET_KEYPRESS){//响应键盘事件             switch (evt.input.key_symbol){                 case DIKI_ENTER:                     printf( "ENTER %s(%d); /n", __FILE__, __LINE__);                     break;                 case DIKS_ESCAPE:                 case DIKS_POWER:                 case DIKS_BACK:                 case DIKS_SMALL_Q:                 case DIKS_CAPITAL_Q:                      return -1;                      break;                 case DIKS_CURSOR_LEFT:                 case DIKI_LEFT:                     pic_x--;                     printf( "LEFT %s(%d); /n", __FILE__, __LINE__);                     break;                 case DIKS_CURSOR_RIGHT:                 case DIKI_RIGHT:                     pic_x++;                     printf( "RIGHT %s(%d); /n", __FILE__, __LINE__);                     break;                 case DIKS_CURSOR_UP:                 case DIKI_UP:                     pic_y--;                     printf( "UP %s(%d); /n", __FILE__, __LINE__);                     break;                 case DIKS_CURSOR_DOWN:                 case DIKI_DOWN:                     pic_y++;                     printf( "DOWN %s(%d); /n", __FILE__, __LINE__);                     break;                 default:                     break;             }         }//if(evt.input.type == DIET_KEYPRESS)//响应键盘事件                 if(evt.input.type == DIET_AXISMOTION){//响应鼠标事件             if(evt.input.flags & DIEF_AXISREL){                 switch(evt.input.axis){                     case DIAI_X:                          pic_x += evt.input.axisrel;                          break;                     case DIAI_Y:                          pic_y += evt.input.axisrel;                          break;                     default :                          break;                 }//switch(evt.input.axis){                 if(pic_x < 0){pic_x = 0;}                 if(pic_y < 0){pic_y = 0;}             }         }//if DIET_AXISMOTION){//响应鼠标事件     }//while(!quit && events->GetEvent(events, &evt) == DFB_OK)         return 0; } //int actionMonitor(void )//事件监听只响应键盘 //{ //    DFBInputEvent event; // //    while (events->GetEvent( events, DFB_EVENT(&event) ) == DFB_OK){ //        if (event.type == DIET_KEYPRESS){ //            switch (event.key_symbol){ //                case DIKI_ENTER: //                    printf( "ENTER %s(%d); /n", __FILE__, __LINE__); //                    break; //                case DIKS_ESCAPE: //                case DIKS_POWER: //                case DIKS_BACK: //                case DIKS_SMALL_Q: //                case DIKS_CAPITAL_Q: //                     return -1; //                     break; // //                case DIKS_CURSOR_LEFT: //                case DIKI_LEFT: //                    pic_x--; //                    printf( "LEFT %s(%d); /n", __FILE__, __LINE__); //                    break; //                case DIKS_CURSOR_RIGHT: //                case DIKI_RIGHT: //                    pic_x++; //                    printf( "RIGHT %s(%d); /n", __FILE__, __LINE__); //                    break; //                case DIKS_CURSOR_UP: //                case DIKI_UP: //                    pic_y--; //                    printf( "UP %s(%d); /n", __FILE__, __LINE__); //                    break; //                case DIKS_CURSOR_DOWN: //                case DIKI_DOWN: //                    pic_y++; //                    printf( "DOWN %s(%d); /n", __FILE__, __LINE__); //                    break; //                default: //                    break; //                } //            }//if (event.type == DIET_KEYPRESS){ //        } // //    return 0; //} int main(int argc, char **argv) {     int ret = 0;     DirectFBInit(&argc, &argv);//程序初始化语句     DirectFBCreate(&dfb);     dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);     dsc.flags = DSDESC_CAPS;     dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;     dfb->CreateSurface(dfb, &dsc, &primary);     primary->GetSize(primary, &screen_width, &screen_height);     //利用指定的图片来创建一个image provider     dfb->CreateImageProvider(dfb, "./my.jpg", &provider);     //获取一个DFBSurfaceDescription,此描述与image provider中的图像相匹配     provider->GetSurfaceDescription(provider, &dsc);     //利用平面描述来创建一个平面,在这里,这个平面即与图像相匹配     dfb->CreateSurface(dfb, &dsc, &logo);     //将图像呈递给logo,并自动进行缩放,要注意:如果图像带有alpha通道,则目的层(logo)的像素格式为ARGB,     //否则图像文件的透明部分将会和黑色背景混合,这里DFBRectangle参数用的是NULL,则将自动进行缩放     provider->RenderTo(provider, logo, NULL);     //到此,provider已经没用,这里将其释放     provider->Release(provider);     ret = dfb->CreateInputEventBuffer( dfb, DICAPS_ALL, DFB_TRUE, &events );     //ret = dfb->CreateInputEventBuffer( dfb, DICAPS_KEYS, DFB_FALSE, &events );     if (ret)     {         DirectFBError( "IDirectFB::CreateEventBuffer() failed", ret );         return -1;     }     //for (i = -dsc.width; i < screen_width; i++)     myBitBlit(pic_x, pic_y);     while (1){         ret = actionMonitor();         if(ret == -1){             break;         }         myBitBlit(3*pic_x, 3*pic_y);     }     exit_app();     return 0; }


    最新回复(0)