Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

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

10.04.2012, 07:26. Просмотров 1292. Ответов 8
Метки нет (Все метки)

В программе нужно вывести изображение с раширением .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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2012, 07:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Загрузка изображения в окно (C++):

Qt загрузка изображения - C++
Кто-нибудь может привести пример программы (желательно файл), где можно будет загружать изображение и изменять его яркость. Я читал...

Загрузка изображения. - C++
Дайте, пожалуйста, полностью рабочий код загрузки и отображения на экране картинки формата bmp в c++ через Bitmap. Очень нужно для курсовой...

Загрузка изображения из файла (VS2005) - C++
Здравствуйте. Не подскажите какие библиотеки использовать для загрузки изображения из файла. Gdiplus не подходит. Работаю под visual studio...

Добавление изображения в окно, ограничивание размеров окна - C++
Доброго времени суток. Для реализации программы нужно добавить картинку(простейшие форматы png etc) в диалоговое окно, можете, пожалуйста,...

Создать класс окно, используя композицию и иерархию, определить окно заголовком и кнопкой. - C++
Создать класс окно, используя композицию и иерархию, определить окно заголовком и кнопкой. Класс заголовок и окно тоже должны быть...

Создать окно с кнопкой, закрывающей это окно - C++
Создайте новый оконный проект в ОС Microsoft Windows 7 или Linux. Разместите посередине окна кнопку с надписью "Close". После нажатия...

8
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);
}
0
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
0
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)
0
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;
    }
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);
1
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
11.04.2012, 20:11  [ТС] #7
Цитата Сообщение от IPtv Посмотреть сообщение
ну какбэ winapi не сильно популярная тема на сегодня
ну ведь приложения на винду пишутся именно так или я не прав?
0
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" рисовавший, сутки мучил).
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.04.2012, 08:34  [ТС] #9
MFC сейчас вроде самая популярная
0
12.04.2012, 08:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2012, 08:34
Привет! Вот еще темы с ответами:

Как сделать окно (окно домика) в пространстве, как на изображении? - C++
Здравствуйте, как сделать окно в пространстве, как на изображении? сделал крышу и "фундамент": for (int i = 0, x = 9; i < 21;...

Загрузка изображения в окно - C++ WinAPI
Написал программу-пример из книги,которая загружает изображение в окно,при компиляции ошибок не возникает,запускается .ехе файл,но окно не...

Загрузка изображения в окно программы - C++ WinAPI
подскажите, пожалуйста, нужно чтобы изображение формата .bmp, выбранное через меню программы файл->открыть, отображалось в окне. ...

Загрузка картинок с сжатием и конвертированием изображения + массовая загрузка - PHP
Приветствую форумчане Я можно сказать что новичок в PHP но сайты пишу уже давно, и столкнулся с тем что мне нужно огромный архив на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru