Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608

Отображение и масштабирование картинки в окне программы

21.09.2010, 18:42. Показов 4762. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <windows.h>
 
/*  Declare Windows procedure  */
LRESULT CALLBACK DCDemoWndProc (HWND, UINT, UINT, LONG);
 
/*  WINAPI - îïðåäåëÿåò ïîðÿäîê ïåðåäà÷è ïàðàìåòðîâ ïðè âûçîâå ïðîöåäóðû  */
int WINAPI WinMain (HINSTANCE hThisInstance, //Õýíäë ýêçåìïëÿðà ïðîãðàììû
                    HINSTANCE hPrevInstance, //Æýíäë ïðåäûäóùåãî ýêçåìïëÿðà ïðîãðàììû
                    LPSTR lpszCmdParam,
                    int nCmdShow) //Âèä îêíà
 
{
    HWND hWnd;               /* This is the handle for our window */
    MSG Msg;            /* Here messages to the application are saved */
    WNDCLASS WndClass;        /* Data structure for the windowclass */
    char szClassName[ ] = "DCDemo";
 
    /* The Window structure */
    WndClass.style = CS_HREDRAW | CS_VREDRAW;      /* Ïåðåðèñîâêà îêíà ïðè èçìåíåíèè âûñîòû è øèðèíû îêíà */
    WndClass.lpfnWndProc = DCDemoWndProc;      /* This function is called by windows */
    WndClass.cbClsExtra = 0;                      /* No extra bytes after the window class */
    WndClass.cbWndExtra = 0;                      /* structure or the window instance */
    WndClass.hInstance = hThisInstance;
    WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = "MyMenu";                 /* No menu */
    WndClass.lpszClassName = szClassName;
 
    /* Use default icon and mouse-pointer */
    /* Use Windows's default color as the background of the window */
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClass(&WndClass))
    {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }
    /* The class is registered, let's create the program*/
    hWnd = CreateWindow (
           szClassName,         /* Classname */
           "Programm 1",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           NULL,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    
    if (!hWnd)
    {
        MessageBox(NULL, "Cannot create window", "Error", MB_OK);
        return 0;
    }
    
    /* Make the window visible on the screen */
    ShowWindow (hWnd, nCmdShow);
    UpdateWindow(hWnd);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage(&Msg, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&Msg);
        /* Send message to WindowProcedure */
        DispatchMessage(&Msg);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return Msg.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK DCDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    HANDLE hBitmap, hOldBitmap;
    RECT Rect;
    BITMAP Bitmap;
    switch (Message)                  /* handle the messages */
    {
        case WM_PAINT:
            //Ïîëó÷àåì êîíòåêñò óñòðîéñòâà.
            hDC = BeginPaint(hWnd,&PaintStruct);
            //Çàãðóæàåì bitmap, êîòîðûé áóäåò îòîáðàæàòüñÿ â îêíåá èç ôàéëà.
            hBitmap = LoadImage(NULL, "SOUNDMAX.BMP",
            IMAGE_BITMAP,
            0, 0,
            LR_LOADFROMFILE);
            //Ïîëó÷àåì ðàçìåðíîñòü çàãðóæåííîãî bitmap'a.
            GetObject(hBitmap, sizeof(BITMAP), &Bitmap);
            //Ñîçäà¸ì ñîâìåñòèìûé ñ êîíòåêñòîì îêíà êîíòåêñò â ïàìÿòè.
            hCompatibleDC = CreateCompatibleDC(hDC);
            //Äåëàåì çàãðóæåííûé èç ôàéëà bitmap òåêóùèì â ñîâìåñòèìîì êîíòåêñòå.
            hOldBitmap = SelectObject(hCompatibleDC, hBitmap);
            //Îïðåäåëÿåì ðàçìåð ðàáî÷åé îáëàñòè îêà.
            GetClientRect(hWnd,&Rect);
            //Êîïèðóåì bitmap ñ ñîâìåñòèìîãî íà îñíîâíîé êîíòåêñò ñ ìàñøòàáèðîâàíèåì.
            StretchBlt(hDC, 0, 0, Rect.right, Rect.bottom,
            hCompatibleDC, 0, 0,  Bitmap.bmWidth,
            Bitmap.bmHeight, SRCCOPY);
            //Âíîâü äåëàåì ñòàðûé bitmap òåêóùèì.
            SelectObject(hCompatibleDC, hOldBitmap);
            //Óäàëÿåì çàãðóæåííûé ñ äèñêà bitmap.
            DeleteObject(hBitmap);
            //Óäàëÿåì ñîâìåñòèìûé êîíòåêñò/
            DeleteDC(hCompatibleDC);
            EndPaint(hWnd,&PaintStruct);
            return 0;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            return 0;
    }
 
    return DefWindowProc (hWnd, Message, wParam, lParam);
}
Программа успешно компилируется и запускается, но вместо картинки отображается белый фон.
Мне кажетс. что надо исправить 94 строчку, только не знаю как.
C++
1
hBitmap = LoadImage(NULL, "SOUNDMAX.BMP",
Добавлено через 23 минуты
И ещё поясните. какая директория доступна через переменную окружения РАТН?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2010, 18:42
Ответы с готовыми решениями:

Отображение картинки на кнопку в новом окне
Добрый день, есть некая программа с таким интерфейсом. скриншот Хочется чтобы выделенная часть открывалась по еще одной кнопке скажем...

Отображение картинки в другом окне при нажатии на image
Добрый всем день! Подскажите пожалуйста, как можно реализовать открытие картинки в новом окошке, при нажатии определенного Image???

Отображение процента выполнения программы в отдельном окне
Интересует такой вопрос... Лень для визуального отображения процесса выполнения подпрограммы создавать Form с отображением информации...

8
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
22.09.2010, 05:33
Вы может быть не поверите, но картинка у меня загрузилась и растянулась успешно.

Цитата Сообщение от Alexey R Посмотреть сообщение
какая директория доступна через переменную окружения РАТН?
Это как понять? Значение переменной - это директории, разделенные пробелом.

Добавлено через 1 минуту
Поставьте проверки на результаты вызовов этих функций.
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
22.09.2010, 08:43  [ТС]
Евгений М., цитирую слова из книги П. В. Румянцева:
Если читатель набрал программу буква в букву, его при запуске ожидает одна неприятность - отобразится окно с белым фоном.
Дело в том. что в моей программе отображается тот bitmap, который нравится мне и. что более важно, находится в доступной директории. Предлагаю читателю в тексте программы найти оператор, который начинается с "hBitmap = LoadImage" и заменить имя bitmap'a "msdogs.bmp" на имя того bitmap'a, который будет отображать программма на читательском компьютере. Не забудьте при этом проверить. чтобы новый bitmap был доступен, то есть, находился бы в директории, доступной через переменную окружения PATH или в текущей директории.
Подчеркнул то. что мне непонятно.
0
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
22.09.2010, 08:47
Значение PATH - это директории, в котором ищутся файлы (в нашем случае это SOUNDMAX.BMP), если файлы не найдены в текущем каталоге.
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
22.09.2010, 09:28  [ТС]
Цитата Сообщение от Евгений М. Посмотреть сообщение
Вы может быть не поверите, но картинка у меня загрузилась и растянулась успешно.
У Вас какая среда разработки?
У меня WxDev C++, компилятор MiniGW.
Чего только ни делал с картинкой: переименовывал, перемещал в другую папку и всё равно не отображается.
0
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
22.09.2010, 14:46
Цитата Сообщение от Alexey R Посмотреть сообщение
У Вас какая среда разработки?
У меня WxDev C++, компилятор MiniGW.
Я пользуюсь текстовым редактором с подсветкой синтаксиса и компилятором MinGW. Исходник также проверил на Microsoft C++ Compiler 16.00 (MSVC++ 2010 Express). Все загружается и растягивается.

Вы как запускаете программу? Через что-то вроде Project->Run? Если да, то попробуйте запустить вручную т.е. найти скомпилированную программу и запустить ее. При этом рисунок должен быть в том же каталоге, где сама программа.
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
23.09.2010, 08:10  [ТС]
Запускаю вручную, щёлкая по исполняемому файлу, а создаю через меню Файл -> Создать -> Новый проект -> Windows Application.
Кроме того. после компиляции получается исполняемый файл с именем "¦ЁюхъЄ1.exe", независимо от имени сохраняемого проекта.
Исполняемый файл создаётся в каталоге "Имя папки, в которой сохраняются файлы проекта\Output\MiniGW".
Среда разработки - wxDev C++.
0
 Аватар для Игор
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 32
23.09.2010, 13:49
Пишите имена проектов английскими буквами. У меня DevCpp не компилирует, жалуется на последнюю строку.
1
5 / 5 / 1
Регистрация: 23.11.2009
Сообщений: 608
01.10.2010, 08:55  [ТС]
Вы может быть не поверите, но картинка у меня загрузилась и растянулась успешно.
У меня тоже в программе загрузилась картинка после компиляции в Dev C++. В программе, откомпилированной в wxDev C++ почему-то не отображается картинка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2010, 08:55
Помогаю со студенческими работами здесь

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

Масштабирование картинки
Как сделать чтобы пользователю можно было картинку увеличивать и уменьшать...?

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru