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

C/C++ - вопросы и ответы.


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


C/C++ - вопросы и ответы

Выпуск № 4
Cайт : SoftMaker.fatal.ru
Архив рассылки : SoftMaker.fatal.ru
Количество подписчиков : 21

В этом выпуске

От ведущего
MFC - простое и сложное
Подписчикам
Вопросы
Ответы

От ведущего


  Здравствуйте, уважаемые подписчики.
Рад сообщить вам, что вот-вот увидит свет полная версия сайта рассылки. Там вы сможете найти исходные тексты интересных программ, готовые компоненты, а также статьи и полный архив рассылки. Будут также выставлены открытые проекты, в которых каждый сможет принять участие.
Все это будет очень скоро.

  Как всегда, Вы можете отправить свои пожелания, кликнув по этой ссылке.

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

MFC - простое и сложное [Стандартные ресурсы библиотеки MFC]


Итак, сегодня мы поговорим о такой простой вещи как ресурсы.

Точнее - стандартные ресурсы.

Скорее всего вы знаете о таких Win API функциях как :

  LoadCursor и
  LoadIcon

и функциях-членах класса CWinApp :

  LoadCursor,
  LoadStandardCursor,
  LoadIcon,
  LoadStandardIcon,
  LoadOEMIcon

рассмотрим их реализацию :

 _AFXWIN_INLINE HCURSOR CWinApp::LoadCursor(LPCTSTR lpszResourceName) const
 { return ::LoadCursor(AfxFindResourceHandle(lpszResourceName,
  RT_GROUP_CURSOR), lpszResourceName); }

 _AFXWIN_INLINE HCURSOR CWinApp::LoadCursor(UINT nIDResource) const
 { return ::LoadCursor(AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource),
  RT_GROUP_CURSOR), MAKEINTRESOURCE(nIDResource)); }

 _AFXWIN_INLINE HCURSOR CWinApp::LoadStandardCursor(LPCTSTR lpszCursorName) const
 { return ::LoadCursor(NULL, lpszCursorName); }

 _AFXWIN_INLINE HCURSOR CWinApp::LoadOEMCursor(UINT nIDCursor) const
 { return ::LoadCursor(NULL, MAKEINTRESOURCE(nIDCursor)); }

 _AFXWIN_INLINE HICON CWinApp::LoadIcon(LPCTSTR lpszResourceName) const
 { return ::LoadIcon(AfxFindResourceHandle(lpszResourceName,
  RT_GROUP_ICON), lpszResourceName); }

 _AFXWIN_INLINE HICON CWinApp::LoadIcon(UINT nIDResource) const
 { return ::LoadIcon(AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource),
  RT_GROUP_ICON), MAKEINTRESOURCE(nIDResource)); }

 _AFXWIN_INLINE HICON CWinApp::LoadStandardIcon(LPCTSTR lpszIconName) const
  { return ::LoadIcon(NULL, lpszIconName); }

 _AFXWIN_INLINE HICON CWinApp::LoadOEMIcon(UINT nIDIcon) const
  { return ::LoadIcon(NULL, MAKEINTRESOURCE(nIDIcon)); }

 Как видно из кода, реализация функции CWinApp::LoadCursor отличается от реализаций функций CWinApp::LoadStandardCursor и CWinApp::LoadOEMCursor только значениями передаваемого в качестве первого параметра манипулятора модуля, содержащего требуемый ресурс с заданным идентификатором.
Действительно, реализация функции CWinApp::LoadCursor(LPCTSTR lpszResourceName) ( CWinApp::LoadCursor(UINT nIDResource) ) содержит один единственный вызов API функции :

::LoadCursor(AfxFindResourceHandle(lpszResourceName, RT_GROUP_CURSOR), lpszResourceName);

и его результат возвращается в качестве возвращаемого значения функции.

Реализации CWinApp::LoadStandardCursor и CWinApp::LoadOEMCursor вызывают ::LoadCursor с первым параметром, равным NULL. В этом смысле они совсем ничем не отличаются. То есть вызов LoadStandardCursor(MAKEINTRESOURCE(IDC_MY_CURSOR)) аналогичен вызову CWinApp::LoadOEMCursor(IDC_MY_CURSOR).

Иными словами, CWinApp::LoadCursor ищет при помощи AfxFindResourceHandle манипулятор модуля, содержащего требуемый ресурс, а затем загружает этот ресурс, в то время как CWinApp::LoadStandardCursor и CWinApp::LoadOEMCursor загружают стандартные курсоры Windows. Идентификаторы стандартных курсоров Windows вам хорошо известны. Они описаны в заголовочном файле WINUSER.H
Это такие идентификаторы как : IDC_ARROW, IDC_IBEAM, IDC_WAIT, и.т.д.

Абсолютно то же самое можно сказать и про функции CWinApp::LoadIcon, CWinApp::LoadStandardIcon, CWinApp::LoadOEMIcon :
CWinApp::LoadIcon загружает иконки, содержащиеся в основном исполняемом модуле, либо в других, подгруженных модулях.

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

Да, конечно. Ведь сама библиотека, наверно, тоже использует какие то ресурсы. И, быть может, они окажутся полезны и нам ?

Приведу один пример. Вспомните - при использовании в проекте архитектуры документ-облик в режиме предварительного просмотра документа перед печатью вы можете менять масштаб просмотра кликая в область просмотра. Как выглядит курсор при этом ? Как увеличительное стекло. И этот курсор - не стандартный ресурс Windows. Он слинкован с самой библиотекой.

Хорошо, а откуда узнать идентификаторы таких ресурсов ? Ведь о многих из них нет даже упоминания в MSDN ? Ответ прост - из заголовочного файла AFXRES.H. Там содержатся объявления идентификаторов ресурсов библиотеки MFC.

Приведу здесь пока только некоторые идентификаторы курсоров.

Вот так они определены в AFXRES.H :

 // Standard cursors (0x7901->)
  // AFX_IDC = Cursor resources
 #define AFX_IDC_CONTEXTHELP   30977   // context sensitive help 
 #define AFX_IDC_MAGNIFY   30978   // print preview zoom 
 #define AFX_IDC_SMALLARROWS   30979   // splitter 
 #define AFX_IDC_HSPLITBAR   30980   // splitter 
 #define AFX_IDC_VSPLITBAR   30981   // splitter 
 #define AFX_IDC_NODROPCRSR   30982   // No Drop Cursor 
 #define AFX_IDC_TRACKNWSE   30983   // tracker 
 #define AFX_IDC_TRACKNESW   30984   // tracker 
 #define AFX_IDC_TRACKNS   30985   // tracker 
 #define AFX_IDC_TRACKWE   30986   // tracker 
 #define AFX_IDC_TRACK4WAY   30987   // tracker 
 #define AFX_IDC_MOVE4WAY   30988   // resize bar (server only) 

А вот что представляют из себя эти курсоры.

AFX_IDC_CONTEXTHELP - стандартный указатель-стрелка, совмещенный со знаком вопроса. Честно говоря, вид этого курсора меня не очень вдохновил. Выглядит он грубо.

AFX_IDC_MAGNIFY - курсор в форме увеличительного стекла. Используется в режиме preview.

AFX_IDC_SMALLARROWS - курсор в виде четырех стрелок, направленных в разные стороны. Используется в сплиттере MFC. Фактически представляет собой уменьшенный вариант стандартного курсора Windows с идентификатором IDC_SIZEALL.

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

AFX_IDC_VSPLITBAR - то же самое, что и AFX_IDC_HSPLITBAR, но повернут на 90 градусов.

AFX_IDC_NODROPCRSR - перечеркнутая окружность (аналог стандартного IDC_NO).

AFX_IDC_TRACKNWSE - аналог стандартного курсора IDC_SIZENWSE, но меньше и приятнее выглядит.

AFX_IDC_TRACKNESW - аналог стандартного курсора IDC_SIZENESW, но также меньше.

AFX_IDC_TRACKNS - аналог стандартного курсора IDC_SIZENS, также меньше.

AFX_IDC_TRACKWE - аналог стандартного курсора IDC_SIZEWE, также меньше.

AFX_IDC_TRACK4WAY - выглядит также как и AFX_IDC_SMALLARROWS. По крайней мере, я не заметил различий.

#define AFX_IDC_MOVE4WAY - выглядит как стандартный указатель-стрелка, совмещенный с AFX_IDC_TRACK4WAY. Хорошо подойдет для обозначения перетаскивания объектов.

Загрузить эти курсоры, конечно же можно при помощи CWinApp::LoadCursor.

В следующей рассылке я, возможно, рассмотрю стандартные ресурсы библиотеки MFC более шире.

  А пока, все.

Автор статьи : Вахтуров Виктор.  


Подписчикам

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

Вопросы

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

  К сожалению, вопросов сегодня нет.

Ответы

Ответ № 1
На вопрос Nimnul

Не подскажет ли уважаемый All, как бы мне из моей проги выдвинуть и задвинуть лоток CDROM ?

Отвечает 3V :

Попробуйте воспользоваться следующим кодом :

для открытия CDROM :
mciSendString("Set CdDoor Open Wait", NULL, 0, NULL);
для закрытия :
mciSendString("Set CdDoor Closed Wait", NULL, 0, NULL);

Всего доброго. До встречи в следующей рассылке.

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


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное