WM_SetUntouchable

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Hi,

      If I get you right you want to make sure that the initial dialog (the one with _cbDialog) don't receive input when the derived dialog is created (_cbDerivedDialog), right?

      To achieve that you can simply make the derived dialog modal:

      C Source Code

      1. static void _cbDerivedDialog(WM_MESSAGE * pMsg) {
      2. WM_HWIN hItem;
      3. int NCode;
      4. int Id;
      5. WM_KEY_INFO * pInfo = (WM_KEY_INFO *)pMsg->Data.p;
      6. switch (pMsg->MsgId) {
      7. case WM_INIT_DIALOG:
      8. setupDropdown(WM_GetDialogItem(pMsg->hWin, ID_DERIVED_DROPDOWN_0));
      9. WM_MakeModal(pMsg->hWin);
      10. break;
      11. case WM_NOTIFY_PARENT:
      12. switch (pMsg->Data.v) {
      13. case WM_NOTIFICATION_RELEASED:
      14. switch (WM_GetId(pMsg->hWinSrc)) {
      15. case ID_DERIVED_BUTTON_0:
      16. GUI_EndDialog(pMsg->hWin, 0);
      17. isUntouched = 0;
      18. break;
      19. }
      20. break;
      21. }
      22. break;
      23. default:
      24. WM_DefaultProc(pMsg);
      25. break;
      26. }
      27. }
      Display All
      Regards,
      Sven
      Please read the forum rules before posting.

      Keep in mind, this is *not* a support forum.
      Our engineers will try to answer your questions between their projects if possible but this can be delayed by longer periods of time.
      Should you be entitled to support you can contact us via our support system: segger.com/ticket/

      Or you can contact us via e-mail.
    • Hi,

      OK, now I got it, I guess.

      Try this:

      C Source Code

      1. #include "DIALOG.h"
      2. /*********************************************************************
      3. *
      4. * Defines
      5. *
      6. **********************************************************************
      7. */
      8. #define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
      9. #define ID_DROPDOWN_0 (GUI_ID_USER + 0x01)
      10. #define ID_BUTTON_0 (GUI_ID_USER + 0x02)
      11. #define ID_DERIVED_0 (GUI_ID_USER + 0x03)
      12. #define ID_DERIVED_DROPDOWN_0 (GUI_ID_USER + 0x04)
      13. #define ID_DERIVED_BUTTON_0 (GUI_ID_USER + 0x05)
      14. /*********************************************************************
      15. *
      16. * Static data
      17. *
      18. **********************************************************************
      19. */
      20. static U8 isUntouched = 0;
      21. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
      22. { FRAMEWIN_CreateIndirect, "Main window", ID_FRAMEWIN_0, 0, 0, 200, 200, FRAMEWIN_CF_MOVEABLE, 0x0, 0 },
      23. { DROPDOWN_CreateIndirect, "Dropdown", ID_DROPDOWN_0, 10, 10, 80, 50, 0, 0x0, 0 },
      24. { BUTTON_CreateIndirect, "New window", ID_BUTTON_0, 100, 10, 80, 20, 0, 0x0, 0 },
      25. };
      26. static const GUI_WIDGET_CREATE_INFO _aDerivedDialogCreate[] = {
      27. { FRAMEWIN_CreateIndirect, "Derived window", ID_DERIVED_0, 80, 80, 150, 90, FRAMEWIN_CF_MOVEABLE, 0x0, 0 },
      28. { DROPDOWN_CreateIndirect, "Dropdown", ID_DERIVED_DROPDOWN_0, 10, 10, 80, 50, 0, 0x0, 0 },
      29. { BUTTON_CreateIndirect, "Close", ID_DERIVED_BUTTON_0, 10, 40, 80, 20, 0, 0x0, 0 },
      30. };
      31. static void setupDropdown(WM_HWIN hItem) {
      32. DROPDOWN_AddString(hItem, "Item 1");
      33. DROPDOWN_AddString(hItem, "Item 2");
      34. DROPDOWN_AddString(hItem, "Item 3");
      35. }
      36. /*********************************************************************
      37. *
      38. * Static code
      39. *
      40. **********************************************************************
      41. */
      42. /*********************************************************************
      43. *
      44. * _cbBk
      45. */
      46. static void _cbWin(WM_MESSAGE * pMsg) {
      47. switch (pMsg->MsgId) {
      48. case WM_PAINT:
      49. break;
      50. default:
      51. WM_DefaultProc(pMsg);
      52. break;
      53. }
      54. }
      55. /*********************************************************************
      56. *
      57. * _cbDerivedDialog
      58. */
      59. static void _cbDerivedDialog(WM_MESSAGE * pMsg) {
      60. static WM_HWIN hWin;
      61. WM_HWIN hItem;
      62. int NCode;
      63. int Id;
      64. WM_KEY_INFO * pInfo = (WM_KEY_INFO *)pMsg->Data.p;
      65. switch (pMsg->MsgId) {
      66. case WM_INIT_DIALOG:
      67. setupDropdown(WM_GetDialogItem(pMsg->hWin, ID_DERIVED_DROPDOWN_0));
      68. hWin = WM_CreateWindowAsChild(0, 0, LCD_GetXSize(), LCD_GetYSize(), WM_HBKWIN, WM_CF_SHOW | WM_CF_HASTRANS, _cbWin, 0);
      69. WM_BringToTop(pMsg->hWin); // Call for each window which should react on touch
      70. // WM_BringToTop(hKeyPad);
      71. break;
      72. case WM_NOTIFY_PARENT:
      73. switch (pMsg->Data.v) {
      74. case WM_NOTIFICATION_RELEASED:
      75. switch (WM_GetId(pMsg->hWinSrc)) {
      76. case ID_DERIVED_BUTTON_0:
      77. GUI_EndDialog(pMsg->hWin, 0);
      78. WM_DeleteWindow(hWin);
      79. isUntouched = 0;
      80. break;
      81. }
      82. break;
      83. }
      84. break;
      85. default:
      86. WM_DefaultProc(pMsg);
      87. break;
      88. }
      89. }
      90. /*********************************************************************
      91. *
      92. * _cbDialog
      93. */
      94. static void _cbDialog(WM_MESSAGE * pMsg) {
      95. WM_HWIN hItem;
      96. int NCode;
      97. int Id;
      98. WM_KEY_INFO * pInfo = (WM_KEY_INFO *)pMsg->Data.p;
      99. switch (pMsg->MsgId) {
      100. case WM_INIT_DIALOG:
      101. setupDropdown(WM_GetDialogItem(pMsg->hWin, ID_DROPDOWN_0));
      102. break;
      103. case WM_TOUCH:
      104. if (isUntouched) {
      105. WM_SendMessage(WM_GetParent(pMsg->hWin), pMsg);
      106. break;
      107. }
      108. case WM_NOTIFY_PARENT:
      109. switch (pMsg->Data.v) {
      110. case WM_NOTIFICATION_RELEASED:
      111. switch (WM_GetId(pMsg->hWinSrc)) {
      112. case ID_BUTTON_0:
      113. isUntouched = 1;
      114. GUI_CreateDialogBox(_aDerivedDialogCreate, GUI_COUNTOF(_aDerivedDialogCreate), _cbDerivedDialog, WM_HBKWIN, 0, 0);
      115. break;
      116. }
      117. break;
      118. }
      119. break;
      120. default:
      121. WM_DefaultProc(pMsg);
      122. break;
      123. }
      124. }
      125. /*********************************************************************
      126. *
      127. * Public code
      128. *
      129. **********************************************************************
      130. */
      131. /*********************************************************************
      132. *
      133. * MainTask
      134. */
      135. void MainTask(void) {
      136. GUI_Init();
      137. WM_SetBkWindowColor(GUI_GRAY);
      138. GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
      139. while (1) {
      140. GUI_Delay(100);
      141. };
      142. }
      Display All

      In WM_INIT_DIALOG of _cbDerivedDialog() I create another window which is transparent. This window will catch the input outside _cbDerivedDialog() and do nothing with it.

      After creating this window make sure that all dialogs which should still receive input are on top (at least over the transparent window).

      Regards,
      Sven
      Please read the forum rules before posting.

      Keep in mind, this is *not* a support forum.
      Our engineers will try to answer your questions between their projects if possible but this can be delayed by longer periods of time.
      Should you be entitled to support you can contact us via our support system: segger.com/ticket/

      Or you can contact us via e-mail.