在BREW中实现自己的GUI(6)-单选框与复选框的实现

本文介绍如何在BREW环境中自制单选框与复选框UI控件,包括控件结构设计、接口函数定义及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还有一个常用的UI控件是单选框与复选框。可惜BREW也不提供,所以,只能自己做一个了。

先看一下每个选项的结构定义,我们用图片来做那个选中和未选中的显示,这样才能做出更多更美观的界面效果,所以在结构中有两个成员pCkImage和pNrImage,同时,isSelected用来记录此项是否被选中:

typedef struct 
...{
    
int          nItemID;
    AECHAR    
* pText;

    IImage    
* pCkImage;
    IImage    
* pNrImage;

    
const char    * pszResFile;
    uint16        wCkImage;
    uint16        wNrImage;    

    boolean        isSelected;
}
 TGBOption;

 而整个控件的结构如下:

struct _IGButton ...{
    
    
const AEEVTBL(IGButton) * pvt;

    uint32          m_nRefs;    
    IShell            
*m_pIShell;
    IDisplay        
*m_pIDisplay;
    IModule            
*m_pIModule;

    boolean            m_isActive;
    AEERect            m_Rect;    

    uint32            props;

    AECHAR            
*pTitle;
    AEEFont            titleFont;
    RGBVAL            titleColor;

    IImage            
*pBkImage;

    TQueueList        
*pOptionList;
    
int                m_Index;

}
;

同样是用 TQueueList来保存一个选项的链表,当前少不了m_Index当前项了。

需要的接口函数定义如下:

AEEINTERFACE(IGButton)
...{
    DECLARE_IBASE(IGButton)

    DECLARE_ICONTROL(IGButton)

    boolean     (
*SetTitle)            (IGButton * po, AECHAR * szText,AEEFont font,RGBVAL color);
    boolean     (
*SetBkImage)        (IGButton * po, IImage * img);
    boolean        (
*AddOption)        (IGButton * po, TGBOption *opt);
    boolean        (
*IsChecked)        (IGButton * po,int idx);
    
int            (*GetSel)            (IGButton * po);
    
int            (*GetItemCount)        (IGButton * po);
    
}
;


下面来看看实现,同样的先看HandleEvent,需要处理上下方向键,修改m_Index以改变当前项;处理SELECT键处理选中/取消选中的操作。

在Redraw函数中呢?遍历一下那个pOptionList链表,根据每个项是否选中,绘制出来即可。

static boolean IGButton_Redraw(IGButton * pMe)
...{
    
int i,j,height,h,a,b;
    
int xx,yy,dxx,dyy;
    AEERect rec;
    AEEImageInfo infIc;
    RGBVAL oldColor;
    
    TQueueList 
* p = pMe->pOptionList;
    
    h
=IDISPLAY_GetFontMetrics(pMe->m_pIDisplay,AEE_FONT_NORMAL,&a,&b);
        
    IDISPLAY_EraseRect(pMe
->m_pIDisplay,&pMe->m_Rect);

    
if(pMe->pBkImage)
    
...{
        IIMAGE_SetDrawSize(pMe
->pBkImage,pMe->m_Rect.dx,pMe->m_Rect.dy);
        IIMAGE_Draw(pMe
->pBkImage,pMe->m_Rect.x,pMe->m_Rect.y);
    }

        
    oldColor 
= IDISPLAY_SetColor(pMe->m_pIDisplay,CLR_USER_TEXT,MAKE_RGB(0,0,0));

    i
=0;
    height
=pMe->m_Rect.y;
    
while(p)
    
...{
        IImage 
* img;
        TGBOption 
* pData=(TGBOption*)p->pData;

        
if(pData->isSelected)
            img
=pData->pCkImage;
        
else
            img
=pData->pNrImage;
            
        ZEROAT(
&infIc);
        
if(img)
        
...{
            IIMAGE_GetInfo(img,
&infIc);
            IIMAGE_Draw(img,pMe
->m_Rect.x,height);
        }

        
        xx
=pMe->m_Rect.x+infIc.cx;
        yy
=height+(infIc.cy-h)/2;
        dxx
=pMe->m_Rect.x+pMe->m_Rect.dx-xx;
        dyy
=h;
        SETAEERECT(
&rec,xx,yy,dxx,dyy);        
        IDISPLAY_DrawText(pMe
->m_pIDisplay,AEE_FONT_NORMAL,pData->pText,-1,xx,yy,&rec,IDF_TEXT_TRANSPARENT);

        
if(i==pMe->m_Index)
        
...{
            xx
=pMe->m_Rect.x;
            yy
=height;
            dxx
=infIc.cx+IDISPLAY_MeasureText(pMe->m_pIDisplay,AEE_FONT_NORMAL,pData->pText);;
            dyy
=infIc.cy;
            SETAEERECT(
&rec,xx,yy,dxx,dyy);    

            IDISPLAY_DrawRect(pMe
->m_pIDisplay,&rec,MAKE_RGB(0,0,250),0,IDF_RECT_FRAME);
        }

            
        height
+=infIc.cy;

        p
=p->pNext;
        i
++;

    }


       
    IDISPLAY_Update(pMe
->m_pIDisplay);
    IDISPLAY_SetColor(pMe
->m_pIDisplay,CLR_USER_TEXT,oldColor);    

    
return TRUE;
}


还有一件事,如果在程序中取到这个组件的结果呢?如果是单选就可以直接GetSel了,如果是复选则循环一下一个个判断是否选中IsChecked即可:

static boolean IGButton_IsChecked(IGButton * pMe,int idx)
...{
    
if(pMe->props&0x01==GBTN_STYLE_CHECK)
    
...{
        TGBOption 
* pData=(TGBOption*)Queue_Get(pMe->pOptionList,idx);
        
if(pData)
        
...{
            
return pData->isSelected;
        }
        
    }

    
return FALSE;
}

static int    IGButton_GetSel(IGButton * pMe)
...{
    
if((pMe->props&0x01)==GBTN_STYLE_RADIO)
    
...{
        TQueueList 
* p=pMe->pOptionList;
        
//int i = 0;
        while(p)
        
...{
            TGBOption 
* pData=(TGBOption*)p->pData;
            
if(pData && pData->isSelected)
                
return pData->nItemID;
            
//i+=1;
            p=p->pNext;            
        }

    }

    
return -1;
}


OK,基本上搞定。

内容概要:本文详细介绍了Rust在系统编程中的应用,包括基础知识、核心技术及开发流程。首先阐述了Rust语言的基础及环境搭建,强调了其强类型系统和现代语法。接着深入探讨了所有权机制内存安全,指出Rust通过所有权系统确保内存安全,避免悬垂指针和内存泄漏。再者,讲解了Rust的并发编程模型,通过消息传递和无数据竞争的线程模型实现安全并发。此外,讨论了Rust在底层硬件访问嵌入式开发中的应用,展示了其在资源受限平台上的适应性。随后,介绍了系统调用内核模块开发,说明了Rust如何调用操作系统底层API并实现现有内核代码的无缝集成。还提及了性能优化调试技巧,如使用编译器优化选项和工具链支持。最后,通过实战项目案例解析和社区资源展望,展示了Rust在系统编程领域的潜力和发展前景。; 适合人群:有一定编程基础,尤其是对系统编程感兴趣的开发者,包括操作系统内核开发、驱动程序编写、嵌入式系统开发等领域的工程师。; 使用场景及目标:①学习Rust语言的基础知识和环境搭建,掌握强类型系统和现代语法;②理解所有权机制内存安全,避免传统系统编程中的常见错误;③掌握并发编程模型,实现安全高效的多线程操作;④了解底层硬件访问和嵌入式开发,适应资源受限平台;⑤掌握系统调用内核模块开发,实现现有系统的无缝集成;⑥学习性能优化调试技巧,提高系统软件的运行效率和稳定性;⑦通过实战项目案例解析,掌握系统编程的实际应用。; 其他说明:Rust作为系统编程的新选择,不仅提升了传统系统软件的安全性,还通过现代语言特性和工具链优化了开发效率。开发者应充分利用Rust的特性,构建更加健壮、高效的系统软件,迎接未来计算机领域的新挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值