📄 graph.c
字号:
GUI_DEBUG_ERROROUT("GRAPH.c: Wrong handle type or Object not init'ed");
return 0;
}
}
return p;
}
#endif
/*********************************************************************
*
* Exported routines: Private functions
*
**********************************************************************
*/
/*********************************************************************
*
* GRAPH__AddValue
*/
void GRAPH__AddValue(GRAPH_DATA_OBJ * pDataObj, void * pData, void * pValue, int Size) {
if (pDataObj->PaintObj.hGraph) {
if (pDataObj->NumItems == pDataObj->MaxNumItems) {
memmove((U8 *)pData, (U8 *)pData + Size, Size * (pDataObj->MaxNumItems - 1));
memmove((U8 *)pData + Size * (pDataObj->NumItems - 1), pValue, Size);
} else {
memmove((U8 *)pData + Size * pDataObj->NumItems++, pValue, Size);
}
_InvalidateGraph(pDataObj->PaintObj.hGraph);
}
}
/*********************************************************************
*
* Exported routines: Callback
*
**********************************************************************
*/
/*********************************************************************
*
* GRAPH_Callback
*/
void GRAPH_Callback (WM_MESSAGE * pMsg) {
int Result, ManageScrollBars = 0;
GRAPH_Handle hObj;
GRAPH_OBJ * pObj;
hObj = pMsg->hWin;
pObj = (GRAPH_OBJ *)GUI_ALLOC_h2p(hObj); /* Don't use use WIDGET_H2P because WIDGET_INIT_ID() has not be called at this point */
/* Let widget handle the standard messages */
if (pMsg->MsgId == WM_WIDGET_SET_EFFECT) {
ManageScrollBars = 1;
}
Result = WIDGET_HandleActive(hObj, pMsg);
if (ManageScrollBars) {
_ManageScrollBars(pObj, hObj);
}
if (!Result) {
return;
}
switch (pMsg->MsgId) {
case WM_SIZE:
_ManageScrollBars(pObj, hObj);
break;
case WM_PAINT:
_OnPaint(pObj, hObj, (GUI_RECT *)pMsg->Data.p);
return;
case WM_DELETE:
_OnDelete(pObj);
return;
case WM_NOTIFY_PARENT:
switch (pMsg->Data.v) {
case WM_NOTIFICATION_VALUE_CHANGED:
if (pMsg->hWinSrc == WM_GetScrollbarV(hObj)) {
_OnScrollValueChanged(pObj, pMsg->hWin, pMsg->hWinSrc);
} else if (pMsg->hWinSrc == WM_GetScrollbarH(hObj)) {
_OnScrollValueChanged(pObj, pMsg->hWin, pMsg->hWinSrc);
}
break;
case WM_NOTIFICATION_SCROLLBAR_ADDED:
#if WIDGET_USE_PARENT_EFFECT
WIDGET_SetEffect(pMsg->hWinSrc, pObj->Widget.pEffect);
#endif
break;
}
}
WM_DefaultProc(pMsg);
}
/*********************************************************************
*
* Exported routines: Create
*
**********************************************************************
*/
/*********************************************************************
*
* GRAPH_CreateEx
*/
GRAPH_Handle GRAPH_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent,
int WinFlags, int ExFlags, int Id)
{
GRAPH_Handle hObj;
WM_LOCK();
hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, GRAPH_Callback,
sizeof(GRAPH_OBJ) - sizeof(WM_Obj));
if (hObj) {
GRAPH_OBJ * pObj;
pObj = (GRAPH_OBJ *)GUI_ALLOC_h2p(hObj); /* Don't use use WIDGET_H2P because WIDGET_INIT_ID() has not be called at this point */
/* Init sub-classes */
GUI_ARRAY_CREATE(&pObj->GraphArray);
GUI_ARRAY_CREATE(&pObj->ScaleArray);
/* Init widget specific variables */
WIDGET__Init(&pObj->Widget, Id, 0);
/* Init member variables */
GRAPH_INIT_ID(pObj);
pObj->Props = GRAPH__DefaultProps;
pObj->Flags = ExFlags;
}
WM_UNLOCK();
return hObj;
}
/*********************************************************************
*
* GRAPH_AttachData
*/
void GRAPH_AttachData(GRAPH_Handle hObj, GRAPH_DATA_Handle hData) {
if (hObj) {
GRAPH_OBJ * pObj;
GRAPH_DATA_OBJ * pDataObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
pDataObj = (GRAPH_DATA_OBJ *)GUI_ALLOC_h2p(hData);
pDataObj->PaintObj.hGraph = hObj;
GUI_ARRAY_AddItem(&pObj->GraphArray, &hData, sizeof(GRAPH_DATA_Handle));
WM_InvalidateWindow(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* GRAPH_AttachScale
*/
void GRAPH_AttachScale(GRAPH_Handle hObj, GRAPH_SCALE_Handle hScale) {
if (hObj) {
GRAPH_OBJ * pObj;
GRAPH_SCALE_OBJ * pScaleObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
pScaleObj = (GRAPH_SCALE_OBJ *)GUI_ALLOC_h2p(hScale);
pScaleObj->PaintObj.hGraph = hObj;
GUI_ARRAY_AddItem(&pObj->ScaleArray, &hScale, sizeof(GRAPH_SCALE_Handle));
WM_InvalidateWindow(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* GRAPH_SetColor
*/
GUI_COLOR GRAPH_SetColor(GRAPH_Handle hObj, GUI_COLOR Color, unsigned Index) {
GUI_COLOR OldColor = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
if (Index < GUI_COUNTOF(pObj->Props.aColor)) {
OldColor = pObj->Props.aColor[Index];
if (pObj->Props.aColor[Index] != Color) {
pObj->Props.aColor[Index] = Color;
WM_InvalidateWindow(hObj);
}
}
WM_UNLOCK();
}
return OldColor;
}
/*********************************************************************
*
* GRAPH_SetGridVis
*/
unsigned GRAPH_SetGridVis(GRAPH_Handle hObj, unsigned OnOff) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->ShowGrid;
if ((unsigned)pObj->ShowGrid != OnOff) {
pObj->ShowGrid = OnOff ? 1 : 0;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetGridDistX
*/
unsigned GRAPH_SetGridDistX(GRAPH_Handle hObj, unsigned Value) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->Props.GridSpacingX;
if (pObj->Props.GridSpacingX != Value) {
pObj->Props.GridSpacingX = Value;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetGridDistY
*/
unsigned GRAPH_SetGridDistY(GRAPH_Handle hObj, unsigned Value) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->Props.GridSpacingY;
if (pObj->Props.GridSpacingY != Value) {
pObj->Props.GridSpacingY = Value;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetGridOffY
*/
unsigned GRAPH_SetGridOffY(GRAPH_Handle hObj, unsigned Value) {
unsigned OldValue = 0;
if (hObj) {
WM_LOCK();
OldValue = _SetGridOffY(GRAPH_H2P(hObj), hObj, Value);
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetBorder
*/
void GRAPH_SetBorder(GRAPH_Handle hObj, unsigned BorderL, unsigned BorderT, unsigned BorderR, unsigned BorderB) {
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
pObj->Props.BorderL = BorderL;
pObj->Props.BorderT = BorderT;
pObj->Props.BorderR = BorderR;
pObj->Props.BorderB = BorderB;
_ManageScrollBars(pObj, hObj);
WM_InvalidateWindow(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* GRAPH_SetUserDraw
*/
void GRAPH_SetUserDraw(GRAPH_Handle hObj, void (* pUserDraw)(WM_HWIN hObj, int Stage)) {
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
pObj->pUserDraw = pUserDraw;
WM_InvalidateWindow(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* GRAPH_SetVSizeX
*/
unsigned GRAPH_SetVSizeX(GRAPH_Handle hObj, unsigned Value) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->RangeX;
if (pObj->RangeX != Value) {
pObj->RangeX = Value;
_ManageScrollBars(pObj, hObj);
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetVSizeY
*/
unsigned GRAPH_SetVSizeY(GRAPH_Handle hObj, unsigned Value) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->RangeY;
if (pObj->RangeY != Value) {
pObj->RangeY = Value;
_ManageScrollBars(pObj, hObj);
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetGridFixedX
*/
unsigned GRAPH_SetGridFixedX(GRAPH_Handle hObj, unsigned OnOff) {
unsigned OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = (pObj->Flags & GRAPH_CF_GRID_FIXED_X) ? 1 : 0;
if (OldValue & !OnOff) {
pObj->Flags &= ~GRAPH_CF_GRID_FIXED_X;
WM_InvalidateWindow(hObj);
} else if (!OldValue & OnOff) {
pObj->Flags |= GRAPH_CF_GRID_FIXED_X;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetLineStyleH
*/
U8 GRAPH_SetLineStyleH(GRAPH_Handle hObj, U8 Value) {
U8 OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->LineStyleH;
if (OldValue != Value) {
pObj->LineStyleH = Value;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetLineStyleV
*/
U8 GRAPH_SetLineStyleV(GRAPH_Handle hObj, U8 Value) {
U8 OldValue = 0;
if (hObj) {
GRAPH_OBJ * pObj;
WM_LOCK();
pObj = GRAPH_H2P(hObj);
OldValue = pObj->LineStyleV;
if (OldValue != Value) {
pObj->LineStyleV = Value;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
return OldValue;
}
/*********************************************************************
*
* GRAPH_SetLineStyle
*/
void GRAPH_SetLineStyle(GRAPH_Handle hObj, U8 Value) {
GRAPH_SetLineStyleV(hObj, Value);
GRAPH_SetLineStyleH(hObj, Value);
}
#else /* Avoid problems with empty object modules */
void GRAPH_C(void);
void GRAPH_C(void) {}
#endif /* #if GUI_WINSUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -