На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> ассерт при попытке доступа к странице свойства
    как исправить сабж? :wacko:

    вот код:
    ExpandedWrap disabled
      class CMyDlg : public CDialogEx
      {
      // Construction
      public:
          CMyDlg(CWnd* pParent = NULL);   // standard constructor
          ~CMyDlg();
      // Dialog Data
          enum { IDD = IDD_TEST_PROPERTYPAGE };
       
          protected:
          virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
       
       
      // Implementation
      protected:
          HICON m_hIcon;
       
          // Generated message map functions
          virtual BOOL OnInitDialog();
          afx_msg void OnPaint();
          afx_msg HCURSOR OnQueryDragIcon();
          DECLARE_MESSAGE_MAP()
      public:
          CPropertySheet* mSheet;
          CMyPage1* mPage1;
          CMyPage2* mPage2;
          afx_msg void OnBnClickedOk();
      };
       
       
       
       
      CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
          : CDialogEx(CMyDlg::IDD, pParent)
          , mSheet(new CPropertySheet)
          , mPage1(new CMyPage1)
          , mPage2(new CMyPage2)
      {
          m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
      }
       
      CMyDlg::~CMyDlg()
      {
          delete mSheet;
          delete mPage1;
          delete mPage2;
      }
       
       
      BOOL CMyDlg::OnInitDialog()
      {
          CDialogEx::OnInitDialog();
       
          // Set the icon for this dialog.  The framework does this automatically
          //  when the application's main window is not a dialog
          SetIcon(m_hIcon, TRUE);         // Set big icon
          SetIcon(m_hIcon, FALSE);        // Set small icon
       
          // добавление страниц
          mSheet->AddPage(mPage1);
          mSheet->AddPage(mPage2);
          // создание страницы свойств
          mSheet->Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);
          mSheet->SetWindowPos(NULL, 0,0,0,0, SWP_NOZORDER | SWP_NOSIZE);
          
          return TRUE;  // return TRUE  unless you set the focus to a control
      }
       
       
       
      void CMyDlg::OnBnClickedOk()
      {      
          // тут исключение
          //  V
          CButton *pBtn = static_cast<CButton*>(mPage2->GetDlgItem(IDC_CHECK1));
          
          if (pBtn->GetCheck())
              TRACE(_T("checked\n"));
          else
              TRACE(_T("no check\n"));
       
          CDialogEx::OnOK();
      }

    но если сначало переключится на страницу, а затем нажать ОК, то все пучком.

    на всякий вот сам проект :D
    Прикреплённый файлПрикреплённый файлTestPropertyPage.zip (72,31 Кбайт, скачиваний: 77)
    Сообщение отредактировано: Cfon -
      Потому что окно создаётся только при переключении на вкладку

      AddPage adds the CPropertyPage object to the CPropertySheet object's list of pages but does not actually create the window for the page. The framework postpones creation of the window for the page until the user selects that page.

      Добавлено
      Проверяй m_hWnd у mPage2
      Сообщение отредактировано: Олег М -
        Цитата Олег М @
        Потому что окно создаётся только при переключении на вкладку

        AddPage adds the CPropertyPage object to the CPropertySheet object's list of pages but does not actually create the window for the page. The framework postpones creation of the window for the page until the user selects that page.

        Добавлено
        Проверяй m_hWnd у mPage2

        да это я понял :D
        что делать то? как создать все вкладки?

        Добавлено
        должна быть функция которая создаёт все страницы, копал но не нашёл
          Цитата Cfon @
          что делать то? как создать все вкладки?

          Добавлено
          должна быть функция которая создаёт все страницы, копал но не нашёл

          затупил конкретно :D :D

          после закрытия окна свойства окна страниц уничтожаются, соотвествено будут уничтожены и их контролы :facepalm:

          выход? все гениальное просто нужно сохранять состояние в переменных :lool:
          Сообщение отредактировано: Cfon -
            чтобы не начинать новую тему в продолжение этой задам вопрос здесь:
            если изменять значения чекбокса на одной странице (как в моем примере), а затем переключиться на другую страницу и закрыть окно свойств кнопкой отмена то изменения значения чекбокса всеравно сохраняются :wacko:. покопал несколько книжек, погуглил но тщетно. ответа не нашел. что-то я уже подзабыл в MFC. раньше таких проблем у меня не было. Что не так?
              Ну, тут либо окно не удаляется, проверь. Либо чекбокс у тебя привязан к какой-то переменной, которая сохраняет значение между вызовами.
                ответ нашел в книжке :wild::
                Цитата Круглински "Visual C++ 6"
                Обмен данными в окне свойств
                Каркас приложений размещает в окне свойств три кнопки. Учтите: каркас вызывает DDX-код для страницы свойств всякий раз, когда пользователь переключается на нее или с нее на другую страницу. Кроме того, как и следовало ожидать, каркас приложений вызывает DDX-код для страницы, когда пользователь щелкает кнопку ОК, обновляя тем самым элементы данных страницы. Теперь понятно, что все элементы данных всех страниц свойств обновляются после щелчка кнопки ОК, и все это без программирования на C++!
                Примечание. В обычном модальном диалоговом окне при щелчке кнопки Cancel все изменения теряются, и переменные-члены класса диалогового окна остаются неизменными. Однако в окне свойств переменные-члены обновляются, даже если пользователь модифицирует содержимое одной страницы, переходит к другой, а потом отменяет изменения в окне свойств щелчком кнопки Cancel.

                в моем коде как раз была переменная mCheck1Value которая использовалась в DDX, я создал DDX связь по привычке как это делал для простого диалога.

                выход? удалить DDX связь (естествено теряется возможность автоматического чтения и записи значения), теперь все пучком, а операции чтения и записи значения сделать вручную, переопределив вирт.функции OnOK и OnInitDialog для CMyPage2. ВСЕ! :D
                Сообщение отредактировано: Cfon -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0310 ]   [ 17 queries used ]   [ Generated: 27.04.24, 10:44 GMT ]