液晶条UI程序框架

来源:互联网 发布:linux c编程pdf下载 编辑:程序博客网 时间:2024/05/02 02:59

 

[按]最近将通信管理机中的液晶条显示系统信息的功能做了一次整理和完善.搭建了一个UI的框架.现把代码贴出来.有做类似工作的可以参考一下,同时也希望能交流.

飞信:846819528

 

// 头文件lcd.h

// 封装了液晶条的接口

#ifndef    _LCD_H
#define    _LCD_H

/*
*/
class    CLcd
{
    CLcd( CLcd& );
    CLcd& operator=( const CLcd& );
public:
    CLcd();
    ~CLcd();

    int    init();
    int    getProperty( int& width,int& height,int& bpp );

    int    width(){ return m_width; }
    int    height(){ return m_height; }
    int    bpp(){    return m_bpp; }

    // Ë¢ÐÂÒº¾§
    void    fresh();
    // ÉèÖõãÏóËØ
    void    pixel( const int& x,const int& y,const unsigned int& colidex );

    // Çå¿ÕÆÁÄ»
    void    clear( const unsigned int& colidex= 0 );

private:
    int    m_lcdFd;
    unsigned char*    m_lcdBuffer;

    int    m_width;
    int    m_height;
    int    m_bpp;
};

#endif

// 键盘接口

#ifndef    _KEYBOARD_H
#define    _KEYBOARD_H

/*
This document define keyboard interface.
*/

enum    EKeyCode
{
    KeyCode_Up,KeyCode_Down,KeyCode_Left,KeyCode_Right,KeyCode_Unknow
};

// ³õʼ»¯¼üÅÌ
int    initKeyBoard();
// ¹Ø±Õ¼üÅÌ
int    closeKeyBoard();

// ¶ÁÈ¡¼üÅÌʼþ,ûÓж¯×÷·µ»Øδ֪
EKeyCode    getKeyStatue();

// ¶ÁÈ¡¼üÅÌ
// seconds =0 ÂíÉÏ·µ»Ø,seconds<0 ÓÀ¾ÃµÈ´ý,seconds >0 µÈ´ýʱ¼ä
EKeyCode    waitKeyPressed();


#endif

 

//  核心部件,基类

#ifndef    _WIDGET_H
#define    _WIDGET_H

#include    <vector>
#include    "keyboard.h"
#include    "lcd.h"
#include    "hzk.h"

extern    CLcd*    WidgetLcd;

class    CWidget
{
public:
    CWidget( CWidget* parent=NULL );
    virtual ~CWidget();

    virtual void    show();
    virtual void    refresh();

    virtual void    keyLeft();
    virtual void    keyRight();
    virtual void    keyUp();
    virtual void    keyDown();

    void    setStart( const int& x,const int& y );
    void    setStartX( const int& x );
    void    setStartY( const int& y );
    int    startX()const;
    int    startY()const;

    void    setSize( const int& width,const int& height );
    void    setWidth( const int& width );
    void    setHeight( const int& height );
    int    width()const;
    int    height()const;

    void    setFreshTime( const int& freshSeconds );
    int    freshTime()const;

    void    set_OnLeft( CWidget*,void (CWidget::*pf)() );
    void    set_OnRight( CWidget*,void (CWidget::*pf)() );
    void    set_OnUp( CWidget*,void (CWidget::*pf)() );
    void    set_OnDown( CWidget*,void (CWidget::*pf)() );

    void        setParent( CWidget* parent );
    CWidget*        parent();
    const CWidget*    parent()const;

        // paintors on widget
  void pixel(const int& x,const int& y,const unsigned int& colidex);
  void clear( const unsigned int& colidex=0 );
  void clearLcd( const unsigned int& colidex=0 );
 
  void putChar( const int& x,const int& y,const unsigned int& colidex,const char& c );
  void putWord( const int& x,const int& y,const unsigned int& colidex,const char* w );
  void putString( const int& x,const int& y,const unsigned int& colidex,const char* str );
 
    // ´òÓ¡Ö±Ïß
    void    drawLine( const int& xs,const int& ys,const int& xe,const int& ye,const unsigned int& colidex );
    // ´òÓ¡Ô²
    void    drawCircle(const int& x,const int& y,const int& r,const unsigned int& colidex );
    void    paintCircle(const int& x,const int& y,const int& r,const unsigned int& colidex );
    // ´òÓ¡¾ØÐÎ
    void    drawRectangle( const int& xleftUp,const int& yleftUp,const int& xrightDown,const int& yrightDown,const unsigned int& colidex );
    void    paintRectangle( const int& xleftUp,const int& yleftUp,const int& xrightDown,const int& yrightDown,const unsigned int& colidex );
    // ´òÓ¡»¡Ïß
    void    drawArc( const int& x,const int& y,const int& r,const double& as,const double& ae,const unsigned int& colidex );
    void    paintArc( const int& x,const int& y,const int& r,const double& as,const double& ae,const unsigned int& colidex );

private:
    int    m_startX;
    int    m_startY;
    int    m_width;
    int    m_height;

    int    m_freshTime;

    CWidget*    m_widget_left;
    CWidget*    m_widget_right;
    CWidget*    m_widget_up;
    CWidget*    m_widget_down;
    void    (CWidget::*m_on_left)();
    void    (CWidget::*m_on_right)();
    void    (CWidget::*m_on_up)();
    void    (CWidget::*m_on_down)();
   
    CWidget*    m_parent;
    std::vector<CWidget*>    m_children;

    CHzk<16,16>    m_hzk;
};

#endif

 

// 应用对象类

#ifndef    _LCD_APP_H
#define    _LCD_APP_H

class    CWidget;

class    CApp
{
public:
    static CApp*    app();

public:
    CApp();
    ~CApp();

    int    setShowWidget( CWidget* );

    int    exec();
private:
    CWidget*    m_showWidget;
};

#endif

 

 

// 示例

// 所有的部件都继承自widget类.

 

#include    <unistd.h>
#include    <fcntl.h>
#include    "ifconfig.h"
#include    <iostream>
#include    <sys/ioctl.h>
#include    <linux/kd.h>

#include    "lcdapp.h"
#include    "pagemain.h"
#include    "pagemenu.h"
#include    "pageip.h"
#include    "pageport.h"
#include    "pagehelp.h"
#include    "pageabout.h"

using namespace std;

int    main( int argc,char* argv[]  )
{
    CApp    app;

    CPageMain    page_main;
    CPageMenu    page_menu;
    CPageIp        page_ip;
    CPagePort    page_port;
    CPageHelp    page_help;
    CPageAbout    page_about;

    page_main.set_OnRight( &page_menu, (&CWidget::show) );
    page_menu.set_OnLeft( &page_main,(&CWidget::show) );

    page_menu.setCommand(0,(&CWidget::show),&page_ip );
    page_menu.setCommand(1,(&CWidget::show),&page_port);
    page_menu.setCommand(2,(&CWidget::show),&page_help );
    page_menu.setCommand(3,(&CWidget::show),&page_about );

    page_ip.set_OnLeft( &page_menu,(&CWidget::show) );
    page_port.set_OnLeft( &page_menu,(&CWidget::show) );
    page_help.set_OnLeft( &page_menu,(&CWidget::show) );
    page_about.set_OnLeft( &page_menu,(&CWidget::show) );

    page_main.show();

    app.exec();

    cout    <<"OK"<<endl;
    return 0;
}

原创粉丝点击