Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 16:19   #1
voyager2011
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
Вопрос Очередные сюрпризы Visual C++

Осваиваю программирование Win32 API и постоянно сталкиваюсь с разными проблемами и непонятными вещами. Работаю в MS VS 2005.
Писал программку использующую Common Controls. То что сначала были конфликты типов данных связанные с уникодом и не линковался comctl32 это еще полбеды.
Когда написал программку использующую статусную строку Statusbar к удивлению обнаружил, что она работает и без инициализации InitCommonControls(); хотя в литературе постоянно напоминается о необходимости инициализации. Но это продолжалось до тех пор, пока я не разместил статическое окно в виде серого прямоугольника. Вот тут компилятор начал ругаться на параметр SS_GRAYRECT, но до тех пор пока я не подключил инициализацию Common Controls. Так что же получается, в одних случаях можно инициализацию не делать, а в других нужно? Как-то непоследовательно.
Еще возникли сложности с размещением на панели меню кнопки в виде картинки.
Код из книги:
HBITMAP hBitmap;
int nDimension;
........
case WM_CREATE:
nDimension=GetSystemMetrics(SM_CYME NU);
hBitmap=LoadImage(hInst, pImage, IMAGE_BITMAP, nDimension*2,nDimension, LR_LOADFROMFILE);
AppendMenu(GetMenu(hWnd),MF_BITMAP, ID_PICT,hBitmap);
hwndStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, L"Menu Sample", hWnd, ID_STATUSBAR);



Но реально пришлось сделать:
HBITMAP hBitmap;
int nDimension;
.........
case WM_CREATE:
nDimension=GetSystemMetrics(SM_CYME NU);
hBitmap=(HBITMAP)LoadImage(hInst, pImage, IMAGE_BITMAP, nDimension*2,nDimension, LR_LOADFROMFILE);
AppendMenu(GetMenu(hWnd),MF_BITMAP, ID_PICT,(LPCWSTR)hBitmap);
hwndStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, L"Menu Sample", hWnd, ID_STATUSBAR);

Сначала компилятор ругался что в строке hBitmap=LoadImage(hInst, pImage, IMAGE_BITMAP, не может преобразовать HANDLE в HBITMAP. Что тут за прикол? Все точно как в книге, но выдает ошибку.
Потом в строке AppendMenu(GetMenu(hWnd),MF_BITMAP, ID_PICT,hBitmap); компилятор ругался на 4-й параметр, пришлось добавить приведение типа к LPCWSTR.
После всех этих "нововведений" программка таки заработала как нужно.
А как же это раньше работало???? Или это особенности раннего стиля? Надо сказать что примеры в книгах зачастую написаны для 6-й студии, ну в лучшем случае для 2003-й, а то и вообще для Билдера. Они настолько все отличаются?
voyager2011 вне форума Ответить с цитированием
Старый 01.11.2011, 17:12   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Да это нормально
Не забываем, что WinApi был написал на Си, а Си не позволяет перегрузку функций. И чтобы сделать универсальные функции, а не плодить 100500 разных функций, то и приходится приводить один тип к другому типу. А ругаться компилятору положено, вдруг мы ошиблись ? Но мы всегда можем указать компилятору, что операция верная
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual C++, Visual C#, Visual basic .Net, или Microsoft.Net Что лучше? _PROGRAMM_ Общие вопросы .NET 14 10.10.2012 19:24
Среда разработки Visual C (альтернатива Visual Studio) plyeh Visual C++ 5 25.06.2010 16:27
Проблема с windows visual styles в Visual studio 2008 express. [awa Visual C++ 2 09.01.2010 06:05
Как перевести проект из Visual C++ 2003 в Visual C++ 2008? iukash Visual C++ 8 17.04.2009 22:36
Visual c++ 2005 и Visual c++ 6 это разные версии или нет? Руслантус Свободное общение 3 30.11.2007 19:42