Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение свойств Edit Box, MFC 
:(
    Опции темы
Dart
Дата 8.9.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

Репутация: 2
Всего: 2



Gremlin, только создавать всой контрол.
В принципе, есть еще одна достаточно простая возможность: на CEdit создать Child'а тоже CEdit, но без WS_BORDER. У родительского убрать WS_TABSTOP и WS_DISABLED и позиционировать его туда, куда тебе нужно в OnMove и OnSize.
Другой вариант - писать с нуля и плясать от CWnd.
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
Bishop
Дата 9.9.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 2
Всего: 16



Gremlin, 
Код
CString string(_T("Мега - длинный текст. Его продолжение."));
int margin = 10;  // отсуп справа и слева, можно и разные задать
CRect wnd_rect;
CSize text_rect;
CWnd *edit = GetDlgItem(IDC_EDIT);
edit->GetClientRect(&wnd_rect);
bool multiline = !(edit->GetStyle() & ES_AUTOHSCROLL);
CDC *pdc = edit->GetDC();
// размер текста: высота и длина строки
GetTextExtentPoint32(pdc->m_hDC, string, string.GetLength(), &text_rect);
// ~ количество строк, если multiline
int text_lines = text_rect.cx/(wnd_rect.Width() - 2 * margin);
// tmp - отступ сверху и снизу
int tmp = wnd_rect.Height() - text_rect.cy * (multiline?text_lines:1);
tmp /= 2;

// устанавливаем RECT вывода. Если вместо последнего tmp подставить 0, 
// то при неверно вычисленном text_lines последняя строка не обрежется.
// т.к. текст лучше смотрится когда ближе к нижнему краю, а не к верхнему,
// то отступ от top при multiline немного увеличивается.
wnd_rect.DeflateRect(margin, 
    tmp + (multiline?text_rect.cy/4:0), margin, tmp);
edit->SendMessage(EM_SETRECT, 0, (LPARAM)&wnd_rect);
edit->SetWindowText(string);

Вот в таком вот примерно акцепте. Через EM_SETRECT выставляется прямоугольник, в который будет выведен текст. Применимо только для Multiline полей.

Это сообщение отредактировал(а) Bishop - 9.9.2006, 09:01
PM WWW ICQ   Вверх
Gremlin
Дата 19.9.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



Вот ешо вопрос про Едит. Хочу чтобы в поле можно было вводить только цыфры  и символы "-" и ".". Я в принципе сделал в обработчике по изменению производить эту проверку но мне кажется это не правильно ибо символ сначала заносится в едит а потом если не удовлетворяет условию удаляется. Есть ли у кого пример как это сделать с помощью я так понимаю WM_KEYDOWN?
PM MAIL   Вверх
Earnest
Дата 20.9.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Сделай свой обработчик WM_CHAR и проверяй в нем. Если символ устраивает, вызывай стандартный обработчик, нет - ничего не делай или пищи.


--------------------
...
PM   Вверх
Gremlin
Дата 20.9.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



а как пикнуть?
PM MAIL   Вверх
vinter
Дата 20.9.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Код

MessageBeep((WORD)-2);



--------------------
Мой блог
PM MAIL WWW   Вверх
Gremlin
Дата 20.9.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



гыгы это шутка была
а по теме: Создал OnChar ставлю внутри точку остановки жму символ и нефига не заходит а выполняется сразу обработчит на изменение Едита!
PM MAIL   Вверх
Earnest
Дата 21.9.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Видимо, что-то делаешь неправильно.
Проверь, что 
1) OnChar переопределено у наследника CEdit (а не у диалога!)
2) обработчик подключен в карту сообщений 
3) контрол правильно субклассирован (т.е. есть DDX_Control с переменной нужного класса)


--------------------
...
PM   Вверх
Gremlin
Дата 22.9.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



У меня 4 класса С...App, C...Dlg и два класса PropertySheet, вот на одной из вкладок и находится Edit Box так где мне нужно переопреелять onChar?
PM MAIL   Вверх
Bishop
Дата 23.9.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 2
Всего: 16



Gremlin,
Можно и так (если Edit Box такой один и/или не хочешь заниматься наследованием/субклассированием):
Код

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
    CString txt;
    bool positive = false;
    CEdit *pEdit = (CEdit *) GetDlgItem(IDC_EDIT1);
    int sel_start, sel_end;
    char DesimalSeparator[4];

    if (pMsg->message == WM_CHAR && pMsg->hwnd == pEdit->m_hWnd)
    {
        pEdit->GetWindowText(txt);
        GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) DesimalSeparator, 4);
        switch (pMsg->wParam)
        {
        case L'.':
        case L',':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить ноль
                {
                    pEdit->SetWindowText(L"0");
                    pEdit->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case 0x8: // backspace
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            break;
        case '+':
            positive = true;
        case '-':
            pEdit->GetSel(sel_start, sel_end); // сохранить выделение/позицию
            if (positive)
            {
                if (txt[0] == '-')
                {
                    txt.TrimLeft('-');
                    sel_start--;
                    sel_end--;
                }
            }
            else if (txt[0] != '-')
            {
                txt.Insert(0, '-');
                sel_start++;
                sel_end++;
            }
            pEdit->SetWindowText(txt);
            pEdit->SetSel(sel_start, sel_end); // восстановить
            return TRUE;
        default:
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

только для твоего PropertySheet. 
PM WWW ICQ   Вверх
Gremlin
Дата 25.9.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



а почему нельзя для нескольких? у меня их 4 таких поля на одном щите, и где я должен эту функцию вызывать? в обработчике по изменению?
PM MAIL   Вверх
Earnest
Дата 26.9.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Если нужно для нескольких, то небольшое изменение в вышеприведенном коде от Bishop:
pMsg->hwnd == pEdit->m_hWnd заменяешь на проверку всех 4 полей. Можно функцию написать, чтобы красивее было.
Вариант со своим классом и обработчиком OnChar - сделай все эдиты этим классом.
 


--------------------
...
PM   Вверх
Gremlin
Дата 26.9.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



а если проверять в котором чичас эдите курсор и проверять тока по этому эдиту?
PM MAIL   Вверх
Earnest
Дата 26.9.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Gremlin @  26.9.2006,  18:41 Найти цитируемый пост)
а если проверять в котором чичас эдите курсор 

Это и есть pMsg->hWnd. Тебе надо проверить, что это hWnd совпадает с одним из твоих.


--------------------
...
PM   Вверх
Gremlin
Дата 27.9.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.8.2006

Репутация: нет
Всего: нет



немножко переделал но мне кажется не очень красиво вышло слишком много кода
Код

BOOL CMultiAmp::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    CString txt;
    bool positive = false;
    CEdit *pEdit1 = (CEdit *) GetDlgItem(IDC_SENSIVITY1);
    CEdit *pEdit2 = (CEdit *) GetDlgItem(IDC_SENSIVITY2);
    CEdit *pEdit3 = (CEdit *) GetDlgItem(IDC_SENSIVITY3);
    CEdit *pEdit4 = (CEdit *) GetDlgItem(IDC_SENSIVITY4);
    int sel_start, sel_end;
    char DesimalSeparator[4] = ".";

    //-----------------------------------------------------------
    if (pMsg->message == WM_CHAR && pMsg->hwnd == pEdit1->m_hWnd)
    {
        pEdit1->GetWindowText(txt);
        //GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) DesimalSeparator, 4);
        switch (pMsg->wParam)
        {
        case ',':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit1->SetWindowText("0");
                    pEdit1->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case '.':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit1->SetWindowText("0");
                    pEdit1->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case 0x8: // backspace
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            break;
        case '+':
            positive = true;
        case '-':
            pEdit1->GetSel(sel_start, sel_end); // сохранить выделение/позицию
            if (positive)
            {
                if (txt[0] == '-')
                {
                    txt.TrimLeft('-');
                    sel_start--;
                    sel_end--;
                }
            }
            else if (txt[0] != '-')
            {
                txt.Insert(0, '-');
                sel_start++;
                sel_end++;
            }
            pEdit1->SetWindowText(txt);
            pEdit1->SetSel(sel_start, sel_end); // восстановить
            return TRUE;
        default:
            ::MessageBeep(MB_OKCANCEL);
            return TRUE;
        }
    }
    //-----------------------------------------------------------
    if (pMsg->message == WM_CHAR && pMsg->hwnd == pEdit2->m_hWnd)
    {
        pEdit2->GetWindowText(txt);
        //GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) DesimalSeparator, 4);
        switch (pMsg->wParam)
        {
        case ',':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit2->SetWindowText("0");
                    pEdit2->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case '.':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit2->SetWindowText("0");
                    pEdit2->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case 0x8: // backspace
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            break;
        case '+':
            positive = true;
        case '-':
            pEdit2->GetSel(sel_start, sel_end); // сохранить выделение/позицию
            if (positive)
            {
                if (txt[0] == '-')
                {
                    txt.TrimLeft('-');
                    sel_start--;
                    sel_end--;
                }
            }
            else if (txt[0] != '-')
            {
                txt.Insert(0, '-');
                sel_start++;
                sel_end++;
            }
            pEdit2->SetWindowText(txt);
            pEdit2->SetSel(sel_start, sel_end); // восстановить
            return TRUE;
        default:
            ::MessageBeep(MB_OKCANCEL);
            return TRUE;
        }
    }
    //-----------------------------------------------------------
    if (pMsg->message == WM_CHAR && pMsg->hwnd == pEdit3->m_hWnd)
    {
        pEdit3->GetWindowText(txt);
        //GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) DesimalSeparator, 4);
        switch (pMsg->wParam)
        {
        case ',':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit3->SetWindowText("0");
                    pEdit3->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case '.':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit3->SetWindowText("0");
                    pEdit3->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case 0x8: // backspace
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            break;
        case '+':
            positive = true;
        case '-':
            pEdit3->GetSel(sel_start, sel_end); // сохранить выделение/позицию
            if (positive)
            {
                if (txt[0] == '-')
                {
                    txt.TrimLeft('-');
                    sel_start--;
                    sel_end--;
                }
            }
            else if (txt[0] != '-')
            {
                txt.Insert(0, '-');
                sel_start++;
                sel_end++;
            }
            pEdit3->SetWindowText(txt);
            pEdit3->SetSel(sel_start, sel_end); // восстановить
            return TRUE;
        default:
            ::MessageBeep(MB_OKCANCEL);
            return TRUE;
        }
    }
    //-----------------------------------------------------------
    if (pMsg->message == WM_CHAR && pMsg->hwnd == pEdit4->m_hWnd)
    {
        pEdit4->GetWindowText(txt);
        //GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) DesimalSeparator, 4);
        switch (pMsg->wParam)
        {
        case ',':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit4->SetWindowText("0");
                    pEdit4->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case '.':
            if (txt.Find(DesimalSeparator[0]) < 0) // можно вводить только 1 разделитель
            {
                if (txt.GetLength() == 0)// в пустое поле добавить 0
                {
                    pEdit4->SetWindowText("0");
                    pEdit4->SetSel(1, 1);
                }
                pMsg->wParam = DesimalSeparator[0];
            }
            else
                return TRUE;
        case 0x8: // backspace
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            break;
        case '+':
            positive = true;
        case '-':
            pEdit4->GetSel(sel_start, sel_end); // сохранить выделение/позицию
            if (positive)
            {
                if (txt[0] == '-')
                {
                    txt.TrimLeft('-');
                    sel_start--;
                    sel_end--;
                }
            }
            else if (txt[0] != '-')
            {
                txt.Insert(0, '-');
                sel_start++;
                sel_end++;
            }
            pEdit4->SetWindowText(txt);
            pEdit4->SetSel(sel_start, sel_end); // восстановить
            return TRUE;
        default:
            ::MessageBeep(MB_OKCANCEL);
            return TRUE;
        }
    }
    
    return CPropertyPage::PreTranslateMessage(pMsg);
}

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.