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

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск №15


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск № 15
Cайт : SoftMaker.com.ru
Архив рассылки : C/C++ Вопрос-Ответ (архив)
Количество подписчиков : 1236
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

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

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

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

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 65 ( Vladimir Vladimirovich )

Дайте пожайлусто прямую ссылку на Borland C++ 3.1
И есть кого-нибуть информация на русском как программировать CGI скрипты на C++

Ответить на вопрос

Вопрос № 66 ( Isaev Alex )

Здравствуйте!
У меня проблема с Visual C++.
Как организовать выборку при доступе к базе данных (MS Access), с
помощью m_strFilter, чтобы фильтр работал не с одним полем, а со всеми
полями таблицы, и чтобы вводить можно было часть слова.
Буду крайне признателен всем кто ответит.
Alex.

Ответить на вопрос

Вопрос № 67 ( Max116 )

Приветствую всех !
Не подскажет ли кто, как работать со звуком в Windows?
Я хочу написать что то типа своего небольшого проигрывателя.
Это, конечно не должен быть винамп - это просто для понимания
принципов проигрывания звука. Для начала хотелось бы просто
научиться проигрывать wav файлы (длиной где то 5 минут), чтобы
это все работало без сбоев.
Писать планирую в Visual C++, но подойдет любая информация - с
любыми примерами (и Builder тоже). Буду благодарен за любые ссылки по этой
теме.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 62 ( Виктор )

Здравствуйте.

Ситуация такая:
при генерации кода из Rational Rose в MFS, в MFS
создаётся проэкт и генерируется исходный код.
Подскажите, каким образом можно связать сгенерированный класс с
создаваемым отдельно диалоговым окном (когда я пытаюсь привязать к
окну сгенерированный клас, мастер этот класс не видит).

Виктор

Ответ ( 3V )

Ну, проще всего открыть ресурс диалога в редакторе ресурсов, нажать Ctrl+W (или в меню: View/Class Wizard), в появившемся диалоге выбрать "Select an existing class", нажать "OK" и указать класс, к которому "привяжется" диалог.
На самом деле просто класс визард пропишет в декларацию класса в секцию специальных комментариев (между //{{AFX_DATA(...) и //}}AFX_DATA) ID твоего диалога примерно так:

//{{AFX_DATA(CErtDlg)
enum { IDD = IDD_DIALOG1 };
//}}AFX_DATA

А этот самый IDD, конечно же, передается в конструктор CDialog (см. код конструктора своего класса).
Это можно (а чтобы быть во всем уверенным - и нужно) делать ручками.

Насчет того, что мастер класс не видит - тут все достаточно просто.
Удали в проекте файл что_то.clw. Потом нажми Ctrl+W - визард предложит это класс сгенерить. Перегенерируй файл (кстати, он текстовый - посмотри туда, поймешь для чего он нужен).
Только учти, чтобы визард начал этот класс "видеть", в объявлении класса должны присутствовать секции комментариев:

1. //{{AFX_DATA(...) и //}}AFX_DATA
2. //{{AFX_VIRTUAL(...) и //}}AFX_VIRTUAL
3. //{{AFX_MSG(...) и //}}AFX_MSG

Также должна быть декларирована и реализована карта сообщений.
Между макросами BEGIN_MESSAGE_MAP и END_MESSAGE_MAP должны быть комментарии: //{{AFX_MSG_MAP(...) и //}}AFX_MSG_MAP (кстати, везде вместо ... должно быть имя класса окна диалога (в твоем случае)).

Это, пожалуй, все. А такие спец. комментарии являются для визарда маркерами, между которыми он нужный код вставляет. Соответственно, при отсутствии, например, //{{AFX_MSG он не может добавлять обработчики (как и, например, отсутствии карты сообщений). Поэтому и класс не показывает.
Вопрос № 63 ( Diosso )

Как создать меню к окну, используя только функции
WinAPI?

Ответ ( Михаил )

Я создаю менюшки так: главное меню описываю в файле ресурсов. А контекстное меню можно загружть из ресурсов с помощью LoadMenu() или создавать при помощи CreatePopupMenu(). Вот пример:

//-----------------
// в ресурсах  - example.rc
 ....
MyMenu MENU  PRELOAD
BEGIN
    POPUP  "Меню0"
    BEGIN
        MENUITEM "Меню1",IDM_1
        MENUITEM SEPARATOR
        MENUITEM "Меню2",IDM_2
        MENUITEM "Меню3", IDM_3,CHECKED
    END
    POPUP  "Help"
    BEGIN
        MENUITEM "О программе", IDM_About
        MENUITEM SEPARATOR
        MENUITEM "Выход", IDM_Exit
    END
END
 
//-----------------
// в  example.cpp
 ....
#define IDM_Exit       1
#define IDM_About      2
    // главное меню задаем при определении класса окна
    ...
    wcl.lpszMenuName = "MyMenu";  // MyMenu задано в файле ресурсов
    ...
    // создаем менюшки
    // 1.контекстное меню
    HMENU Actions;
    Actions=CreatePopupMenu();
    AppendMenu(Actions,MF_STRING,IDM_Exit,"Выход");
    AppendMenu(Actions,MF_SEPARATOR,NULL,NULL);
    AppendMenu(Actions,MF_STRING,IDM_About,"About...");
    // 2.контекстное меню из ресурсов
    ChortcutMenu=GetSubMenu(LoadMenu(hThisInst,"MyMenu"), 1);
    ...........
    
// обрабатываем сообщения
LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,
                            LPARAM lParam)
{
  switch(message)
  {
    .....
    case WM_CONTEXTMENU:
                 TrackPopupMenu(ChortcutMenu,TPM_RIGHTALIGN|
                                TPM_BOTTOMALIGN,LOWORD(lParam),
                                HIWORD(lParam),0,hwnd,NULL);
                 break;
    case WM_COMMAND:
         switch(LOWORD(wParam))
          {
           case IDM_Exit:  PostMessage(hwnd,WM_CLOSE,0,0); break;
           case IDM_About:
                 DialogBox(wcl.hInstance,"MyAbout", hwnd,
                           (DLGPROC) AboutDialogProc );
                 break;
          }
          break;
     default:
          return DefWindowProc(hwnd,message,wParam,lParam);
  }
  return 0;
}
Вопрос № 64 ( Max116 )

Пишу в VC++ 6.0 использую MFC.
Я хочу реализовать поддержку нескольких языков в своих приложениях.
Cейчас это делается во многих профессиональных продуктах.
В некоторых язык интерфейса можно изменять "динамически" - не перезагружая приложение.
Не подскажете ли как это лучше (правильнее) сделать ?
Или хотя бы, если можно, подкиньте ссылочек, если кому известны такие примеры.

Ответ ( 3V )

Короче, широко распространенных путей - два:

1. Использование файлов, одержащих списки пар ID-строка.
Так, например, сделано в Total Commander - е. Смысл в том, что при старте приложения создается хеш-массив, в который загружается "язык по-умолчанию". Хеш как раз и будет содержать пары ID-строка. Потом (в соответствии с настройками в хеш "мапится" другой языковой файл.
При создании элементов интерфейса текст для них (для кнопок, пунктов меню, и.т.д.) выбирается из хеша.
Для хранения данных локализации можно как plain-text использовать, так и XML, например.

Преимущества:
1. Локализация производится просто и кем угодно (языковые файлы в отпрытом виде лежат).
2. Достаточно малый объем данных локализации.

Недостатки:
1. Невозможность подогнать элементы управления интерфейса под конкретный язык (например, интерфейс разработан для английского, а когда переведем на русский, некоторые надписи не уместятся на кнопках).
2. Отсутствие возможности локализовать графические (и другие) данные. Короче, если есть картинки с надписями, то надписи так и останутся на одном и том же языке.


2. Использование ресурсных DLL.
Как говорится - рекомендации лучших собаководов (мелкософта).
Суть метода - выносишь все ресурсы в отдельные DLL (для каждого языка - своя). При инициализации приложения загружаешь ее и все ресурсы грузишь из нее (например в MFC есть функция AfxSetResourceHandle - устанавлявает дескриптор модуля, из которого MFC будет грузить ресурсы по умолчанию.

Преимущества:
1. Можно создать для каждого языка полностью свой интерфейс (выбрать нужные размеры диалогов, кнопок, и.т.д.)
2. Можно локализовать графические данные (все курсоры, иконки, битмапы, и.т.д.).

Недостатки:
1. Объем данных локализации (самих DLL) больше чем в методе 1 (хотя, кого сейчас волнуют лишние 10-20кб).
2. Для того, чтобы сделать очередную DLL для некоторого языка надо взять среду разработки, перенести туда необходимые данные и скомпилировать DLL (простой пользователь этого делать не будет).

Думаю, информация для размышления есть :) Пробуй !
Книги по C/C++
Язык программирования С++. Специальное издание
Язык программирования С++. Специальное издание

Автор: Бьерн Страуструп

Книга написана Бьерном Страуструпом - автором языка программирования C++ - и является каноническим изложением возможностей этого языка.

Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный объектно-ориентированный подход к созданию программных продуктов.

Третье издание бестселлера было существенно переработано автором.
Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++.

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

Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка "из первых рук".

Страница книги на Озоне
Visual C++ .NET. Библия пользователя
Visual C++ .NET. Библия пользователя

Автор: Том Арчер, Эндрю Уайтчепел

Эта книга посвящена библиотеке MFC, a не только платформе .NET.

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

Книга предназначена для программистов средней и высокой квалификации.

Страница книги на Озоне
Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное