STemWin LISTBOX index değiştirme

Başlatan Mucit23, 22 Kasım 2017, 13:21:41

Mucit23

Selamlar

STemWin üzerinde bir uygulama değiştiriyorum. Listbox içerisinde bazı itemler var. Normalde Dokunduğumuz zaman bu itemler seçiliyor.

Ben dışarıdan müdahale ile bu itemleri seçmek istiyorum. Yani Listbox'ın index değerini değiştireceğim. Bunu nasıl yaparım?

Mucit23

Ek olarak GUI de dinamik değişkenler nasıl oluştururum? Örneğin Bir değişkeni ekranda yazdırmak istiyorum. Yada ekranda bir Text var. Bu Text'e sonradan nasıl müdahale ederim?

Mucit23

Daha büyük bir sıkıntım var.

STemWin'de Ekrana bir değişken nasıl yazdırılır? Yada bir text nasıl değiştirilir? Çoğu şeyi çözdüm sayılır ama ekrana basitçe bir değişken yazdıramıyorum.

apsis

Hocam yeri gelmişken sorayım. işleteceğiniz kodu nereye yazıyorsunuz(gui haricinde)?
"Makineye Beyin" MEKATRONİK

Mucit23

GUI de her sayfa için bir C kodum var. Olaylar ve diğer işlemleri burada işliyorum. Diğer Kodlarım Main içerisinde. GUI de bir texti ekrana yazamıyorum.

GUI builder ile yaptığım tasarımda sıkıntı yok. Tasarladığım gibi ekranda çıkıyor. Ama örneğin GUI Builder ile oluşturduğum bir Texti program içerisinde sonradan değiştiremiyorum. Bunu anlamaya çalışıyorum. Örneğin Birt TextBox olsun. Bu Text box içerisine herhangi bir veri nasıl yazarım?

Örnek bir Dialog aşağıdaki gibi. Burada EDIT adında bir TextBox var. Bu elemanın içeriğini değiştirmek için uğraşıyorum.
/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.22                          *
*        Compiled Jul  4 2013, 15:16:01                              *
*        (c) 2013 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END

#include "DIALOG.h"
#include "main.h"
/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_FRAMEWIN_0     (GUI_ID_USER + 0x04)
#define ID_BUTTON_0     (GUI_ID_USER + 0x05)
#define ID_EDIT_0     (GUI_ID_USER + 0x09)


// USER START (Optionally insert additional defines)
// USER END

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

// USER START (Optionally insert additional static data)
// USER END

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "GyroscobeDialog", ID_FRAMEWIN_0, 0, 0, 240, 320, 0, 0x64, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 68, 42, 80, 20, 0, 0x0, 0 },
  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 73, 4, 80, 20, 0, 0x64, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

/*********************************************************************
*
*       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;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'GyroscobeDialog'
    //
    hItem = pMsg->hWin;
    FRAMEWIN_SetText(hItem, "Gyroscobe Deneyi");
    FRAMEWIN_SetFont(hItem, GUI_FONT_16B_ASCII);
    FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    FRAMEWIN_SetTextColor(hItem, 0x00000000);
    //
    // Initialization of 'Edit'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
    EDIT_SetText(hItem, "123");
    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
			  STM_EVAL_LEDToggle(LED4);
			  hItem=WM_GetDialogItem(pMsg->hWin,ID_EDIT_0);
			  EDIT_SetValue(hItem,1245);
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_EDIT_0: // Notifications sent by 'Edit'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_VALUE_CHANGED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateGyroscobeDialog
*/
WM_HWIN CreateGyroscobeDialog(void);
WM_HWIN CreateGyroscobeDialog(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

// USER START (Optionally insert additional public code)
// USER END

/*************************** End of file ****************************/

Mucit23

Tam olarak emin olmamakla birlikte sorunu çözdüm gibi.

Text ve EDIT widgetlarının güncellenmesi için ana programda sürekli GUI_Exec(); fonksiyonunu çağırmak gerekiyor. Sebebini tam olarak anlayamadım. GUI de koyduğum bir butonun basılma olayına aşağıdaki kodları ekledim. Butona basılınca bir sayacın değerini arttırıp bunu EDIT widgetine yazdırdım.

      case WM_NOTIFICATION_CLICKED:
			  STM_EVAL_LEDToggle(LED4);
			  datax++;
			  sprintf(st,"Sayi=%ld",datax);
        hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
        EDIT_SetText(hItem, st);
        break;


Bir widget'a erişebilmek için ilk önce onun parametrelerine erişmek gerekiyor. Onuda WM_GetDialogItem fonksiyonu ile yapıyorum. Sonrasında o widget'a ait fonksiyonlarla içeriğini güncelliyorum.