Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как добавить обработчик? начал осваивать VS 2005 
V
    Опции темы
ksili
Дата 19.10.2008, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Пишу первое GUI-приложение в MS VS 2005. До этого писал писал в Билдере. Также есть книга по Visual C++ 6. 

При создании проекта я выбрал не MFC, а Win32-приложение, хотя в книге вроде описано всё про MFC.

Добавил в меню новый пункт, теперь хочу создать обработчик для его нажатия. Вообще не нахожу где это. В книге это делалось при помощи Class Wizard. Насколько я понял, в VS 2005 этот инструмент не сохранился. Единственное, что я смог - найти идетификатор новой кнопки там, где Macros and Consatnts. Если туда щёлкнуть, то открывается определение этого идентификатора в Resource.h.

Куда нажать, чтобы создать обработчик?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 19.10.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



написать обработчик сообщения в win main smile 
PM MAIL Skype GTalk   Вверх
ksili
Дата 19.10.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Lazin @  19.10.2008,  13:16 Найти цитируемый пост)
написать обработчик сообщения в win main  

Так делается именно для Win32-приложения?
В MFC будет Class Wizard?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 19.10.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



В MFC есть визарды, но я его не использовал, для win32 приложений визардов нет (насколько я знаю)
PM MAIL Skype GTalk   Вверх
_GRIN_
Дата 19.10.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


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

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



простенький пример GUI для Win32 Console Application при помощи файла ресурсов (диалоговое окошко набросал в той же студии (только 2003 - но не важно)

Код


//################################################################################
// Функция обработки сообщений посылаемых диалоговому окну

LRESULT CALLBACK MainDialogProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
        //при инициализации заблокировать кнопки, до тех пор пока поля пустые
        hEdit_surname=::GetDlgItem(hWnd,IDC_EDIT_SURNAME);
        hEdit_fullname=::GetDlgItem(hWnd,IDC_EDIT_FULLNAME);
        hEdit_lastnum=::GetDlgItem(hWnd,IDC_EDIT_LAST_NUM);
        hBut_1=::GetDlgItem(hWnd,ID_BUTTON_1);
        hBut_2=::GetDlgItem(hWnd,ID_BUTTON_2);
        ::EnableWindow(hBut_1,0);
        ::EnableWindow(hBut_2,0);
        return TRUE;
    case WM_CLOSE:
        EndDialog(hWnd,0);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
                        // тут как раз идентификаторы кнопок и ресурсов и действия по данным конпкам
        case IDC_EDIT_SURNAME:
        case IDC_EDIT_FULLNAME:
        case IDC_EDIT_LAST_NUM:
            EnableButtons();
            break;

        case ID_BUTTON_1: //конкретно тут по нажатию на кнопку вызываем функцию
            //считать фамилию и имя и выполнить задачу 1 с выводом результата в текстовый файл
            TaskNumber_1();
            break;
        case ID_BUTTON_2:
            //считать фамилию и имя и выполнить задачу 2 с выводом результата в текстовый файл
            TaskNumber_2();
            break;
        }
        return TRUE;
    }
    return FALSE;
}

//################################################################################
void main()
{
        HINSTANCE hInstance=GetModuleHandle(0);
        InitCommonControls();
        if(!RegisterMainDialogClass(hInstance))
        {
            MessageBox(0,"Class MainDialog could not registred",0,0);
            return;
        }
        DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,0,(DLGPROC)MainDialogProc);
        ExitProcess(0);
}


в кратце в
     case WM_COMMAND: - тут обрабатываем команды от контролов (кнопок и т.д.)
        switch(LOWORD(wParam)) (а тут идентифицируем от какого контрола пришло сообщение (кнопку нажали или там в поле ввода чё ввели)

надеюсь я правильно понял вопрос и совет поможет, удачи ... smile


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
ksili
Дата 19.10.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Спасибо. 
Но Win32-приложение я уже попробовал. Кое-чего получилось. 
Сейчас пробую MFC. И опять тот же вопрос! Как создать обработчик какого-нибудь события? 

Хочу сделать для начала такую прогу. Юзер водит мышью над окном, а в верхнем левом углу выводятся координаты курсора мыши. Поэтому надо сделать обработчик события WM_MOUSEMOVE, если не ошибаюсь.
Окно Class View содержит уже больше, чем Win32 приложение. Нашёл там как добавить функцию. Добавил функцию OnMouseMove:
Код

void CMy1MFCView::OnMouseMove(CDC *pDC)
{
    CMy1MFCDoc *pDoc;
    CPoint p;

    pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    GetCursorPos(&p);
    pDoc->x = p.x;
    pDoc->y = p.y;

    pDC->TextOutW(pDoc->x, pDoc->y, pDoc->sCoord);
}

Всё компилится, но функция к событию никак не привязана, поэтому не вызввается. Как же всё-таки обработать событие?

Это сообщение отредактировал(а) ksili - 19.10.2008, 16:23


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 19.10.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



В MSDN'е нашёл следующее:
Цитата

To create a handler for any applicable Windows message 
Click the control for which you want to handle the notification event.

In the Properties window, click the ControlEvents button to display the list of common Windows events associated with the control.

А как кликнуть в этот контрол, если он нигде не отображается? В Билдере можно бкз проблем посмотреть спроектированную форму со всеми компонентами, а тут кажись нету...


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 19.10.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



В class view нашёл, что можно отобразить скрытые свойства и методы класса и там нашёл, что всевозможные события уже объявлены. То, что нужно мне, там с таким прототипом:
Код

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

теперь буду думать, как её определить...


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
eyeofhell
Дата 19.10.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


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

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



Цитата

Добавил в меню новый пункт, теперь хочу создать обработчик для его нажатия. Вообще не нахожу где это. В книге это делалось при помощи Class Wizard.


Два раза кликyи по любой кнопке в редакторе. Появится class wizard. Для верхнего меню - правый клик, add handler.
PM MAIL ICQ   Вверх
ksili
Дата 20.10.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(eyeofhell @  19.10.2008,  23:29 Найти цитируемый пост)
Два раза кликyи по любой кнопке в редакторе. Появится class wizard. Для верхнего меню - правый клик, add handler.

Нету такого.
Что такое "любая кнопка в редакторе"? У меня в редакторе текст программы  smile 



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
eyeofhell
Дата 21.10.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


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

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



Редактор GUID. 'Add resource' -> 'Dialog' - Открывается редактор пользовательского интерфейса. Там двойной клик на любую кнопку нарисованного окна программы - откроется MFC Wizard.

В Express ( бесплатных ) версиях VS этого редактора нет.
PM MAIL ICQ   Вверх
ksili
Дата 21.10.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



eyeofhell, спасибо. теперь становится понятно - пока в проекте нет какого-нибудь наследника от диалога, то и события ниоткуда возникнуть не могут. Я так понимаю. чаще так и поступают - создают приложение на основе диалога, а не SDI или MDI.

Однакл я нашел, где добавляются обработчики в SDI-приложении. Открываем юнит вида (...View.cpp). Находим там место, где маппируются события, между BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. 
Код

BEGIN_MESSAGE_MAP(CMy1MFCView, CView)
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

Щелкаем туда курсор и в окне Properties появляются дополнительные значки, и среди них Messages и Events! Через Messages их (обработчики) и можно добавлять. 
Если щёлкнуть в другое место юнита - эти значки исчезают! Спрашивается - нах? Место что ли сэкономили? 
Какая гадость эта ваша заливная рыба...


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
eyeofhell
Дата 21.10.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


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

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



SDI и MDI как технология умерла много лет назад. В современных вижуалках почти не поддерживается на уровне визардов.

Цитата

Какая гадость эта ваша заливная рыба... 


Профессиональный инструмент, что ж поделаешь. Для обучения и тренировки - бесполезная гадость. Но если точно знать что делаешь - то тупо быстрее разработка идет smile.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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