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

#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;
}

你可能感兴趣的:(DFB 用键盘和鼠标控制图片移动的小例子)