>можно ли виджет, написанный "по мотивам" исходников 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.x0<Focus.x1)&&(Focus.y0<Focus.y1))
{
GUI_SetColor(GUI_YELLOW);
GUI_FillRect(Focus.x0,Focus.y0,Focus.x1,Focus.y1);
}
}
GUI_SetColor(BUTTON_GetTextColor(hObj, Index));
GUI_SetFont(BUTTON_GetFont(hObj));
GUI_SetTextMode(GUI_TM_TRANS);
GUI_DispStringInRect(s, &rInside, pObj->Props.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); //<!!!!!!!!!!- самописная функция для отрисовки виджета
break;
default:
BUTTON_Callback(pMsg);
break;
}
}
далее в калбэк функции диалогового окна где используеться эта кнопка я подставляю свою калбэк функцию кнопки
CODE
static const GUI_WIDGET_CREATE_INFO _aDialogMainMenu[] = {
/* Function Text Id Px Py Dx Dy */
{ WINDOW_CreateIndirect, 0, 0, 0, 229, 480, 43,WM_CF_MEMDEV},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 0, 2, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 1, 87, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 2, 172, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 3, 257, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 4, 342, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 5, 427, 0, 50, 38}
};
static void _cbDialogMainMenu(WM_MESSAGE * pMsg) {
WM_HWIN hDlg, hItem;
hDlg = pMsg->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);
}
}
}
Эта функция вместо стандартной кнопки отрисовывает кнопку разделенную по горизонтали пополам разными оттенками заданного цвета(в данном случае синим). При нажатии на кнопку оттенки меняются местами. Ну примерно так))). Для более полной информации покопайтесь на сайте сегера. Там, если я не ошибаюсь, были примеры написания собственных калбэк функций)))