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

Что такое HBITMAP?

26.06.2013, 09:01. Показов 25036. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru