Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2009, 19:36   #1
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию размеры bmp-файла

Так-с... написал я программку, которая выводит битмап в клиентскую область окна. Пока-что тот, путь к которому прописан в коде, потом сделаю, чтобы выбирать можно было. Не в этом суть. Битмап открываю функцией LoadImage, и гружу его в память, затем через контексты функцией BitBlt отрисовываю. Вот код:
Код:
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

char fname[100];
PAINTSTRUCT ps;
HDC hDC;
HDC hMemDC;
HBITMAP bmp_file;
RECT rect;

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;


    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    if (!RegisterClassEx (&wincl))
        return 0;
    hwnd = CreateWindowEx (
           0, 
           szClassName,
           "Code::Blocks Template Windows App",
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           544,
           375,
           HWND_DESKTOP, 
           NULL, 
           hThisInstance,
           NULL 
           );
    ShowWindow (hwnd, nCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
        {
            strcpy(fname,"D:\h.bmp");
            bmp_file = (HBITMAP)LoadImage(NULL, fname, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
            break;
        }
        case WM_DESTROY:
        {
            DeleteObject(bmp_file);
            PostQuitMessage (0);
            break;
        }
        case WM_PAINT:
        {
            hDC = BeginPaint(hwnd, &ps);
            hMemDC = CreateCompatibleDC(hDC);
            SelectObject(hMemDC,bmp_file);
            GetClientRect(hwnd,&rect);
            BitBlt(hDC,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY);
            DeleteDC(hMemDC);
            EndPaint(hwnd, &ps);
            break;
        }
        default: 
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
А теперь то, что я хочу узнать: после того, как я создал в памяти контекст для картинки, и загрузил её туда, можно-ли узнать её размеры? (ширину и высоту) И вообще, хотелось-бы узнать, как она в этом случае хранится в памяти? Целиком файл туда копируется, с заголовками, палитрой и т.д.? Или как? И можно-ли применить какой-либо алгоритм к этой картинке в памяти вроде масштабирования или фильтра? И как это сделать? Или хотя-бы куда мне идти чтобы почитать? Хоть убейте не знаю что конкретно искать. Формат bmp нашёл, а дальше не знаю.
Darth.Vader вне форума Ответить с цитированием
Старый 10.12.2009, 21:25   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
А теперь то, что я хочу узнать: после того, как я создал в памяти контекст для картинки, и загрузил её туда, можно-ли узнать её размеры? (ширину и высоту)
а это GetClientRect(hwnd,&rect) у вас по-вашему что?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.12.2009, 21:33   #3
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию

Это узнаются размеры окна, чтобы BitBlt знала до куда ей рисовать. Я-же хочу чтобы окно само изменяло размер под картинку...
Ну вот, роюсь в нете... GetDeviceCaps - не то? Могу я ей узнать размер картинки, помещённой в контекст hMemDC, а затем с помощью SetWindowPos поменять размер?
Darth.Vader вне форума Ответить с цитированием
Старый 10.12.2009, 21:55   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

дык...
Код:
GetObject(hBitmap, sizeof(BITMAP), &bmpInfo)
ваш bmp_file - це hBitmap... а дальше просто - bmpInfo.bmWidth, bmpInfo.bmHeight.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.12.2009, 22:31   #5
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию

Работает! Спасибо!
Darth.Vader вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнат Координаты BMP файла epidemiya Общие вопросы Delphi 10 22.05.2010 12:22
считывание bmp из файла на канву Mayday_007 Мультимедиа в Delphi 0 19.04.2009 20:09
Обработка BMP файла sparkspark Помощь студентам 4 20.02.2009 11:46