Форум программистов, компьютерный форум CyberForum.ru

Загрузка изображения в окно - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
10.04.2012, 07:26     Загрузка изображения в окно #1
В программе нужно вывести изображение с раширением .bmp в окно,указываю путь к файлу в функции LoadImage,но он его то ли не так воспринимает,то ли вообще не видит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
LRESULT CALLBACK DCDemoWndProc(HWND hWnd,UINT Message,
                            UINT wParam,UINT lParam)
{
    HDC hDC,hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    HANDLE hBitmap,hOldBitmap;
    RECT Rect;
    BITMAP Bitmap;
 
    switch(Message)
    {
        case WM_PAINT:
            hDC = BeginPaint(hWnd,&PaintStruct);
            hBitmap = LoadImage(NULL,L"C:\\Russian.BMP",//только здесь ошибка,остальное всё правильно
                                IMAGE_BITMAP,0,0,
                                LR_LOADFROMFILE);
            GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
            hCompatibleDC = CreateCompatibleDC(hDC);
            hOldBitmap = SelectObject(hCompatibleDC,hBitmap);
            GetClientRect(hWnd,&Rect);
            StretchBlt(hDC,0,0,Rect.right,Rect.bottom,
                        hCompatibleDC,0,0,Bitmap.bmWidth,
                        Bitmap.bmHeight,SRCCOPY);
            SelectObject(hCompatibleDC,hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hCompatibleDC);
            EndPaint(hWnd,&PaintStruct);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 14:41     Загрузка изображения в окно #2
Цитата Сообщение от alexey31415 Посмотреть сообщение
В программе нужно вывести изображение с раширением .bmp в окно,указываю путь к файлу в функции LoadImage,но он его то ли не так воспринимает,то ли вообще не видит
C++
1
2
3
4
5
            hBitmap = LoadImage(NULL,L"C:\\Russian.BMP",//только здесь ошибка,остальное всё правильно
                                IMAGE_BITMAP,0,0,
                                LR_LOADFROMFILE);
            
}
в чём конкретно заключается ошибка? с первого взгляда код правильный (не считая того, что загружать каждый раз в WM_PAINT это кхм.. не правильно, с таким подходом можно, рано или поздно, нарваться на утечку памяти, не считая тормоза при отрисовке)

если проблема именно с загрузкой файла (формат не поддерживается) можно проверить, руководствуясь MSDN:

If the function succeeds, the return value is the handle of the newly loaded image.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(hBitmap == NULL)
{
    DWORD error = GetLastError();
    LPVOID msgBuf;
    
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                         FORMAT_MESSAGE_FROM_SYSTEM |
                         FORMAT_MESSAGE_IGNORE_INSERTS,
                        0,
                        error, 
                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                        (LPTSTR)&msgBuf,
                        0,
                        0);
 
    MessageBox(hWnd, (LPCTSTR)msgBuf, _T("Error"), MB_OK | MB_ICONERROR);
 
    LocalFree(msgBuf);
}
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
10.04.2012, 16:05  [ТС]     Загрузка изображения в окно #3
появляется следующая ошибка

1>1.obj : error LNK2019: ссылка на неразрешенный внешний символ "long __stdcall DCDemoWndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?DCDemoWndProc@@YGJPAUHWND__@@IIJ@Z) в функции _WinMain@16
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 19:40     Загрузка изображения в окно #4
Цитата Сообщение от alexey31415 Посмотреть сообщение
появляется следующая ошибка

1>1.obj : error LNK2019: ссылка на неразрешенный внешний символ "long __stdcall DCDemoWndProc(struct HWND__ *,unsigned int,)" (?DCDemoWndProc@@YGJPAUHWND__@@IIJ@Z) в функции _WinMain@16
сомтрите: LNK2019, читаем MSDN (теперь даже на русском!) - http://msdn.microsoft.com/ru-ru/library/799kze2z.aspx

смотрим какой символ не может найти линковщик: long __stdcall DCDemoWndProc(struct HWND__ *,unsigned int,unsigned int,long). вам не кажется, что это оконная процедура? а мне вот кажется. судя по коду, который вы привели - она у вас реализована, значит косяк, скорее всего, с параметрами. смотрим:
C++
1
LRESULT CALLBACK DCDemoWndProc(HWND hWnd,UINT Message, UINT wParam,UINT lParam)
на сколько помню это winapi вуду возвращаемый тип прально, первый параметр - хэндл окна - прально, сообщение вроде верно, а вот два парама вызывают сомнение (помнится WPARAM и LPARAM было в моё то время), тем более, что судя по ошибке линковщика unsigned int,long и если из UINT получить unsigned int не проблема то вот знаковый long из без знакового UINT - явно тот ещё геморрой.

итого было
C++
1
LRESULT CALLBACK DCDemoWndProc(HWND hWnd,UINT Message, UINT wParam, UINT lParam)
должно быть
C++
1
LRESULT CALLBACK DCDemoWndProc(HWND hWnd,UINT Message, WPARAM wParam, LPARAM lParam)
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.04.2012, 07:44  [ТС]     Загрузка изображения в окно #5
Цитата Сообщение от IPtv Посмотреть сообщение
смотрим какой символ не может найти линковщик: long __stdcall DCDemoWndProc(struct HWND__ *,unsigned int,unsigned int,long). вам не кажется, что это оконная процедура? а мне вот кажется. судя по коду, который вы привели - она у вас реализована, значит косяк, скорее всего, с параметрами.
я это понимаю,просто,так как только начал учить WinAPI,то не знаю на что исправить,а гугл толкового ничего не предложил

Добавлено через 8 минут
Цитата Сообщение от IPtv Посмотреть сообщение
(не считая того, что загружать каждый раз в WM_PAINT это кхм.. не правильно, с таким подходом можно, рано или поздно, нарваться на утечку памяти, не считая тормоза при отрисовке)
я просто написал пример из книги,там автор тоже самое говорил,что это лишь для наглядности пример

а теперь ещё более дивные чудеса,программа компилируется,запускается .exe файл,но окно не появляется,в том числе и всплывающее окно,которое должно появиться,если какие-то проблемы,в моём случае какой-то один из двух MessageBox
C++
1
2
3
4
5
6
7
8
9
10
11
if(!RegisterClass(&WndClass))
    {
        MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
        return 0;
    }
 
if(!hWnd)
    {
        MessageBox(NULL,L"Cannot create window",L"Error",MB_OK);
        return 0;
    }
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
11.04.2012, 17:49     Загрузка изображения в окно #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
я это понимаю,просто,так как только начал учить WinAPI,то не знаю на что исправить,а гугл толкового ничего не предложил
ну какбэ winapi не сильно популярная тема на сегодня (и msdn ваше всё). так что тут или книжка у вас слегка врёт (кстати а что за она?), либо вы не правильно переписали пример. в первом случае всё будет весело - искать чужие ошибки не зная предметной области, хыхы, ну зато знания будут лучше, если победите все ошибки в итоге.

Цитата Сообщение от alexey31415 Посмотреть сообщение
я просто написал пример из книги,там автор тоже самое говорил,что это лишь для наглядности пример
так не вопрос, форум для начинающих, все учатся. это проф занудство вылезло без обид.

Цитата Сообщение от alexey31415 Посмотреть сообщение
а теперь ещё более дивные чудеса,программа компилируется,запускается .exe файл,но окно не появляется,в том числе и всплывающее окно,которое должно появиться,если какие-то проблемы,в моём случае какой-то один из двух MessageBox
C++
1
2
3
4
5
6
7
8
9
10
11
if(!RegisterClass(&WndClass))
    {
        MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
        return 0;
    }
 
if(!hWnd)
    {
        MessageBox(NULL,L"Cannot create window",L"Error",MB_OK);
        return 0;
    }
попробуйте создать стандартный проект win32 и сравнить код созданный им со своим.
если окно не появляется и не срабатывают проверки на ошибки - скорее всего окно тупо свёрнуто.
попробуйте пошагово пройтись (F10) по коду, посмотреть что в переменных лежит, что возвращают функции (вкладки autos/locals/watch).
если совсем уж замучаетесь - скиньте проект, посмотрим что там (только ncb pdb и прочие obj файлы не забудьте удалить) не так.

Добавлено через 3 минуты
Цитата Сообщение от alexey31415 Посмотреть сообщение
а теперь ещё более дивные чудеса,программа компилируется,запускается .exe файл,но окно не появляется
это, кстати, стандартное поведение winapi - если где-то, что-то накосячено, никаких угрожающих сообщений и падений всего что можно - просто ничего не происходит а ошибку можно вытянуть через
C++
1
DWORD GetLastError(void);
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.04.2012, 20:11  [ТС]     Загрузка изображения в окно #7
Цитата Сообщение от IPtv Посмотреть сообщение
ну какбэ winapi не сильно популярная тема на сегодня
ну ведь приложения на винду пишутся именно так или я не прав?
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
11.04.2012, 23:51     Загрузка изображения в окно #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
ну ведь приложения на винду пишутся именно так или я не прав?
и да и нет. с одной стороны, даже, в недрах .net тот самый winapi, а с другой - на чистом winapi ничего серьёзного не пишут года так с 1992, когда появились MFC, OWL (а потом VLC) ну а потом и куча других библиотек, упрощающих жизнь (наверное половина программистов, начинающих с winapi, пытается и таки создаёт что-то своё на эту тему).
имхо, знать winapi весьма полезно, но для программирования лучше пользоваться любой удобной библиотекой - так быстрее и меньше ошибок (а часто просто глупых описок, вот у вас, казалось бы простейшая программа - а фиг работает; помнится первый свой каркасный пример, только что "hello world" рисовавший, сутки мучил).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2012, 08:34     Загрузка изображения в окно
Еще ссылки по теме:

Qt загрузка изображения C++
C++ Загрузка изображения из файла (VS2005)
C++ Создать окно с кнопкой, закрывающей это окно

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.04.2012, 08:34  [ТС]     Загрузка изображения в окно #9
MFC сейчас вроде самая популярная
Yandex
Объявления
12.04.2012, 08:34     Загрузка изображения в окно
Ответ Создать тему
Опции темы

Текущее время: 07:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru