Главная
Новости
Программы
Проекты
Статьи
Ссылки
Контакты
Гостевая
Выпуск №4. Некоторые функции WTL

Здравствуйте, уважаемые читатели.

Давненько я не делал нового выпуска рассылки, но похоже никто этого не заметил :)

Ну ладно, вот я подумал про что же такое написать и решил сделать небольшой выпуск по некоторым функциям WTL. Итак, приступим.

Некоторые функции WTL

В заголовочных файлах ATL и WTL определенны некоторые глобальные макросы и функции. Функции и макросы ATL, насколько я могу судить, документированы в MSDN, а их собратьев из WTL нужно отлавливать по одному и разбираться с каждым индивидуально. Вот какой получился список у меня:

Файл atlapp.h

inline bool AtlIsOldWindows()

Функция проверяет текущую версию Windows и возвращает TRUE, если версия "старее", чем Windows 2000.

inline HFONT AtlGetDefaultGuiFont()

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

inline BOOL AtlInitCommonControls(DWORD dwFlags)

Функция выполняет начальную инициализацию стандартных элементов управления. Функция вызывает системную функцию InitCommonControlsEx и передает ей свой аргумент. Какие флаги задавать, можно почитать в MSDN. Как гласит MSDN, вызов InitCommonControlsEx "накопительный". Это значит, что вызвав эту функцию с одним флагом, потом другие нужные флаги можно задавать отдельно в последующих вызовах, а не задавать все нужные флаги в одном вызове, хотя и так тоже можно поступать.

inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)

Функция принимает два параметра: хэндл на загруженную DLL и указатель на структуру DLLVERSIONINFO. Функция возвращает следующие значения:
- если параметр pDllVersionInfo действительный и в загруженной DLL реализована функция DllGetVersion (как говорится в MSDN, что эту функцию реализуют большинство системных DLL), то возвращается значение, возвращенное функцией DllGetVersion и заполняется структура, указатель на которую был передан.
- если указатель на структуру равен NULL, возвращается константа E_INVALIDARG
- если функция не реализована внутри Dll, то возвращается константа E_NOTIMPL

inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)

Функция, аналогичная предыдущей, но принимает не хэндл, а имя DLL, которую сама загружает и выгружает.

inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)

Функция возвращает версию commctl32.dll в два параметра, указатели на которые передаются в функцию. Если один из параметров равен NULL, то функция возвращает константу E_INVALIDARG. Функция грузит commctl32.dll,а потом роется в ней с помощью своей же функции AtlGetDllVersion. Если в загруженной DLL реализована функция DllGetVersion, то возвращаются "правильные" значения, а если DllGetVersion не реализована, то возвращаются значения Major=4 и Minor=0. В комментарии перед функцией написано:
// Win95/WinNT 4.0 maj=4 min=00
// IE 3.x maj=4 min=70
// IE 4.0 maj=4 min=71
Смысл, думаю, понятен.

inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
Функция возвращает версию shell32.dll в два параметра, указатели на которые передаются в функцию. Если один из параметров равен NULL, то функция возвращает константу E_INVALIDARG. Поведение функции полностью аналогично предыдущей. В комментарии перед функцией написано:
// IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00
// IE 4.0 with Web Integrated Desktop maj=4 min=71
// IE 4.01 with Web Integrated Desktop maj=4 min=72

inline bool AtlIsAlphaBitmapResource(_U_STRINGorID image)

Странная функция. Не совсем понятно, что она делает и зачем нужна, похоже она делает что-то связанное с ресурсами в Windows XP.

Файл atlmisc.h

inline HACCEL AtlLoadAccelerators(_U_STRINGorID table)
inline HMENU AtlLoadMenu(_U_STRINGorID menu)
inline HBITMAP AtlLoadBitmap(_U_STRINGorID bitmap)
inline HCURSOR AtlLoadCursor(_U_STRINGorID cursor)
inline HICON AtlLoadIcon(_U_STRINGorID icon)

Каждая из функций загружает ресурс из текущего приложения, идентификатор которого указан как параметр.

inline HBITMAP AtlLoadBitmapImage(_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR)
inline HCURSOR AtlLoadCursorImage(_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
inline HICON AtlLoadIconImage(_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)

Эти функции похожи на предыдущие, за исключением того, что загружают ресурсы из запущенного приложения с помощью функции LoadImage. Загрузка функцией LoadImage более предпочтительна, так как функции, которыми грузятся ресурсы в предыдущих функциях, вроде LoadBitmap, LoadIcon и т.д. являются устаревшими по сведениям в MSDN.

inline HBITMAP AtlLoadSysBitmap(LPCTSTR lpBitmapName)
inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName)
inline HICON AtlLoadSysIcon(LPCTSTR lpIconName)

Загружает системные (OEM) ресурсы, например указатели мыши в виде руки или иконки в виде восклицательного знака. Проверка правильности передаваемых значений (т.е. идентификаторов, которые действительно определены) производится только в DEBUG версии.

inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR)
inline HCURSOR AtlLoadSysCursorImage(_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
inline HICON AtlLoadSysIconImage(_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)

Функции, аналогичные предыдущим, но ресурсы загружаются через через функцию LoadImage.

inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax)
inline bool AtlLoadString(UINT uID, BSTR& bstrText)

Обе функции грузят строку из ресурсов приложения, но первая версия строки доступна только в том случае, если версия ATL меньше, чем 7.

inline HPEN AtlGetStockPen(int nPen)
inline HBRUSH AtlGetStockBrush(int nBrush)
inline HFONT AtlGetStockFont(int nFont)
inline HPALETTE AtlGetStockPalette(int nPalette)

Возвращает хэндл на некоторые предустановленные объекты GDI с помощью функции API GetStockObject.

inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen)

Укорачивает строку, содержащую путь к файлу до количества символов длиной cchLen, при этом имя файла сохраняется.

Немного слов о классе _U_STRINGorID. Этот микроскопический класс определен в atlapp.h и весьма полезен. Делает он вот что: вне зависимости от того как передан параметр ресурса, он его хранит во внутренней переменной m_lpstr. Таким образом в месте, где передаются параметры ресурсов через этот класс, уже нет необходимости помнить, надо ли использовать MAKEINTRESOURCE или нет.

Файл atltheme.h

inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0)

Трудно сказать точно что делает эта функция, но судя по названию занимается отрисовкой специфичных для конкретной темы частей элементов управления в Windows XP.

Файл atluser.h

inline int AtlMessageBox(HWND hWndOwner, _U_STRINGorID message, _U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION)

Функция для более удобного вывода popup-сообщений, если так можно выразиться. В недрах функции вызывается MessageBox.

Ну вот и все на сегодня. Если вы заметили какую-либо неточность или Вам есть что добавить, то я всегда буду рад любым отзывам, которые вы можете кидать мне softonic@narod.ru

В следующем выпуске я планирую рассказать о том, как работает механизм передачи сообщений по майлслотам и как им пользоваться, как это делают Winpopup и net send.

Всего наилучшего.

Используются технологии uCoz