|

楼主 |
发表于 2015-3-7 22:12:46
|
显示全部楼层
回 eric2013 的帖子
- /*********************************************************************
- * SEGGER Microcontroller GmbH & Co. KG *
- * Solutions for real time microcontroller applications *
- **********************************************************************
- * *
- * (c) 1996 - 2013 SEGGER Microcontroller GmbH & Co. KG *
- * *
- * Internet: www.segger.com Support: support@segger.com *
- * *
- **********************************************************************
- ** emWin V5.22 - Graphical user interface for embedded applications **
- emWin is protected by international copyright laws. Knowledge of the
- source code may not be used to write a similar product. This file may
- only be used in accordance with a license and should not be re-
- distributed in any way. We appreciate your understanding and fairness.
- ----------------------------------------------------------------------
- File : BASIC_Hello1.c
- Purpose : Simple demo drawing "Hello world"
- ----------------------------------------------------------------------
- */
- #include <stddef.h>
- #include <stdlib.h>
- #include <string.h>
- #include "DIALOG.h"
- #include "PROGBAR.h"
- #include "LCDConf.h"
- /*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
- #define ID_WINDOW_0 (GUI_ID_USER + 0x12)
- #define ID_GRAPH_0 (GUI_ID_USER + 0x13)
- #define ID_TEXT_0 (GUI_ID_USER + 0x18)
- #define ID_TEXT_1 (GUI_ID_USER + 0x1D)
- #define ID_EDIT_0 (GUI_ID_USER + 0x1E)
- #define ID_EDIT_1 (GUI_ID_USER + 0x1F)
- #define ID_TEXT_2 (GUI_ID_USER + 0x20)
- #define ID_EDIT_2 (GUI_ID_USER + 0x21)
- // USER START (Optionally insert additional defines)
- // USER END
- static WM_CALLBACK * _pcbCallbackTemperature;
- WM_HWIN _hDialogMain, _hDialogColor;
- static int _TempMin = 20, _TempMax = 100;
- static I16 _aTemp1[800], _aTemp2[800];
- static U8 _aColorSep[3] = { 127, 127, 127 }; /* Red, green and blue components */
- /*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
- // USER START (Optionally insert additional static data)
- // USER END
- /*********************************************************************
- *
- * _aDialogCreate
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
- { GRAPH_CreateIndirect, "Graph", ID_GRAPH_0, 0, 0, 790, 350, 0, 0x0, 0 },
- { TEXT_CreateIndirect, "Text", ID_TEXT_0, 0, 360, 170, 36, 0, 0x64, 0 },
- { TEXT_CreateIndirect, "Text", ID_TEXT_1, 427, 360, 130, 38, 0, 0x64, 0 },
- { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 180, 360, 100, 40, 0, 0x64, 0 },
- { EDIT_CreateIndirect, "Edit", ID_EDIT_1, 531, 360, 100, 40, 0, 0x64, 0 },
- { TEXT_CreateIndirect, "Text", ID_TEXT_2, 0, 425, 170, 36, 0, 0x64, 0 },
- { EDIT_CreateIndirect, "Edit", ID_EDIT_2, 180, 425, 100, 40, 0, 0x64, 0 },
- // USER START (Optionally insert additional widgets)
- // USER END
- };
- /*********************************************************************
- *
- * _OnPaint指示灯
- This routine draws the color rectangles.
- The widgets are drawn automatically.
- */
- static void _OnPaint(void) {
- /* Draw RGB values */
- GUI_SetColor(_aColorSep[0] << 8);
- GUI_FillRoundedRect(300, 360, 340, 400, 20);
- GUI_SetColor(_aColorSep[1] << 8);
- GUI_FillRoundedRect(650, 360, 690, 400, 20);
- GUI_SetColor(_aColorSep[2] << 8);
- GUI_FillRoundedRect(300, 425, 340, 465, 20);
- }
- /*********************************************************************
- *
- * Static code
- *
- **********************************************************************
- */
- static I16 _GetRandomValue(I16 Old) {
- int MaxValue, yD, MaxDiff = 2;
- I16 yNew;
- MaxValue = _TempMax - _TempMin;
- yD = MaxDiff - (rand() % MaxDiff);
- if (rand() & 1) {
- yNew = Old + yD;
- }
- else {
- yNew = Old - yD;
- }
- if (yNew > MaxValue) {
- yNew -= yD;
- }
- else {
- if (yNew < 0)
- yNew += yD;
- }
- return yNew;
- }
- /*********************************************************************
- *
- * _InitRandomData
- */
- static void _InitRandomData(I16 * paY, int n) {
- int i, MaxValue;
- MaxValue = _TempMax - _TempMin;
- for (i = 0; i < n; i++) {
- if (!i) {
- paY[i] = rand() % MaxValue;
- }
- else {
- paY[i] = _GetRandomValue(paY[i - 1]);
- }
- }
- }
- /*******************************************************************
- *
- * _DrawGraph
- */
- static void _DrawGraph(void) {
- GUI_RECT Rect;
- int xSize, ySize, x, y;
- WM_GetClientRect(&Rect);
- xSize = Rect.x1;
- ySize = Rect.y1;
- GUI_SetBkColor(GUI_BLACK);
- GUI_ClearRect(26, 1, 800, ySize - 21);
- GUI_SetColor(GUI_DARKGRAY);
- for (y = 0; y < (ySize - 249); y += 10) {
- int yPos = ySize - 20 - y;
- GUI_DrawHLine(yPos - y * 2, 26, 800);
- }
- for (x = 40; x < (xSize - 25); x += 40) {
- int xPos = x + 25;
- GUI_DrawVLine(xPos, 1, ySize - 21);
- }
- GUI_SetColor(GUI_DARKGREEN);
- GUI_DrawGraph(_aTemp1, GUI_COUNTOF(_aTemp1), 26, ySize - 200);
- GUI_SetColor(GUI_BLUE);
- GUI_DrawGraph(_aTemp2, GUI_COUNTOF(_aTemp2), 26, ySize - 200);
- GUI_SetColor(GUI_GREEN);
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("temperature:", 630,50);
- GUI_FillRect(700, 50, 730, 70);
- GUI_SetColor(GUI_BLUE);
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("smoke:", 630, 90);
- GUI_FillRect(700, 90, 730, 110);
- }
- /*********************************************************************
- *
- * _LabelGraph
- */
- static void _LabelGraph(void) {
- GUI_RECT Rect;
- int x, y, xSize, ySize;
- WM_GetClientRect(&Rect);
- xSize = Rect.x1;
- ySize = Rect.y1;
- GUI_SetBkColor(GUI_RED);
- GUI_Clear();
- GUI_SetColor(GUI_WHITE);
- GUI_SetPenSize(1);
- GUI_ClearRect(0, (ySize - 21) - ySize, (xSize - 1), (ySize - 1));
- GUI_DrawRect(25, 0, xSize, ySize - 20);
- GUI_SetFont(&GUI_Font6x8);
- for (x = 0; x < (xSize - 20); x += 40) {
- int xPos = x + 25;
- GUI_DrawVLine(xPos, (ySize - 20), (ySize - 14));
- GUI_GotoXY(xPos - 2, (ySize - 9));
- GUI_DispDecSpace(x / 40, 2);
- }
- for (y = 0; y < ySize - 249; y += 10) {
- int yPos = ySize - 20 - y;
- GUI_DrawHLine(yPos-y*2, 20, 25);
- GUI_GotoXY(1, yPos - y * 2 - 8);
- GUI_DispDecSpace(y, 3);
- }
- }
- /*********************************************************************
- *
- * _cbTemperature
- *
- * Purpose:
- * Callback routine of temperature window
- */
- static void _cbTemperature(WM_MESSAGE * pMsg) {
- WM_HWIN hDlg;
- hDlg = pMsg->hWin;
- switch (pMsg->MsgId) {
- case WM_PAINT:
- _LabelGraph();
- _DrawGraph();
- GUI_SetColor(GUI_RED);
- GUI_FillRoundedRect(300, 360, 340, 400, 20);
- return;
- }
- if (_pcbCallbackTemperature) {
- _pcbCallbackTemperature(pMsg);
- }
- }
- /*********************************************************************
- *
- * Static code
- **********************************************************************
- */
- // USER START (Optionally insert additional static code)
- // USER END
- /*********************************************************************
- *
- * _cbDialog
- */
- static void _cbDialog(WM_MESSAGE * pMsg) {
- WM_HWIN hItem;
- int NCode;
- int Id;
- WM_HWIN hDlg;
- hDlg = pMsg->hWin;
- switch (pMsg->MsgId) {
- case WM_PAINT://窗口收到WM_PAINT消息时,应重绘自身。将此消息发送到窗口前,WM确保它已被选定。
- _OnPaint();//区域填充
- return;
- case WM_INIT_DIALOG:
- //
- // Initialization of 'Graph'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
- GRAPH_SetBorder(hItem, 100, 10, 5, 50);
- //
- // Initialization of 'Text'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
- TEXT_SetFont(hItem, GUI_FONT_32_ASCII);
- TEXT_SetText(hItem, "temperature:");
- TEXT_SetTextColor(hItem, GUI_GREEN);
- TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
- //
- // Initialization of 'Text'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
- TEXT_SetFont(hItem, GUI_FONT_32_ASCII);
- TEXT_SetTextColor(hItem, 0x00FF0000);
- TEXT_SetText(hItem, "smoke:");
- //
- // Initialization of 'Edit'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
- EDIT_SetFont(hItem, GUI_FONT_24_ASCII);
- EDIT_SetDecMode(hItem, _TempMin, 0, 999, 0, 0);
- //
- // Initialization of 'Edit'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_1);
- EDIT_SetFont(hItem, GUI_FONT_24_ASCII);
- EDIT_SetDecMode(hItem, _TempMax, 0, 999, 0, 0);
- //
- // Initialization of 'Text'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
- TEXT_SetFont(hItem, GUI_FONT_32_ASCII);
- TEXT_SetText(hItem, "speed:");
- //
- // Initialization of 'Edit'
- //
- hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_2);
- EDIT_SetFont(hItem, GUI_FONT_24_ASCII);
- EDIT_SetDecMode(hItem, _TempMax, 0, 999, 0, 0);
- hItem = WM_GetClientWindow(WM_GetDialogItem(hDlg, ID_GRAPH_0));
- _pcbCallbackTemperature = WM_SetCallback(hItem, _cbTemperature);
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (NCode) {
- case WM_NOTIFICATION_RELEASED:
- break;
- case WM_NOTIFICATION_VALUE_CHANGED:
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * CreateWindow
- */
- WM_HWIN CreateWindow(void);
- WM_HWIN CreateWindow(void) {
- WM_HWIN hWin;
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
- return hWin;
- }
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*******************************************************************
- *
- * MainTask
- */
- void MainTask(void) {
- int Index;
- WM_SetCreateFlags(WM_CF_MEMDEV);
- GUI_Init();
- WM_SetDesktopColor(GUI_BLACK);
- /* Initialize the temperature arrays */
- _InitRandomData(_aTemp1, GUI_COUNTOF(_aTemp1));
- _InitRandomData(_aTemp2, GUI_COUNTOF(_aTemp2));
- _hDialogMain = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
- /* Add new temperatures... */
- Index = GUI_COUNTOF(_aTemp1) - 1;
- GUI_SetColor(GUI_RED);
- GUI_FillRoundedRect(300, 360, 340, 400, 20);
- while (1) {
- WM_HWIN hItem;
- GUI_Delay(100); /* Wait a while */
- /* Shift the color arrays */
- memmove(_aTemp1, _aTemp1 + 1, sizeof(_aTemp1)-2);
- memmove(_aTemp2, _aTemp2 + 1, sizeof(_aTemp2)-2);
- /* Add new values */
- _aTemp1[Index] = _GetRandomValue(_aTemp1[Index - 1]);
- _aTemp2[Index] = _GetRandomValue(_aTemp2[Index - 1]);
- EDIT_SetDecMode(WM_GetDialogItem(_hDialogMain, ID_EDIT_0), _aTemp1[Index], 0, 999, 0, 0);
- EDIT_SetDecMode(WM_GetDialogItem(_hDialogMain, ID_EDIT_1), _aTemp2[Index], 0, 999, 0, 0);
- EDIT_SetDecMode(WM_GetDialogItem(_hDialogMain, ID_EDIT_2), 234, 0, 999, 0, 0);
- /* Update windows */
- hItem = WM_GetClientWindow(WM_GetDialogItem(_hDialogMain, ID_GRAPH_0));
- WM_InvalidateWindow(hItem);
- }
- }
- /*************************** End of file ****************************/
复制代码 eric2013:
感觉的底层驱动还是有些问题,这样,您可以底层不做任何优化,仅使用打点和读点函数,其余的画线等函数不做优化再试试。 
我试过了,好像的确是优化时有问题,不优化就好了,
我开始试这做了一个界面,想让一个数值大于一个值时,后面的绿色标志变为红色,但是不管我怎么做,都不会变化,能帮我看一下吗? |
|