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

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

  Все выпуски  

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


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

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

Выпуск № 4
Cайт : SoftMaker.com.ru
Архив рассылки : SoftMaker.com.ru
Количество подписчиков : 148
В этом выпуске
От ведущего

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

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

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

Подписчикам

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

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

Вопросы

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

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

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

вчера подписался, а сегодня уже можно задать вопрос. Это хорошо.
Подскажите, как можно иннициализировать PIDL, чтобы при
открытии диалогового окна (для работы с папками на основе
структуры BROWSINFO) оно открывалось не с рабочего стола, а
с нужной мне папки.

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

Вопрос № 12 ( Denis Kravtsoff )

Glad to greet, q!

Довольно идиотский вопрос, но он меня взволновал 8).
Пишем мы некий хидер:

 --- xyz.h ---
  
 #ifndef _XYZ_H_
 #define _XYZ_H_

 class CXYZ
 {
 ...
 }xyz_instance;
  
 #endif
 //---xyz.h

 Потом делаем ещё несколько хидеров:

 --- x.h ---

 #include "xyz.h"
 ...
  
 //--- x.h ---
  
 --- y.h ---

 #include "x.h"
 #include "xyz.h"
 ...
  
 //--- y.h ---

Всё компилируется, но при линковке вылезает что-то вроде:
"Предупреждение линковщика: xyz_instance уже определен в x.obj".
Даже в стандарте немного полазал, да видимо терпения не хватило.
xyz_instance, как я понимаю, статический для всех кто его увидит.
Разве препроцессор не должен был пропустить содержимое xyz.h при его
вложении в y.h после x.h? Заранее благодарен за ответ.

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

Вопрос № 13 ( Жариков Игорь )

Приветствую

Microsoft Visual C++ 5.0. Имеется класс с закрытыми данными типа
int, открытая функция возвращающая закрытую переменную типа
int. Функция также возвращает тип int, но при присвоении
возвращаемого функцией значения переменной типа Int в процессе
компиляции компилятор выдает ошибку: говорит что не может
произвести изменение типа данных с int(void) на int. В чем дело?

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

Ответы

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

Вопрос № 8 ( ures )

Только начинаю учиться писать на Visual C++ 6.0.
Поэтому мой вопрос может быть вам покажется простым но для меня это проблема.
Как можно сделать вот такую вещь:
Я создал в проекте две иконки IDI_ICON_1 и IDI_ICON_2.
Создал также диалог, а в диалоге кнопку.
Надо сделать так, чтобы в диалоге показывалась иконка (например IDI_ICON_1)
и при нажатии на кнопку эта иконка заменялась на IDI_ICON_2.
Заранее всем спасибо.

Ответ ( Сергей Шацкий )

Напиши в обработчике кнопки:

 HICON Icon;
 Icon = AfxGetApp()->LoadIcon(IDI_ICON1);
 SetIcon(Icon,FALSE);

Иконка сменится. Это конечно же для MFC

Ответ ( 3V )

Можно попробовать для этой цели использовать элемент управления STATIC. Поместить его в диалог, визардом для него создать переменную. Только надо в редакторе ресурсов выставить тип этого статика такой, чтобы он именно иконку отображал. А потом... там функция есть:

 CStatic::SetIcon

 и есть еще:

 CStatic::SetCursor
 CStatic::SetBitmap
 CStatic::SetEnhMetaFile

так что не только иконки в этом элементе можно отображать :)
Вопрос № 9 ( Boris Ivanov )

Доброго времени суток.
Я пробовал работать с WinAPI функциями FindFirstFile,
FindNextFile, но, наверно, не до конца разобрался.
Я был бы благодарен, если бы мне подсказали как, напрмер,
сделать такое же дерево как в проводнике. Очень надо :-)

Ответ ( bvb )

Hello q,

Собственно чтобы прсмотреть содержимое каталога необходимо вначале
стать в этот каталог для это выполни команду

SetCurrentDirectory("c:\\sss\\nnn\\");

далее объявляешь

WIN32_FIND_DATA fnd;
HANDLE hFindFile = FindFirstFile("*.*", &fnd);
BOOL bWk=FindNextFile(hFindFile,&fnd);

fnd это структура которая дает информацию о имени файла его
категории рамеру и т.д.
fnd.cFileName имя файла
fnd.dwFileAttributes можно определится файл или директорий
Далее в цикле вычитываем все из директория пока bWk==TRUE
Далее к пути "c:\\sss\\nnn\\"+fnd.cFileName атрибут которого
указывает что это директория, переходим в этот директорий и начинаем
все сначала (рекомендую рекурсивный вызов прцедуры алгоритм при этом
получатся очень компактным)
Как отобразить полученные результаты это уже другой вопрос
Вопрос № 10 ( Александр Новиков )

Здравствуйте.
Ваша рассылка очень кстати :) Задам ка и я вопрос !
Столкнулся с такой проблемой в Visual C. Как известно,
для "автоматической" установки состояний пунктов меню
в MDI и SDI приложениях можно создать обработчики типа
OnUpdate... при помощи макросов карты сообщений
ON_UPDATE_COMMAND_UI. Но я решил сделать то же самое в
диалоге. То есть подключил туда меню и добавил обработчк:

void CStatDlg::OnUpdateMenu1(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(FALSE);
}

но это не работает! Меню так и остается активным. Хотя в приложении SDI это сработало. Не подскажете ли мне как побороть эту проблему ?

Ответ ( 3V )

Уууу... это ты прямо в точку...
Нет в MFC такой возможности для диалогов. Но можно добавить :)

Посмотри под отладчиком цепочку вызовов функций до твоего обработчика.
Увидишь там такую штуку как CFrameWnd::OnInitMenuPopup. Это обработчик
сообщения WM_INITMENUPOPUP. Код этой функции не маленький (но и не
большой) - разобраться достаточно легко. Смысл в том, что в момент
отображения popup-меню вызывается этот обработчик. Он пробегает по всем
пунктам меню, и для каждого ищет соответствующий обработчик OnUpdate*
(если есть). Если обработчик найден, то он вызывается.

Короче, просто создай такой же обработчик у себя в диалоге и скопируй
туда код из CFrameWnd::OnInitMenuPopup. Потом поправь там, где будет
ругаться компилятор. И все заработает :-)

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

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

В избранное