Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Программирование на C / C++" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Меню и акселераторы
Visual C++ Лучшие статьи с сайта www.p-lib.pp.ru |
Главная | Новости | Статьи | Каталог | Софт | Регистрация | Поиск |
Приглашаем авторов статей к сотрудничеству с сайтом. Для того чтобы разместить на сайте статью надо заполнить форму или связаться с нами по E-Mail NEW! Все желающие могут предложить свои темы для следующих рассылок. Для этого свяжитесь со мной по E-Mail. Каждое предложение будет рассмотрено. |
Новые статьи на сайте |
1. ?Липкие?
диалоговые окна Небольшая реализация ?липких? диалоговых окон, как в проигрывателе Winamp. 2. ODBC API В статье описана работа с СУБД через ODBC API. Как соединиться и считать данные из базы. 3. Подключение и отключение от интернета Часто возникает проблема создать собственно само подключение, то есть начать дозвон, используя информацию, находящуюся в свойствах ?точки входа?. Решением этой проблемы служат функции RasDial и RasDialDlg. 4. Сериализация в MFC В статье очень подробно рассматривается механизм сериализации, реализованный в MFC. Автор дает полную информацию о работе макросов DECLARE IMPLEMENT_DYNAMIC, DECLARE/IMPLEMENT_SERIAL и DECLARE/IMPLEMENT_DYNCREATE. Также обсуждается поддержка версий схем сериализации. 5. Метод с возвращаемым значением Как же нам сделать так, что бы некоторый метод возвращал значение (при вызове этого метода в клиенте, разумеется)? Очень просто... 6. Критические секции Понятие критической секции позволяет уберечь определенные области программы так, чтобы в этой области программы в данный момент времени исполнялся бы только один поток. 7. Изменение настроек подключения В этой вы ознакомитесь с функциями, предоставляющими программе создавать и изменять соединения, без применения диалогов и если потребуется без участия пользователя. 8. События Событие является объектом, очень похожим на семафор, но в несколько видоизмененном виде. Рассмотрим функции для работы с событиями. 9. Internet API. Как и где его использовать Эта статья обсуждает общие положения работы с Internet application programming interface (API), а затем подробнее рассматривает некоторые из функций... 10. Определение разрыва TCP-соединения В статье рассматривается один из способов контроля над работоспособностью TCP/IP-соединения под Windows ? создание keep-alive таймера. |
Свежие компьютерные новости |
12.01.2006
Google откроет книжный интернет-магазин 12.01.2006 Opera Software выпускает браузер для бытовой техники 12.01.2006 Windows ХР загрузили на процессоре с частотой 25 МГц и 18 Мб ОЗУ 12.01.2006 Билл Гейтс не считает Google основным конкурентом 12.01.2006 "Битрикс" и NetPromoter проводят семинар 12.01.2006 Крошечный блок питания PicoPSU-120 12.01.2006 Macworld 2006: Microsoft продолжит выпуск Office для Mac OS 12.01.2006 AOL купила компанию видеопоиска Truveo |
Меню и акселераторы |
В этой статье я вас ознакомлю с классом CMenu. С помощью этого класса можно создавать меню в MFC приложениях. Так же будет рассмотрен вопрос об использовании акселераторов. Итак, начнем с описания класса CMenu. Класс CMenuРассмотрим некоторые наиболее важные функции и переменные этого класса. IDR_MENU1 MENU BEGIN POPUP "File" BEGIN MENUITEM "Open", ID_FILE_OPEN131 MENUITEM "Exit", ID_FILE_EXIT END POPUP "File2" BEGIN MENUITEM "Open2", ID_FILE2_OPEN2 MENUITEM "Exit2", ID_FILE2_EXIT2 END POPUP "Help" BEGIN MENUITEM "About", ID_HELP_ABOUT END END Как видите, меня имеет идентификатор IDR_MENU1, который, разумеется, имеет числовое выражение. Если мы посмотрим таблицу Resource Symbols, то увидим, что числовое выражение этого идентификатора 129 (у автора). Как вы наверно уже знаете, числовые значения идентификаторов хранятся в файле resource.h. Такие же идентификаторы имеет каждый элемент меню. Это очень важно, так как в программе мы фактически имеем дело не с меню, а с его элементами. Теперь разберем алгоритм установки меню в диалоговое окно. Для этой цели естественно нужно выбрать функция OnInitDialog. Определим в начале файла указатель cm: CMenu * cm;. Следующий шаг ? это создание объекта класса CMenu: cm = new CMenu;. Теперь загружаем шаблон меню из файла ресурсов: cm->LoadMenu(IDR_MENU!). таким образом, наш объект наполнился реальным содержанием. Наконец последнее, мы должны пристыковать получившийся объект к диалоговому окну. Это производится следующим действием This->SetMenu(cm); ?This?, как вы понимаете, указывает на объект ? диалоговое окно, SetMenu ? метод, осуществляющий желанную нами пристыковку. И все, этого уже достаточно, чтобы в созданном диалоговом окне появилось и меню. Да, не забудьте, закрывая окно, удалить меню из памяти, дабы не оставлять за собой мусор. Делается это очень просто: delete cm. Конечно, этого еще не достаточно для полноценного функционирования приложения, так как пункты меню должны работать, то есть при выборе пункта должна выполняться какая-то процедура. Функцию-обработчик можно сделать для каждого пункта меню. Делается это точно тек же, как для любых других элементов диалогового окна. Для этого, находясь в редакторе меню, нужно щелкнуть правой кнопкой мыши на нужном элементе меню и выбрать Add Event Handler. Далее, в появившемся окне выбирается имя функции и команда, которую вы хотите обрабатывать. Разумеется, этой командой будет COMMAND. Кроме того, в окне следует выбрать класс, где будет производиться обработка. Следует выбрать класс, объектом которого является наше окно. Далее, оказавшись в нужном файле и в нужной функции, можете вводить нужный нам фрагмент кода, который будет выполняться, когда будет выбран соответствующий пунк меню. В принципе этого уже достаточно, чтобы писать приложения с меню. Теперь обратимся к отдельному, но тесно связанному с меню вопросу ? клавишам акселераторам. Дело в том что этот ресурс используется в основном для быстрого доступа к элементам меню. Для того чтобы клавиша-акселератор была связана с соответствующим пунктом меню, нужно чтобы идентификаторы пункта меню и акселератора совпадали. Тогда обработчик пункта меню и клавиши будет одним и тем же. Но для работы акселератора нужно сделать еще две вещи. Во-первых, следует загрузить таблицу акселераторов в память. Сделать это можно там же, где вы загружаете меню. Но вот для диалогового окна (точнее в классе CDialog) подходящего метода нет. Придется воспользоваться функцие API: LoadAccelerators. Загружая таблицу, эта функция возвращает дискриптор загруженного ресурса. Следует запомнить этот дискриптор в какой-нибудь глобальной переменной. Наприметр, можно ввести дополнительное свойство в объект theApp. Первым аргументом функции является дескриптор приложения, который может быть с помощью глобальной функции AfxgetInstanceHandle(). Вторым аргументом является идентификатор таблици акселераторв, преобразованный с помощью макроса MAKEINTRESOURCE. Итак, таблица акселераторов загружена, что дальше? Дальше, и это последнее, следует подвергнуть дополнительной обработке сообщение, приходящее на окно. Для этого достаточно переписать метод PreTransleteMessage. BOOL CDemoMenuDlg::PreTranslateMessage(MSG*pMsg) { ::TranslateAccelerator(this->m_hWnd, theApp.h,pMsg); return CDialog::PreTranslateMessage(pMsg); } Как вы уже понимаете, CDemoMenuDlg ? это объект, соответствующий нашему диалоговому окну. Вот теперь все, наша таблица акселераторов будет успешно работать в паре с меню. Теория будет не полной, если я не приведу пример. // DemoMenuDlg.cpp : implementation file // #include "stdafx.h" #include "DemoMenu.h" #include "DemoMenuDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CDemoMenuDlg dialog CMenu* cm; CDemoMenuDlg::CDemoMenuDlg(CWnd* pParent /*=NULL*/) : CDialog(CDemoMenuDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDemoMenuDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_CHECK1, m_check1); } BEGIN_MESSAGE_MAP(CDemoMenuDlg, CDialog) ON_WM_PAINT() ON_WM_RBUTTONUP() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_COMMAND(ID_FILE_OPEN130, OnFileOpen130) ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1) END_MESSAGE_MAP() // CDemoMenuDlg message handlers BOOL CDemoMenuDlg::OnInitDialog() { CDialog::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 // TODO: Add extra initialization here theApp.h=::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCEL)); cm = new CMenu; cm->LoadMenu(IDR_MENU1); this->SetMenu(cm); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDemoMenuDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast Исходник к статье находится здесь. |
Книги с Озона |
Последнии статьи по Delphi |
Советую посетить |
Портал
для Delphi программиста - Быстро развивающийся портал о
программирование на языке Pascal/Delphi. Статьи, исходники, компоненты,
справочники, мануалы, FaQ, программы. |
Дружественные рассылки |
![]() |
Замечания и предложения отправляйте на E-Mail указанный ниже. С уважением Ковязин Дмитрий (admin@p-lib.pp.ru). |
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.visualc Архив рассылки |
Отписаться
Вебом
Почтой
Вспомнить пароль |
В избранное | ||