С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/117: Рейтинг темы: голосов - 117, средняя оценка - 4.67
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102

Что такое HBITMAP?

26.06.2013, 09:01. Показов 24895. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мужики проясните плз.
Сразу говорю я в курсе, что это дискриптор битмапа.
Интересует немного другое.
Указатель это всётаки или нет?
В msdn ничего толкового не нашёл...
http://msdn.microsoft.com/en-u... 85%29.aspx
Судя по выше указанной ссылке - это void*.
Решил уточнить на всякий случай...
Меня вот ещё что интересует...
Если я буду присваивать этот указатель многократно таким способом
HBITMAP hbm1 = загрузка изображения из ресурсов.
HBITMAP hbm2 = загрузка второго изображения.
HBITMAP hbm;
hbm = hbm1;
hbm = hbm2;
Мне же не нужно вызывать между присвоениями DeleteObject(),
Пока эти изображения хранятся в исходных дискрипторах hbm1, hbm2???
Что-то уже просто запутался со всеми этими мелкософтовскими замутами...
И ещё вопрос...
Можно ли возвращать HBITMAP из ф-ции???
Вроде где-то читал что указатели не рекомендуется...
Т.е. хочу сделать так...
HBITMAP hbm; // глобальная.

HBITMAP MyFun(UINT idBitmap)
{
hbm = //загружаю
return hbm;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2013, 09:01
Ответы с готовыми решениями:

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых "Библиотека системного программиста" рисование битовых изображений в формате DDB. Загрузил битмап из...

Смещение HBITMAP
Привет , волнует вопрос что такое смещение или выравнивание байт(пикселей). Видел несколько кодов для считывания bmp файла , но принцип...

HBITMAP convert
как я понял HBITMAP, возвращаемый функцией LoadImage - это указатель на память в которой храняться данные битмапа так? всякие там...

27
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
26.06.2013, 11:48

Не по теме:

Цитата Сообщение от IPavel Посмотреть сообщение
Сразу говорю я в курсе, что это дискриптор битмапа.
Ну вот, зря в тему зашёл чтоли :(



Цитата Сообщение от IPavel Посмотреть сообщение
Указатель это всётаки или нет?
Нет ... скажем так хендлер это хендлер, а указатель это указатель. Глубоко-глубоко если докопаться до сути есть различия, но вы на них внимание пока не обращайте.

Цитата Сообщение от IPavel Посмотреть сообщение
Судя по выше указанной ссылке - это void*.
Ну если проследовать до нижней цепочки то да, вы раскрили секрет MS - у них там половина PVOID в итоге.

Цитата Сообщение от IPavel Посмотреть сообщение
HBITMAP hbm1 = загрузка изображения из ресурсов.
HBITMAP hbm2 = загрузка второго изображения.
HBITMAP hbm;
hbm = hbm1;
hbm = hbm2;
Мне же не нужно вызывать между присвоениями DeleteObject(),
Нет.

Цитата Сообщение от IPavel Посмотреть сообщение
Можно ли возвращать HBITMAP из ф-ции???
Можно, возвращайте что угодно, хоть WndProc.

Цитата Сообщение от IPavel Посмотреть сообщение
Вроде где-то читал что указатели не рекомендуется...
Не внимательно читали.

Цитата Сообщение от IPavel Посмотреть сообщение
Т.е. хочу сделать так...
HBITMAP hbm; // глобальная.
HBITMAP MyFun(UINT idBitmap)
{
hbm = //загружаю
return hbm;
}
А в чём смысл тогда возвращать то что и так есть в глобальной области имён? До hbm и так что угодно может добраться.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.06.2013, 15:58
@IPavel, HBITMAP это индекс в системной таблице, которая содержит адрес структуры.
В данном случае с полями битмапа.

Вот объява HBITMAP в windef.h
C++
1
DECLARE_HANDLE(HBITMAP);
Раскрытие смыла макроса DECLARE_HANDLE которое имеется в winnt.h ниже

C++
1
2
3
4
5
6
7
8
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;
Нас интересует
C++
1
DECLARE_HANDLE(name) typedef HANDLE name
Добавлено через 2 минуты
Ниже ссылка на проект с загрузкой кбитмапа и его отрисовкой в окне
Загрузка изображения bmp из ресурсов (начальный вариант)

Здесь конечный вариант (в кое была утечка памяти выраженная в утечке объектов GDI)
Загрузка изображения bmp из ресурсов

Не по теме:

PS:аналогично HBITMAP HWND - номер в системной таблице дескрипторов структуры с данными об окне.

0
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102
26.06.2013, 18:29  [ТС]
Цитата Сообщение от Gepar Посмотреть сообщение

А в чём смысл тогда возвращать то что и так есть в глобальной области имён? До hbm и так что угодно может добраться.
Спасибо за ответы
Ну просто я тут написал в глобальном пространстве для упращения обьяснения...
В реальности у меня же это всё класс локализации...
И с ним будет работать "вся" кому нужны какие либо данные из ресурсов.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
@IPavel, HBITMAP это индекс в системной таблице, которая содержит адрес структуры.
В данном случае с полями битмапа...
Спасибо!
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
26.06.2013, 22:50
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Здесь конечный вариант (в кое была утечка памяти выраженная в утечке объектов GDI)загрузка изображение bmp из ресурсов
-=ЮрА=-, не хочу тебя огорчать, но там всё по-прежнему. Могу даже подсказать где именно: утечка в битмапе.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.06.2013, 23:16
@Digit@ll, огорчать меня не надо последний варинт работет нормально (опускаться до того чтобы аттачить видео с устойчивой работой не намерен). А вот проверить 7-ку на баг с ГДИ стоит - присутсвует особенно в паленных версиях
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
26.06.2013, 23:31
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
последний варинт работет нормально
Да, нормально, пока не перекроешь его другим окном.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
проверить 7-ку на баг с ГДИ стоит
У мну XP.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.06.2013, 23:47

Не по теме:

Ну проверь GDI раз у тебя ХРюша как и у меня. Нагугли GDI Leakege in normal mode



Добавлено через 2 минуты

Не по теме:

@Digit@ll, вобщем проверил перекрытие - копай у себя в оси баг (утечки нет)

0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
27.06.2013, 22:31
У кого еще происходит утечка ресурсов из вложения по ссылке: загрузка изображение bmp из ресурсов
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.06.2013, 23:12
@Digit@ll, поддерживаю !!! Исходник компилить не стал , запустил exe - шник и диспетчер задач стоило пару раз перекрыть окно и вот они побежали ( начал с 15 объектов , при достижении 83 закрыл окно ) , причём большими шагами . ОС - Win7 x64 ( лицензия ) .
1
27.06.2013, 23:24

Не по теме:

В папке был старый экзешник, я поправил код и закинул тот же солюшн:facepalm:
@Digit@ll, компилировать пробовал или что лежало в папке то и запустил

0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.06.2013, 23:39
сейчас глянул код , а чего тут ожидать то было ? вопервых LoadImage в обработке WM_PAINT , так ещё и HBITMAP bm= NULL; не static . сделать static - ом и уже уберутся проблемы с утечкой .
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.06.2013, 00:35
аттачу проект - в котором экзешник слинокван
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
123
124
125
// APILoadImg.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include "resource.h"
 
// Global Variables:
HINSTANCE hInst;    // current instance
// Foward declarations of functions included in this code module:
LRESULT CALLBACK    DlgProc(HWND, UINT, WPARAM, LPARAM);
void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBitmap);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    DialogBox((hInst = hInstance), (LPCTSTR)IDD_DIALOG, NULL, (DLGPROC)DlgProc);
    MSG msg;
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
LRESULT CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC   = NULL;
    BOOL bRet = FALSE;
    BOOL bCmd = FALSE;
    HBITMAP bm= NULL;
    PAINTSTRUCT ps;
    switch (message) 
    {
        case WM_INITDIALOG:
            bRet = TRUE;
            break;
        case WM_COMMAND:
            bRet = TRUE;
            bCmd = TRUE;
            break;
        case WM_PAINT:
            if(hDC = BeginPaint(hWnd, &ps))
            {
                bm = (HBITMAP)LoadImage
                (
                    hInst,
                    MAKEINTRESOURCE(IDB_BITMAP),
                    IMAGE_BITMAP,
                    ps.rcPaint.right - ps.rcPaint.left,
                    ps.rcPaint.bottom - ps.rcPaint.top,
                    LR_COPYFROMRESOURCE
                );
                DrawBitmap(hDC, 0, 0, bm);
                if( bm )
                    DeleteObject(bm);
                EndPaint(hWnd, &ps);
            }
            else
                MessageBox(hWnd,"Error GetDC",NULL,MB_OK);
            bRet = TRUE;
            break;
        case WM_DESTROY:
        case WM_CLOSE:
            EndDialog(hWnd, LOWORD(wParam));
            PostQuitMessage(0);
            break;
    }
    return bRet;
}
 
void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBitmap)
{
        HBITMAP hbm, hOldbm;
        HDC hMemDC;
        BITMAP bm;
        POINT ptSize, ptOrg;
 
        // Создаем контекст памяти, совместимый
        // с контекстом отображения
        hMemDC = CreateCompatibleDC(hdc);
 
        // Выбираем изображение bitmap в контекст памяти
        hOldbm = (HBITMAP)SelectObject(hMemDC, hBitmap);
 
        // Если не было ошибок, продолжаем работу
        if (hOldbm)
        {
                // Для контекста памяти устанавливаем тот же
                // режим отображения, что используется в
                // контексте отображения
                SetMapMode(hMemDC, GetMapMode(hdc));
 
                // Определяем размеры изображения
                GetObject(hBitmap, sizeof(BITMAP), (LPSTR) &bm);
 
                ptSize.x = bm.bmWidth;  // ширина
                ptSize.y = bm.bmHeight; // высота
 
                // Преобразуем координаты устройства в логические
                // для устройства вывода
                DPtoLP(hdc, &ptSize, 1);
 
                ptOrg.x = 0;
                ptOrg.y = 0;
 
                // Преобразуем координаты устройства в логические
                // для контекста памяти
                DPtoLP(hMemDC, &ptOrg, 1);
 
                // Рисуем изображение bitmap
                BitBlt(hdc, x, y, ptSize.x, ptSize.y,
                        hMemDC, ptOrg.x, ptOrg.y, SRCCOPY);
 
                // Восстанавливаем контекст памяти
                SelectObject(hMemDC, hOldbm);
        }
 
        // Удаляем контекст памяти
        DeleteDC(hMemDC);
}

Не по теме:

Кинь скрины, кинь видео, и "дигитал" пусть тоже кидает,жду ...

Вложения
Тип файла: rar APILoadImg.exe.rar (23.2 Кб, 21 просмотров)
Тип файла: rar PROJ_WITHOUT_GDI_LEAKEGE.rar (48.4 Кб, 15 просмотров)
Тип файла: rar Видео0116.rar (2.14 Мб, 10 просмотров)
0
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102
28.06.2013, 09:19  [ТС]
@-=ЮрА=-, у меня вопрос...
А почему ты переустанавливаешь режим отображения для совместимого контекста?
Вроде же как он наследует параметры от родительского...
Или я не прав???
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
28.06.2013, 11:29
На скрины
Миниатюры
Что такое HBITMAP?   Что такое HBITMAP?  
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
28.06.2013, 11:33
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Особенно "порадовал" Игорь с++, надеюсь что когда нибудь его труды заметят и оштрафуют за глупость подобную этой
Да Юра , я прежде делать какое то высказывание тестирую , и эти результаты могу тоже скинуть (компилятор gcc)
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
28.06.2013, 11:41
Ресурсы теперь не ест , но и перерисовка не идёт
Миниатюры
Что такое HBITMAP?  
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
28.06.2013, 11:46
и что я должен был увидеть в твоём видео ? ты часть окна за граници дисплея затащи , а затем вытащи , вот тогда и посмотрим ( да и в том проекте на которую DIGITAL ссылку давал ).
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.06.2013, 11:50
Цитата Сообщение от IPavel Посмотреть сообщение
А почему ты переустанавливаешь режим отображения для совместимого контекста?
Вроде же как он наследует параметры от родительского...
Или я не прав???
- это об этом спрашиваешь
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
hMemDC = CreateCompatibleDC(hdc);
- если не делать свместимый контекст то при оперерисовках будут заметны мерцания, CompatibleDC и кое что ещё чего нет у нашего "гуру" (что именно тебе могу ответить в личке) нужны для быстрого наложения битов на родительский контекст. Т.е мы не обновляем окно а накладываем на него сразу готовую маску из битов (этим достигается быстрая не мигающая графика)
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
28.06.2013, 11:52
то и значит , что новый твой exe - шник не перерисовывает картинку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2013, 11:52
Помогаю со студенческими работами здесь

Копирование HBITMAP
Добрый дешь есть функция копирования одного hbitmap в новый, с новыми размерами. Но возвращается черное изображение, Что не так? (исходное...

Получить дескриптор HBITMAP
Для bmp-картинки, чтобы получить дескриптор HBITMAP, можно использовать функцию LoadImage. А как можно получить такой дескриптор, например,...

Сохранение HBITMAP в файл
#include <iostream> #include <fstream> #include <Windows.h> using namespace std; int main(){ HDC hdc; HDC hdcBit; ...

Вернуть HBITMAP из c++ dll
Во общем есть dll, в ней функция которая сохраняет в bmp файл, сохраняет из HBITMAP переменной, как мне сделать так, что б эту переменную...

Нарисовать hBitMap на самом себе
...со сдвигом. Почему-то не выходит. Не поделитесь кодом? Что-то мне подсказывает, что hBitMap на самом себе не нарисуется. Зачем мне...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru