Блокнот диалоговых панелей. Переход между станицами блокнота.

Тема в разделе "WASM.WIN32", создана пользователем Andrey_59, 22 авг 2023.

  1. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Здравствуйте! Скажите, как в блокноте диалоговых панелей(PropertySheet) определит индекс выбранной страницы, как узнать последняя ли это страница?
    Я делаю так, так я узнаю дескриптор выбранной страницы и, затем, индекс данной страницы.
    Код (C++):
    1. HWND hWnd = (HWND)SendMessage(GetParent(hDlg),
    2.                     PSM_GETCURRENTPAGEHWND,
    3.                     0, 0L);
    4. LRESULT idx = SendMessage(GetParent(hDlg),
    5.                     PSM_HWNDTOINDEX,
    6.                     (WPARAM)hWnd, 0L);
    А как узнать индекс(дескриптор следующей страницы) чтобы, например, на неё перейти?
    Возможно, так, но полной уверенности в этом нет...
    Код (C++):
    1. GetNextDlgGroupItem
    Не знаю, так же, правильно ли я уничтожаю блокнот, нужно по нажатии на кнопку "Готово" перейти к\на следующую страницу блокнота, если больше страниц нет, то нужно завершить работу блокнот.
    Я делаю так, но не уверен, что это правильно:

    Код (C++):
    1. case ID_BUTTON_READY:
    2. {
    3.     /*
    4.     int idx = SendMessage(hList, LB_GETSEL, 0, 0L);
    5.     if (idx == LB_ERR || idx == 0)
    6.     {
    7.         MessageBox(NULL,
    8.             TEXT("No select items"),
    9.             TEXT("Error: ID_BUTTON_READY"),
    10.             MB_OK);
    11.         return FALSE;
    12.     }
    13.  
    14.     //TCHAR szBuff[256];
    15.     int len = SendMessage(hList, LB_GETTEXT,
    16.         idx, (LPARAM)szBookName);
    17.     if (len == LB_ERR)
    18.     {
    19.         MessageBox(NULL,
    20.             TEXT("No a Item with so index."),
    21.             TEXT("Error: ID_BUTTON_READY"),
    22.             MB_OK);
    23.         return FALSE;
    24.     }
    25.     szBookName[len] = '\0';
    26.  
    27.     */
    28.  
    29.     if (!SendMessage(GetParent(hDlg), PSM_APPLY,
    30.         0, 0L))
    31.     {
    32.                //Так я пытаюсь завершить работу блокнота.
    33.         SetWindowLongPtr(GetParent(hDlg), DWL_MSGRESULT, FALSE);
    34.         return FALSE;
    35.     }
    36.     else
    37.     {
    38.         HWND hWnd = (HWND)SendMessage(GetParent(hDlg),
    39.             PSM_GETCURRENTPAGEHWND,
    40.             0, 0L);
    41.         //Но так я получаю индекс данной страницы, а не следующей.
    42.         LRESULT idx = SendMessage(GetParent(hDlg),
    43.             PSM_HWNDTOINDEX,
    44.             (WPARAM)hWnd, 0L);
    45.        
    46.         //Переход на следующую страницу.
    47.         SendMessage(GetParent(hDlg), PSM_SETCURSEL,
    48.             idx, 0L);
    49.     }
    50.     return TRUE;
    51. }
    Нет, так не работает, хз... может быть стоит вызвать
    Код (Text):
    1. EndDialog()
    , но при создании блокнота эта функция должна отсутствовать на диалоговых страницах(окнах, панелях) так что не знаю куда её воткнуть. Так же, возможно, есть другие, более изящные способы решения данной проблемы.
     
  2. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Может быть кому-нибудь пригодиться, не могу сказать, что это единственно верное решение, но оно работает.
    Код (C++):
    1. case ID_BUTTON_READY:
    2. {
    3.     int idx = SendMessage(hList, LB_GETCURSEL, 0, 0L);
    4.  
    5.     //TCHAR szBuff[256];
    6.     int len = SendMessage(hList, LB_GETTEXT,
    7.         idx, (LPARAM)szBookPharagraph);
    8.    
    9.     szBookPharagraph[len] = '\0';
    10.  
    11.  
    12.  
    13.     HWND hWnd = (HWND)SendMessage(GetParent(hDlg),
    14.         PSM_GETCURRENTPAGEHWND,
    15.         0, 0L);
    16.  
    17.     idx = SendMessage(GetParent(hDlg),
    18.         PSM_HWNDTOINDEX,
    19.         (WPARAM)hWnd, 0L);
    20.  
    21.     BOOL fSt = SendMessage(GetParent(hDlg), PSM_SETCURSEL,
    22.         idx + 1, 0L);
    23.  
    24.     if (!fSt)
    25.     {
    26.         SendMessage(GetParent(hDlg), PSM_PRESSBUTTON,
    27.                     PSBTN_CANCEL, (LPARAM)0L);
    28.         return FALSE;
    29.     }
    30.     else
    31.     {
    32.         SetWindowLongPtr(GetParent(hDlg), DWLP_MSGRESULT, TRUE);
    33.     }
    34.     return TRUE;
    35. }