Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

A1. В вопросе приводился пример функции, с помощью которого предполагалось вызвать диалог. В MSDN я нашёл статью TN058, рассказывающую о том, как реализовано управление модулями в MFC.

Для того, чтобы получить доступ к любому объекту MFC из экспортируемой функции, необходимо в самом начале функции поставить AFX_MANAGE_STATE(AfxGetStaticModuleState) ;

Таким образом, будут корректно реализована связь дескрипторов (HANDLE) с объектами MFC и , в частности, ресурсы, хранимые в DLL будут корректно задействованы:

declspec(dllexport)

int MyDllFunction {

 AFX_MANAGE_STATE(AfxGetStaticModuleState);

 CDialog dlg(IDD_TESTDLG);

 return dlg.DoModal;

}

Алексей
Селезнев

A2. Вообще говоря, доступ к ресурсам DLL из самой DLL получать не надо – он и так дан. Но пример, указанный в вопросе, по-моему, чуть-чуть не правильный, и работать никогда не будет, потому как "CDialog dlg" не проинициализирован как следует. Пусть в DLL-проекте создан ресурс-диалог, с идентификатором (например) IDD_RTNDIALOG. Для того, показать этот ресурс-диалог (в модальном режиме), надо выполнить:

CDialog dlg(IDD_RTNDIALOG);

dlg.DoModal;

Здесь конструктору объекта dlg передаём ID ресурса – нашего диалога. Можно еще указать родительское окно. Чтобы показывать этот диалог немодально, следует использовать Create/[ShowWindow/WS_VISIBLE].

Однако, если мы хотим, чтобы диалог содержал всякие контролы, помимо OK и Cancel, то нужно на основе ресурса-диалога создать класс-наследник CDialog'a. (в MFC – например с даблкликнув на форму шаблона). Пусть мы создали класс с именем CRtnDlg. Он и будет реализовывать всякие обработчики контролов.

Показать модально проще простого:

CRtnDlg dlg;

dlg.DoModal;

Немодально – use ShowWindow(…);

Кстати, в описании CRtnDlg.h нужно не забыть вставить #include "resource.h" – а то компилятор тоже ресурса не увидит :)))

Кстати, на счет примера – Игоря я обидеть не хотел, может он его так, для пояснения сути написал.

3. Вопрос:

Недавно я писал курсовую – рисует всякие дифуры. А каждое конкретное диф.ур-ие реализуется в отдельной DLL'ке (по типу plugins). А т.к. мои DLL с дифурами имели единый интерфейс(не COM), для них я сделал шаблон. А потом случилось страшное – DLL-проекты, созданные по шаблону, не компилировались, с дурацкими ошибками. Короче, через сутки я выяснил, что почему-то в проекте, созданном по шаблону, директива компилятора _AFXEXT заменяется на _USRDLL (в результате мой DLL плавно превращается из MFC extension в Regular DLL). Шаблон создавал по существующему проекту. Ни в исходном проекте, ни в шаблоне ничего в опциях не путал. Приходилось потом вручную каждый раз изменять директивы. А в чем же дело? Может знает кто?

4. Алекс, и ещё – на счет ответов на вопрос в №8. Я там между прочим указывал, что объект CFont нужно сделать членом класса окна, т.к. передаётся указатель.

Pavel Vasev

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

Благодарю также авторов всех остальных ответов на этот вопрос. Их прислали: Ivan Nevraev, Alexander N. Dovzhikov, Alex Hin.

В ПОИСКАХ ИСТИНЫ

Q. Не подскажете как в tray выводить текст, как например сделаны часы в Windows?

Dmitriy

Как выводить в tray иконку, надеюсь, все знают ;) 

Shell_NotifyIcon есть, а вот Shell_NotifyText, к сожалению, не существует… ;)

У меня просьба (в связи с небольшими неполадками) – прошу тех, кто не получил от меня ответа в течение недели или больше, послать письмо еще раз.

Желаю всем программировать

с удовольствием!

Красноярск, 2000.

Программирование на Visual C++

Выпуск №11 от 22/07/2000

Добрый день всем!

В ответ на публикацию вопроса Дмитрия о System Tray в предыдущем выпуске помимо прямых ответов пришло еще несколько просьб рассказать о том, как в системный tray вообще помещать иконки. Я, видимо, был излишне оптимистичен, когда посчитал, что это все знают ;) Так что я решил поведать уважаемым читателям об этом в данном выпуске, в рубрике "WINAPI", в расчете на то, что эта информация будет полезна многим. Получается, сегодняшний выпуск целиком посвящен system tray ;)

WINAPI

Итак, задача у нас следующая: поместить в системный tray свою иконку, причем заставить ее функционировать стандартным образом – чтобы при наведении на нее появлялась подсказка, при нажатии на правую кнопку мыши выскакивало меню, на левую – производилось какое-нибудь действие.

Начнем с начала – нужно поместить иконку в tray. Сами вы это вряд ли сделаете – да это и не нужно. За вас это сделает Windows, вам нужно только сообщить операционной системе о своем намерении. Для этого служит функция Shell_NotifyIcon, которая позволяет создавать, изменять и удалять такие иконки.

Первый аргумент этой функции — это код операции, которую вам нужно осуществить. Он имеет три возможных значения — NIM_ADD, NIM_DELETE и NIM_MODIFY. В пояснениях, по-моему, не нуждается. Второй параметр – указатель на структуру NOTIFYICONDATA. Вот как эта структура выглядит:

typedef struct _NOTIFYICONDATA {

 DWORD cbSize; // размер, обязательно указывать

 HWND hWnd; // HWND для посылки уведомлений

 UINT uID; // идентификатор иконки в tray, не имеет отношения к ресурсам

 UINT uFlags; // см. ниже

 UINT uCallbackMessage; // посылается вашей функции окна

 HICON hIcon; // дескриптор иконки

 CHAR szTip[64]; // строка с подсказкой

} NOTIFYICONDATA;

// uFlags

#define NIF_MESSAGE 0x1 // uCallbackMessage содержит информацию

#define NIF_ICON 0x2 // hIcon содержит информацию

#define NIF_TIP 0x4 // szTip содержит информацию

В принципе, назначение каждого члена этой структуры довольно прозрачно. Замечу только, что uID – это не идентификатор ресурса иконки, как можно было бы подумать, а вами определенный идентификатор для tray icon вашего приложения. Иконка, которую выводит в tray приложение, может меняться в процессе работы, но этот идентификатор остается постоянным.

Также вам нужно в uCallbackMessage записать сообщение, которое вы хотите чтобы система вам посылала в качестве уведомления о событиях, происходящих с вашей иконкой. Для этого в программе определите какое-нибудь user-defined сообщение, например так: #define WM_TRAYNOTIFY (WM_APP+100).

WM_APP используется как раз для того, чтобы именно в таком виде и определять нужные вам сообщения.

Теперь, предположим у вас подготовлена иконка для tray: IDI_MYTRAYICON. Нам нужно ее вывести в tray. Вот что мы делаем:

// уведомляющее сообщение

#define WM_TRAYNOTIFY (WM_APP+100)

// идентификатор иконки

#define ID_TRAYICON 1000

CString sNotifyTip = "Название вашей программы или другая подсказка";

Поделиться:
Популярные книги

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия