You are here

Как я GUI искал

В процессе сотворения ми.., тьху, небольшого устройства с цветным графическим ЖКИ столкнулся я с тем, что информации в сети море, а толковой и нет почти. Посему выложу сюда свою коллекцию ссылок и всякую ерунду на эту тему.

http://www.empresent.com/
http://www.kadak.com/html/kdkp1040.htm
http://www.haidartechnology.com/Home_Page.html
http://www.trolltech.com/
http://opie.handhelds.org/
http://gpe.handhelds.org/
http://www.microwindows.org/
http://www.libsdl.org/
http://www.directfb.org/
http://www.bluewatersys.com/
http://www.easygui.com/default.asp
http://visualtft.com/
http://monotypeimaging.com/ProductsServices/SpectraWorks.aspx
http://wiki.altium.com/display/ADOH/Visual+Designer+for+Embedded+ GUI+ %28... ????
http://dmilvdv.narod.ru/Translate/ELSDD/index.html?elsdd_nano_x.html
http://www.trolltech.com/products/embedded/index.html
http://qt.digia.com/product/
http://qt-project.org/
http://qt.nokia.com/
http://www.gtk.org/
http://www.fltk.org/
http://www.minigui.com/
http://www.picogui.org/
http://lampogolovii.blogspot.ru/2012/05/ gui-buttonsdemo .html

http://www.tara-systems.de/emwi-dlc.html
http://www.embedded-wizard.de/download.html

http://www.microsoft.com/net/multiple-platform-support
http://ru.wikipedia.org/wiki/.NET_Micro_Framework

 GUI  Builders
http://www.autoitscript.com/site/autoit/
http://www.gnustep.org/
http://www.gnustep.org/experience/Gorm.html
http://glade.gnome.org/
http://monodevelop.com/Stetic_ GUI _Designer
http://en.wikipedia.org/wiki/Motif_%28widget_toolkit%29
http://pencil.evolus.vn/
http://www.microsoft.com/expression/products/Blend_Overview.aspx
http://sourceforge.net/projects/wxformbuilder/
http://wxwidgets.org/
wxGlade
wxFormBuilder
wxPython
http://www.cranksoftware.com/
http://netbeans.org/features/java/swing.html
http:// gui-builder .com

http://www.lynuxworks.com/partners/ gui .php
http://www.presagis.com/products_services/products/embedded-graphics/hmi...
http://www.kinesix.com/
http://www.empress.com/web-bin/ehsql/index.html
http://www.disti.com/index.html
http://www.psa-software.com/main.php

http://www.lynuxworks.com/

==========

 

==========

А с Segger-ом ввели в заблуждение.
Показанный скриншот с примером графика в построителе сегера сделать невозможно.
Но зато построитель GUIBuilder абсолютно совместим с ucGUI которую тут много раз выкладывали и которою тоже в той статье не упомянули.

Всем доброго времени суток. Я использую графику от Seggera (emWin). Что касается Micrium-а (ucGUI) это тот же самый сегер.
Что касается проекта emWin под Visual Studio, то этот проект сделан для отладки, причем довольно хорошей отладки( Пишу код в вижуале, смотрю что получается на экране отладчика потом этот же самый код уже заливаю в микроконтроллер). Довольно удобно при начале работы с либой.
Если использовать графику от сеггера (микриума) то низкоуровневыце функции нужно писать самому(я брал примеры и правил под свою плату). Для сеггера (микриума) есть драйвера для работы с дисплеем по SPI (см. доку) но низкоуровневые функции все равно нужно писать самому.
Кстати говоря где то я читал что Keil начал включать либу сеггера в свою MDK.
Что касается опыта работы с emWin в принципе либа неплохая, если не предъявлять к графике серьезных требований. Немного не доработан модуль Memory Device, из-за чего, при большом нагромождении виджетов видно как отрисовываеться окно и виджеты на нем. Также есть нарекания к дизайну самих виджетов, в основном писал свои Callback функции для прорисовки( требовалось "навести красоту")))). Писать Callback функции особой сложности не составляет, но в начале повозился пока разобрался что и как)))
Пользуюсь довольно долго (года 2 так точно). Проц LPC2478. Версия enWin 3.90 - старая, но свежее не нашел. Пробовал скомпиленую либу которую парят NXP под свои процы, не понравилась- сильные тормоза, но особо копаться времени не было - возможно это можно вылечить, да и под кортексы возможно тормозов не будет.

=====================================================================================================================

>можно ли виджет, написанный "по мотивам" исходников 3.98 заставить работать с предкомпиленной версией emWIN из Кейла (4.16 кажется сейчас)
Не могу ответить на этот вопрос т.к не пробовал. Что касается самописного виджета то я довольствовался написанием собственной функции для отрисовки виджета. Код привожу ниже.

CODE

/*********************************************************************
*
* CallBackBut.c
*
*/
#include " GUI .h"
#include "WM.h"
#include "FRAMEWIN.h"
#include "BUTTON.h"
#include "BUTTON_Private.h"
#include " GUI _Protected.h"
#include "mystyle.h"

/*********************************************************************
*
* Defines
*
*/
#define Style_Dark_Blue 1
#define Style_Dark_Blue_1 1+1
#define Style_Light_Blue 3
#define Style_Light_Blue_1 3+1
#define Style_Silver 5
#define Style_Silver_1 5+1
#define Style_Yellow 7
#define Style_Yellow_1 7+1
#define Style_Red 9
#define Style_Red_1 9+1
#define Style_Green 11
#define Style_Green_1 11+1

#define BUTTON_FLASHING_ENABLE WIDGET_STATE_USER1
#define BUTTON_FLASHING_UP WIDGET_STATE_USER2

/*********************************************************************
*
* GetColorPalette
*
*/

static t_2Colors GetColorPalette(int _Style)
{
t_2Colors RetPalette;
switch (_Style)
{
case Style_Dark_Blue:
case Style_Dark_Blue_1:
RetPalette.Col_1=0xFFD192;
RetPalette.Col_2=0xFFB146;
break;
case Style_Light_Blue:
case Style_Light_Blue_1:
RetPalette.Col_1=0xFFF4E5;
RetPalette.Col_2=0xFFE8C9;
break;

case Style_Silver:
case Style_Silver_1:
RetPalette.Col_1=0xECECEC;
RetPalette.Col_2=0xCECECE;
break;

case Style_Yellow:
RetPalette.Col_1=0x86CDE8;
RetPalette.Col_2=0x22C0F1;
break;
case Style_Yellow_1:
RetPalette.Col_2=0x86CDE8;
RetPalette.Col_1=0x22C0F1;
break;
case Style_Red:
RetPalette.Col_1=0x0000ff;
RetPalette.Col_2=0x0000D9;
break;
case Style_Red_1:
RetPalette.Col_2=0x0000ff;
RetPalette.Col_1=0x0000D9;
break;
case Style_Green:
RetPalette.Col_1=0x3Dff3D;
RetPalette.Col_2=0x00D600;
break;
case Style_Green_1:
RetPalette.Col_2=0x3Dff3D;
RetPalette.Col_1=0x00D600;
default: // серый
RetPalette.Col_1=0xEAEAEA;
RetPalette.Col_1=0xEAEAEA;
break;
}
return RetPalette;
}

/*********************************************************************
*
* _WIDGET_EFFECT_3D_DrawDownRec
*
*/

static void _WIDGET_EFFECT_3D_DrawDownRect(const GUI _RECT* pRect) {
GUI _RECT r;
r = *pRect;
LCD_SetColor(0x0); /* TBD: Use halftone */
GUI _DrawHLine(r.y0, r.x0, r.x1);
GUI _DrawVLine(r.x0, r.y0 + 1, r.y1);
GUI _DrawHLine(r.y1, r.x0 + 1, r.x1);
GUI _DrawVLine(r.x1, r.y0 + 1, r.y1);
}

/*********************************************************************
*
* _WIDGET_EFFECT_3D_DrawDown
*
*/

static void _WIDGET_EFFECT_3D_DrawDown(void) {
GUI _RECT r;
WM_GetClientRect(&r);
_WIDGET_EFFECT_3D_DrawDownRect(&r);
}

/*********************************************************************
*
* _OnPaint_1
*
*/

#ifndef BUTTON_BKCOLOR0_DEFAULT
#define BUTTON_BKCOLOR0_DEFAULT 0xAAAAAA
#endif

static void _OnPaint(BUTTON_Handle hObj, int _Style,int Effect)
{
int Index;
const char* s = 0;
GUI _RECT Rect,rInside;
GUI _RECT Rect1;
GUI _RECT Rect2;
t_2Colors Palette;
int height;
BUTTON_Obj * pObj;
GUI _MEMDEV_Handle hMem;
pObj = BUTTON_H2P(hObj);
Index = (WIDGET_GetState(hObj) & BUTTON_STATE_PRESSED) ? 1 : 0;
WM_GetClientRect(&Rect);
if (pObj->hpText) {
s = (const char*) GUI _ALLOC_h2p(pObj->hpText);
}
Palette=GetColorPalette(_Style);

rInside=Rect;
Rect1=Rect;
height=Rect1.y1-Rect1.y0;
Rect1.y1=Rect1.y1-height/2;
Rect2=Rect;
Rect2.y0=Rect2.y0+height/2;

hMem=0;
if(hMem)
{
GUI _MEMDEV_Select(hMem);
}

WM_SetUserClipRect(&rInside);
if(WM__IsEnabled(hObj)) // Если кнопка включена
{
if(Index==0)// кнопка отжата
{
if ((pObj->Widget.State & BUTTON_FLASHING_ENABLE))
{
if ((pObj->Widget.State & BUTTON_FLASHING_UP))
{
Palette=GetColorPalette(_Style+1);
}
else
{
Palette=GetColorPalette(_Style);
}
}

GUI _SetColor(Palette.Col_1);
GUI _FillRect(Rect1.x0,Rect1.y0,Rect1.x1,Rect1.y1);
GUI _SetColor(Palette.Col_2);
GUI _FillRect(Rect2.x0,Rect2.y0,Rect2.x1,Rect2.y1);
}
else
{
GUI _SetColor(Palette.Col_2);
GUI _FillRect(Rect1.x0,Rect1.y0,Rect1.x1,Rect1.y1);
GUI _SetColor(Palette.Col_1);
GUI _FillRect(Rect2.x0,Rect2.y0,Rect2.x1,Rect2.y1);
}
if(_getbitL(Effect,__BORDER_DISABLE)==1)
{
if(Index==0)
{
WIDGET_EFFECT_3D_DrawUp();
}
else
{
_WIDGET_EFFECT_3D_DrawDown();
}
}
}
else
{
GUI _SetColor(BUTTON_BKCOLOR0_DEFAULT);
GUI _FillRect(Rect.x0,Rect.y0,Rect.x1,Rect.y1);
WIDGET_EFFECT_3D_DrawUp();
}

if(_getbitH(Effect,__IS_FOCUS)==1)
{
GUI _RECT Focus;
Focus.x0=Rect2.x0+__LEFT_OFFSET;
Focus.y0=Rect2.y1-__BOTTOM_OFFSET-__SIZE_FOCUS_LINE ;
Focus.x1=Rect2.x1-__RIGHT_OFFSET;
Focus.y1=Rect2.y1-__BOTTOM_OFFSET;
if((Focus.x0>0)&&(Focus.y0>0)&&(Focus.x1>0)&&(Focus.y1>0) && (Focus.x0Props.Align);
if(hMem)
{
GUI _MEMDEV_CopyToLCDAt(hMem, pObj->Widget.Win.Rect.x0,pObj->Widget.Win.Rect.y0);
GUI _MEMDEV_Delete(hMem);
}
WM_SetUserClipRect(0);
}

/*********************************************************************
*
* BUTTON_Callback_Dark_Blue
*
*/
void BUTTON_Callback_Dark_Blue(WM_MESSAGE *pMsg)
{
switch (pMsg->MsgId) {
case WM_PAINT:
_OnPaint(pMsg->hWin,Style_Dark_Blue,0); //hWin;
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
hItem = WM_GetDialogItem(hDlg, GUI _ID_USER + 0); // получаю хэндл кнопки
WM_SetCallback(hItem, BUTTON_Callback_Dark_Blue); // устанавливаю свою калбэк функцию
break;

case WM_PAINT:
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */
NCode = pMsg->Data.v; /* Notification code */
switch (NCode) {
case WM_NOTIFICATION_CLICKED: break;

case WM_NOTIFICATION_RELEASED: break;
}
break;

default:
WM_DefaultProc(pMsg);
}
}

}

Эта функция вместо стандартной кнопки отрисовывает кнопку разделенную по горизонтали пополам разными оттенками заданного цвета(в данном случае синим). При нажатии на кнопку оттенки меняются местами. Ну примерно так))). Для более полной информации покопайтесь на сайте сегера. Там, если я не ошибаюсь, были примеры написания собственных калбэк функций)))

=====================================================================================================================

Choosing a Graphical Environment
The choice of graphical environment is largely based on the intended use of an embedded device. For PDA type devices OPIE, GPE or Nano-X provide full featured graphical environments. OPIE is robust, highly polished and has a large amount of application software available. Developing new applications for OPIE may require the purchase of a license, whereas development of GPE and Nano-X applications is unrestricted. Nano-X is a good choice for devices with very limited memory, or for compatibility with Windows based devices.
For embedded devices with simple displays we recommend either SDL or DirectFB, or a combination of both. For development of desktop applications to control embedded devices we recommend QT due to its cross-platform nature and rapid development time.

===

 

TypeOfContent: