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 的结果。