На главную Наши проекты:
Журнал   ·   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
  
> Subclassing CEdit
    Привет народ!

    Так решил немного отвлечься от основной темы своего демо на некоторые интерфейсные элементы, вот хочу сделать для числовых едитов чтобы они отображали числа с разделителями (например так 1,000,000), но если перейти в редактор то отображались без форматирования. Надеюсь нормально объяснил :D

    первый мой шаг это определил класс от CEdit:
    ExpandedWrap disabled
      class CNumericFormatedEdit : public CEdit
      {
          DECLARE_DYNAMIC(CNumericFormatedEdit)
       
      public:
          CNumericFormatedEdit();
          virtual ~CNumericFormatedEdit();
       
      protected:
          DECLARE_MESSAGE_MAP()
      };


    а дальше то что? какие сообщения надо определить и/или вирт.функции? :huh:
      так обработал OnEnSetFocus и OnEnKillFocus, все пучком, но вот тока при открытии диалога мой эдит не отображается в формате, ясно что надо где-то обработать но вот где? пробовал CNumericFormatedEdit::OnActivate, OnCreate, OnShowWindow и тд тп, но эти сообщения почему то не перехватваются я хз что делать :wacko:

      ExpandedWrap disabled
        // CNumericFormatedEdit
         
        class CNumericFormatedEdit : public CEdit
        {
            DECLARE_DYNAMIC(CNumericFormatedEdit)
         
        public:
            CNumericFormatedEdit();
            virtual ~CNumericFormatedEdit();
         
            void FormatText(CString& value);
        private:
            CString mValue;
            BOOL mIsFormatted;
         
        protected:
            DECLARE_MESSAGE_MAP()
        public:
            afx_msg void OnEnKillfocus();
            afx_msg void OnEnSetfocus();    
        };
         
        // CNumericFormatedEdit
         
        IMPLEMENT_DYNAMIC(CNumericFormatedEdit, CEdit)
         
        CNumericFormatedEdit::CNumericFormatedEdit()
            : mIsFormatted(FALSE)
        {
        }
         
        CNumericFormatedEdit::~CNumericFormatedEdit()
        {
        }
         
         
        void CNumericFormatedEdit::FormatText(CString& value)
        {
            NUMBERFMT nf{ 0 };
            nf.NumDigits = 0;
            nf.LeadingZero = FALSE;
            nf.Grouping = 3;
            nf.lpDecimalSep = _T(",");
            nf.lpThousandSep = _T(" ");
            nf.NegativeOrder = 0;
         
            const int cBufferSize = 80;
            GetNumberFormat(LOCALE_USER_DEFAULT, 0, mValue, &nf, value.GetBuffer(cBufferSize), cBufferSize);
            value.ReleaseBuffer();
        }
         
         
        BEGIN_MESSAGE_MAP(CNumericFormatedEdit, CEdit)
            ON_CONTROL_REFLECT(EN_KILLFOCUS, &CNumericFormatedEdit::OnEnKillfocus)
            ON_CONTROL_REFLECT(EN_SETFOCUS, &CNumericFormatedEdit::OnEnSetfocus)    
        END_MESSAGE_MAP()
         
         
         
        // CNumericFormatedEdit message handlers
         
         
        void CNumericFormatedEdit::OnEnKillfocus()
        {
            CString value;
            GetWindowText(mValue);
            FormatText(value);
            SetWindowText(value);
            mIsFormatted = TRUE;
        }
         
         
        void CNumericFormatedEdit::OnEnSetfocus()
        {
            if (!mIsFormatted)
                GetWindowText(mValue);
         
            CString value;
            value.Format(_T("%s"), mValue);
            SetWindowText(value);
        }
        А ты вызываешь для него SubclassDlgItem в OnInitDialog?
          нашел способ, можно обработать WM_GETDLGCODE, тк WM_GETDLGCODE вызывается многократно при обращении к GetDlgItem, то поставил костыль в ввиде флажка, да и убрал проверку из OnEnSetfocus:

          ExpandedWrap disabled
            void CNumericFormatedEdit::OnEnKillfocus()
            {
                CString value;
                GetWindowText(mValue);
                FormatText(value);
                SetWindowText(value);  
            }
             
             
            void CNumericFormatedEdit::OnEnSetfocus()
            {
                SetWindowText(mValue);
            }
             
            UINT CNumericFormatedEdit::OnGetDlgCode()
            {
                if (!mIsOnceInitValue)
                {              
                    OnEnKillfocus();
                    mIsOnceInitValue = TRUE;
                }
             
                return CEdit::OnGetDlgCode();
            }


          Добавлено
          Цитата Олег М @
          А ты вызываешь для него SubclassDlgItem в OnInitDialog?

          не вызываю DDX_Control в OnInitDialog :
          ExpandedWrap disabled
            DDX_Control(pDX, IDC_TRACK_MILLISECONDS_EDIT, mMillisecondsEdit);
          Сообщение отредактировано: Cfon -
              Цитата Cfon @
              Так решил немного отвлечься от основной темы своего демо на некоторые интерфейсные элементы, вот хочу сделать для числовых едитов чтобы они отображали числа с разделителями (например так 1,000,000), но если перейти в редактор то отображались без форматирования. Надеюсь нормально объяснил :D

              Чем тебе CMFCMaskedEdit не угодил? :huh:
                Цитата KILLER @
                Чем тебе CMFCMaskedEdit не угодил? :huh:

                а он также может как я сделал? :D
                  Цитата Cfon @
                  а он также может как я сделал? :D

                  Я же тебе ссылку кинул, там даже пример использования есть.
                  Сообщение отредактировано: KILLER -
                    На нашем сайте очень легко заказать проститутку и для этого вам всего лишь нужно зайти на него и выбрать понравившуюся там девушку.
                      Цитата KILLER @
                      Цитата Cfon @
                      а он также может как я сделал? :D

                      Я же тебе ссылку кинул, там даже пример использования есть.

                      ладно спс потом почекаю маскэедит, на первый взгляд не то, мне надо не фиксированый формат чисел ;)

                      Добавлено
                      Цитата olok90 @
                      На нашем сайте очень легко заказать проститутку и для этого вам всего лишь нужно зайти на него и выбрать понравившуюся там девушку.

                      иди отсюда :D
                      Сообщение отредактировано: Cfon -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0393 ]   [ 16 queries used ]   [ Generated: 29.03.24, 09:58 GMT ]