Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию. Visual C++, MFC, VB, ActiveX


Служба Рассылок Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://alexeev.nm.ru

Visual C++. MFC. Урок 10. Добавление кнопочки к окну.
Visual C++. MFC. Урок 11. Обрабатываем нажатие кнопки.
Visual C++. MFC. Урок 12. Класс CListBox.
Visual C++. MFC. Урок 13. Продолжение класса CListBox.

Visual C++. MFC. Урок 10. Добавление кнопочки к окну

Давайте теперь расположим в нашем окне какой-нибудь элемент управления. Например, кнопочку. Для кнопок в MFC существует класс CButton. Добавим в наш оконный класс переменную типа CButton:

class CMyMainWnd : public CFrameWnd{
public:
    CButton m_btn1;
    ...

Но наличие переменной типа CButton ещё не означает, что у нас кнопочка появится на нашем окне. Для того, чтобы она появилась, мы должны её создать. Делаем мы это с помощью метода Create. Метод этот принадлежит классу CButton. Теперь вопрос, а где и когда мы можем создать нашу кнопку? Давайте создадим её при создании нашего окна. Для достижения этого мы должны написать обработчик для события WM_CREATE (он будет называться OnCreate). Делаем это. Добавляем функцию в класс:

}
    ~CMyMainWnd(){
        KillTimer(1);
        KillTimer(2);
    }
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

Добавляем макрос в карту сообщений:

...
ON_WM_TIMER()
ON_WM_CREATE()
END_MESSAGE_MAP()

Добавляем реализацию нашей функции:

int CMyMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
    m_btn1.Create("My Button", WS_VISIBLE|WS_CHILD, CRect(0,0,130,40),
        this, 1200);
    return 0;
}

Метод Create класса CButton имеет несколько параметров. Первый - это надпись на кнопке ("My Button"). Второй - стили кнопки. Мы указали, что кнопка должна быть видима (ну ещё бы!) и что кнопка будет подчинёным окном (стиль WS_CHILD). Если стилей несколько, то вы соединяете их с помощью побитового или (|). Следующий параметр определяет прямоугольник, который наша кнопка займёт (Координаты левого верхнего и правого нижнего углов). Здесь мы создаём безымянный объект типа CRect - класса MFC для прямоугольников. Предпоследний параметр (this) - это указатель на родительское окно. Так как наша кнопка должна принадлежать нашему окну, то мы и пишем this (так как мы находимся в оконном классе). И, наконец, последний параметр - это идентификатор кнопки. Мы написали 1200, но можно написать любое число. Важно, чтобы оно было уникальным. У каждого объекта должен быть свой идентификатор. Мы будем его использовать на следующем уроке.

Запускаем нашу программу. В окне появилась кнопка:

Окно с кнопкой Наверх

Visual C++. MFC. Урок 11. Обрабатываем нажатие кнопки

Посмотрим теперь, как мы для кнопки можем написать обработчик. Или, если это перевести на общечеловеческий язык, то мы хотим, что бы при нажатии на нашу кнопку что-нибудь делалось. Для этого мы должны сделать совсем немного, а именно, во-первых, написать некоторую функцию в нашем классе (она и будет обработчиком), и, во-вторых, как-то привязать нашу функцию к нашей кнопке. Делаем первый шаг:

void f(){
    AfxMessageBox ("1");
}

Этот код надо написать где-нибудь в классе. Это и будет наша функция. Теперь свяжем её с нашей кнопкой:

...
ON_WM_CREATE()
ON_COMMAND(1200, f)
END_MESSAGE_MAP()

Макрос

ON_COMMAND(1200, f)

добавленнный в карту сообщений имеет два параметра. Первый параметр - это идентификатор кнопки. Второй - имя функции, которая с нашей кнопкой связывается. Теперь при нажатии на кнопку у нас будет выскакивать соответствующий MessageBox. Вообще говоря такое связываение идентификатора объекта и функции встречается довольно-таки часто. Например, если вам надо связать с неким элементом меню некоторую функцию, то вы действуете абсолютно аналогично.

Наверх

Visual C++. MFC. Урок 12. Класс CListBox

Давайте добавим в нашу программу ListBox (список). Для такого списка в MFC существует класс CListBox. Для добавления списка мы должны сначала определить в оконном классе указатель на переменную типа CListBox:

    CButton* m_btn1;
    CButton* m_btn2;
    CListBox* m_lbListBox;
    ...

Далее мы должны создать соответствующий объект:

int CMyMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
    m_btn1 = new CButton;
    m_btn2 = new CButton;
    m_lbListBox = new CListBox;
    ...
    m_lbListBox->Create(WS_VISIBLE|WS_CHILD|LBS_STANDARD|WS_HSCROLL|LBS_STANDARD, CRect(130,0,230,180),
        this,1202);
    return 0;
}

Параметры у функции Create аналогичны параметрам одноимённой функции для кнопки. В первом из них присутствуют некоторые стили, специфичные для ListBox'а (с префиксом LBS_). Последний параметр, как всегда, надо выбрать уникальным.

Так как мы создали наш ListBox динамически, то его надо уничтожить в деструкторе класса:

    ~CMyMainWnd(){
        ...
        delete m_btn2;
        delete m_lbListBox;
    }

Запускаем программу. На форме должен появится список.

Естественно он пустой. Добавим в функции OnCreate несколько элементов для него:

int CMyMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
    ...
    m_lbListBox->Create(WS_VISIBLE|WS_CHILD|LBS_STANDARD|WS_HSCROLL|LBS_STANDARD, CRect(130,0,230,180),
        this,1202);
    m_lbListBox->AddString("Igor");
    m_lbListBox->AddString("Otto");
    m_lbListBox->AddString("Victor");
    return 0;
}
Список

Этот список будет появляться при запуске программы. Посмотрим теперь более подробно, как мы можем с этим списком работать. Но об этом - в следующем уроке.

Наверх

Visual C++. MFC. Урок 13. Продолжение класса CListBox

Продолжаем работать со списком (класс CListBox). Посмотрим, что мы вообще можем с элементами списка делать. Операций не так уж и много. Добавить элемент на определённую позицию, удалить элемент с определенной позиции, пересчитать элементы и т. д. Давайте все это воплощать. У нас есть кнопка с надписью MyButton. Все наши действия со списком будут происходить при нажатии этой кнопки.

Давайте для начала добавим элемент на определённую позицию. Для этого напишем следующий код:

void CMyMainWnd::f(){
    m_lbListBox->InsertString(1,"New String");
}

Метод класса InsertString для CListBox вставляет строку, передаваемую в качестве второго параметра, на место, задаваемое первым параметром. Нумерация при этом начинается с нуля. Запустите программу и нажмите на кнопку MyButton. На первом месте в нашем списке появится строка New String:

Добавление строки

Для удаления строки с неким номером используёте метод DeleteString. Например, следующий код будет удалять верхний элемент нашего списка (помните, что нумерация элементов начинается с нуля):

void CMyMainWnd::f(){
    m_lbListBox->DeleteString(0);
}

Теперь посмотрим, как очистить весь список. Для этого используем метод ResetContent:

void CMyMainWnd::f(){
    m_lbListBox->ResetContent();
}

Параметров у этого метода нет.

Движемся дальше. Что мы ещё со списком можем сделать? Ну, например, подсчитать количество элементов. Давайте на этот раз код поместим в таймер - так, чтобы количество элементов списка отображалось в заголовке окна:

void CMyMainWnd::OnTimer(UINT nIDEvent){
    ...
    else{
        CString s;
        s.Format("%d items in ListBox", m_lbListBox->GetCount());
        SetWindowText(s);
    }
}

Теперь после запуска программы у нас в заголовке окна будет показываться количество элементов списка:

Количество элементов

И, напоследок, посмотрим, как найти нужную нам строку в списке. Для этого используем метод FindString:

void CMyMainWnd::f(){
    ...
    int k=m_lbListBox->FindString(0,"Igor");
    if(k==LB_ERR)
        AfxMessageBox("Строка не найдена");
    else{
        CString s;
        s.Format("Строка найдена на %d-м месте", k);
        AfxMessageBox(s);
    }
}

Данный код ищет строку "Igor". Если она есть, то наш метод возвратит номер этой строки, а если нет, то значение LB_ERR.

Наверх

© Алексеев Игорь, 2001


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное