minigui程序的退出、编辑框文本限的设置

minigui-1.6.8

 

以前一直没注意一个问题,就是在我的minigui应用程序中使用如下两个语句


     DestroyMainWindow (hWnd);
     PostQuitMessage (hWnd);

 

使应用程序退出里,其实还有个minigui的桌面依然存在。今天在做一个调试,想使整个minigui程序都退出,使我的系统回到命令行界面。因此注意到了这个问题。于是稀里糊涂的在


 MainWindowThreadCleanup(hMainMenuWnd);

 

后面加了个

 

exit(1);

 

心想,这下不管你什么程序都得退出了吧。可是真正运行时发现我的开发板的显示屏上还是有个桌面存在,控制台是回到了命令行界面。这才开始关注minigui程序的退出。于是查看minigui的源代码,发现有一个桌面线程在minigui的初始化时建立,此后会一直在消息循环。直到它收到MSG_QUIT消息,上述几个函数都不会给桌面线程发送这个消息,所以桌面也就不会退出了,即使用exit(1)使应用程序退出,桌面上画的东东也没人清理。于是在


 MainWindowThreadCleanup(hMainMenuWnd);

 

下面加了一行 

 

    PostQuitMessage (HWND_DESKTOP);

 

这样,桌面线程就会退出了,还会所桌面清理的干干净净。当然还释放一些在初始化时建立的资源。

 

 

在使用编辑框时,也碰到了一个问题,就是我用下面语句


   SendMessage (GetDlgItem(hWnd, ID_PRT_TITLE), EM_LIMITTEXT, 80, 0L);

 

设置文本限时发现编辑框中的文本并没有被限制为80,这让我很奇怪。开始以为自己的程序有错,后来找了很久都没发现错误。于是只好追踪minigui的源代码。这才发现原来编辑框在创建时,会根据其控件的caption传递的字符长度,动态的计算其允许的最大文本长度,以后编辑框中文本改变时,它都会动态的重新计算。而我用上面的语句设置文本限时,文本限80超过了它所计算的最大文本长度。因此我设置的文本限也就不起作用了。后来改了它的源代码,不让它动态计算了,让他固定为100。在我的项目中,这个长度足够了。不够还可以再改:)

 

libminigui-1.6.8/src/include/control/text.h中


/* alloc with a unit of blocksize */
static inline void*
testr_alloc (StrBuffer *txtbuff, size_t len, size_t blocksize)
{
    txtbuff->buffsize = (len + 1) + (blocksize - (len + 1)%blocksize);
    txtbuff->string = te_alloc (txtbuff->buffsize);
    txtbuff->blocksize = blocksize;
    //txtbuff->txtlen = len;
    return txtbuff->string;
}

 

改为


/* alloc with a unit of blocksize */
static inline void*
testr_alloc (StrBuffer *txtbuff, size_t len, size_t blocksize)
{
    //txtbuff->buffsize = (len + 1) + (blocksize - (len + 1)%blocksize);   

    txtbuff->buffsize = 100;
    txtbuff->string = te_alloc (txtbuff->buffsize);
    txtbuff->blocksize = blocksize;
    //txtbuff->txtlen = len;
    return txtbuff->string;
}

OK,大功告成。

 

修改 09/12/30

最近又研究了一下编辑框的实现代码,发现直接修改txtbuff->buffsize = 100;并不好,于是把它恢复为原来的计算方式,转而修改blocksize这个实参的值。这个参数的实参是sled->nBlockSize的值,该值在函数sledit_init中被初始化为DEF_LINE_BLOCK_SIZE,而这个宏在文件src/include/control/edit_impl.h的35行定义

#define DEF_LINE_BLOCK_SIZE     32

计算式

(len + 1) + (blocksize - (len + 1)%blocksize)

是为了保存文本缓冲区的最小长度为blocksize(当len为0时),即DEF_LINE_BLOCK_SIZE,所以这里修改这个宏定义

#define DEF_LINE_BLOCK_SIZE     100

这样就可以保存该缓冲区的最小长度够用,而且不影响其他函数调用函数testr_alloc 的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值