[DFB] 移动鼠标绘制线条

/*1。surface的绘图函数
2。如何在surface中获取类似framebuffer的绘制内存地址(去掉代码中的注释)
3。eventbuffer的使用,按escape退出,按c 键清屏 ,移动鼠标绘线条 (平滑度有待改进)*/


#include <stdio.h>

#include <directfb/directfb.h>

static IDirectFB                *dfb = NULL;
static IDirectFBDisplayLayer    *layer = NULL;
static IDirectFBSurface            *surface = NULL;
static IDirectFBEventBuffer        *events = NULL;

static int screen_width = 0;
static int screen_height = 0;

int main(int argc, char *argv[])
{
    int pitch;
    int i,j;
    int quit = 0;
    int x = 0, y = 0, old_x = 0, old_y = 0;

    DirectFBInit(&argc, &argv);
    DirectFBCreate(&dfb);

    dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer);
    dfb->CreateInputEventBuffer(dfb, DICAPS_ALL, DFB_TRUE, &events);
    layer->SetCooperativeLevel(layer, DLSCL_EXCLUSIVE);
    layer->GetSurface(layer, &surface);

    surface->GetSize(surface, &screen_width, &screen_height);

    surface->SetColor(surface, 0, 56, 0 , 0xff);
    surface->FillRectangle(surface, 0, 0, screen_width, screen_height);

    while(!quit){
        DFBEvent    evt;
        events->WaitForEvent(events);    //等待事件

        while(!quit && events->GetEvent(events, &evt) == DFB_OK){
            if(evt.clazz == DFEC_INPUT){
                    switch(evt.input.type){
                        case    DIET_KEYPRESS: //响应键盘事件
                            if(evt.input.key_symbol == DIKS_ESCAPE){//退出程序
                                quit = 1;
                            }else     if(evt.input.key_symbol == DIKS_SMALL_C){//清屏
                                surface->SetColor(surface, 0, 0, 0 , 0xff);//设置当前色
                                surface->FillRectangle(surface, 0, 0, screen_width, screen_height);
                            }
                            break;

                        case    DIET_AXISMOTION:
                            if(evt.input.flags & DIEF_AXISREL){
                                switch(evt.input.axis){
                                    case DIAI_X:
                                         x+=evt.input.axisrel;
                                         break;
                                    case DIAI_Y:
                                         y+=evt.input.axisrel;
                                         break;
                                    default :
                                         break;
                                }//switch(evt.input.axis){

                                if(x < 0){x = 0;}
                                if(y < 0){y = 0;}
                            }

                            surface->SetColor(surface, 0, 0xff, 0, 0xff);
                            surface->DrawLine(surface, old_x, old_y, x, y);
                            old_x = x;
                            old_y = y;
                            break;

                        default:
                            break;
                    }//switch
                }//if
            }//while(!quit && events->GetEvent(events, &evt) == DFB_OK){
    }//while(!quit){

    surface->Release(surface);
    layer->Release(layer);
    dfb->Release(dfb);

    return 0;
}

你可能感兴趣的:([DFB] 移动鼠标绘制线条)