Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Отображение jpg картинок на форме
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
crv crv вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.02.2009
По умолчанию Отображение jpg картинок на форме - 15.03.2010, 02:18

Необходимо создать окно и отобразить картинку. Как отображать bmp я нашел. А как быть с остальными форматами с тем же jpg или png?
Код:
#include <windows.h>

BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK GDIProc(HWND, UINT, UINT, LONG);


HINSTANCE hInst;
char szClassName[] = "WindowAppClass";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInst = hInstance;

    if(!RegClass(WndProc, szClassName, COLOR_WINDOW))
        return FALSE;

    hwnd = CreateWindow(szClassName, "App",
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        0, 0, hInstance, NULL);

    if(!hwnd) return FALSE;

    while(GetMessage(&msg, 0, 0, 0))
        DispatchMessage(&msg);

    return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackGround)
{
    WNDCLASS wc;
    wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = GDIProc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(brBackGround + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;

    return (RegisterClass(&wc) != 0);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam,
                         LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY: {PostQuitMessage(0); return 0;}
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

LRESULT CALLBACK GDIProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
{
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT paintStruct;
    HANDLE hBitmap, hOldBitmap;
    RECT rect;
    BITMAP bitmap;

    switch(msg)
    {
    case WM_PAINT: 
        hDC = BeginPaint(hwnd, &paintStruct);
        hBitmap = LoadImage(NULL, "1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        GetObject(hBitmap, sizeof(BITMAP), &bitmap);
        hCompatibleDC = CreateCompatibleDC(hDC);
        hOldBitmap = SelectObject(hCompatibleDC, hBitmap);
        GetClientRect(hwnd, &rect);
        StretchDIBlt(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, msg, wParam, lParam);
}
Ответить с цитированием
  (#2 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 15.03.2010, 11:44

Для работы с jpg или png можно использовать GDI+, класс CImage из ATL или какие-нить сторонние библиотеки.

Кстати, неоптимально делаль загрузки изображения в обработчике сообщений. Лучше битмап отдельно подгрузить, при запуске приложения, а потом только вывод его делать.
Ответить с цитированием
  (#3 (permalink)) Старый
crv crv вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.02.2009
По умолчанию 04.06.2010, 04:34

Вообщем поковырявшись в интернете и покоапашись в примерах удалось сваять вот такой код.

Код:
#include <windows.h>
#include <gdiplus.h>

#pragma comment(lib, "GdiPlus.lib")

using namespace Gdiplus;

BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


HINSTANCE hInst;
char szClassName[] = "WindowAppClass";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInst = hInstance;

    GdiplusStartupInput gdiplusStartupInput; 
    ULONG_PTR gdiplusToken; 
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


    if(!RegClass(WndProc, szClassName, COLOR_WINDOW))
        return FALSE;

    hwnd = CreateWindow(szClassName, "App",
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        0, 0, hInstance, NULL);

    if(!hwnd) return FALSE;

    while(GetMessage(&msg, 0, 0, 0))
        DispatchMessage(&msg);

    GdiplusShutdown(gdiplusToken);

    return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackGround)
{
    WNDCLASS wc;
    wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(brBackGround + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;

    return (RegisterClass(&wc) != 0);
}
/*
char ret_wallpaper()
{
        HKEY hKey = 0;
        char buf = {0};
        DWORD dwType = 0;
        DWORD dwBufSize = sizeof(buf);
        const char* subkey = "Control Panel\\Desktop";

        if( RegOpenKey(HKEY_CURRENT_USER,subkey,&hKey) == ERROR_SUCCESS)
        {
                dwType = REG_SZ;
                if( RegQueryValueEx(hKey,"Wallpaper",0, &dwType, (BYTE*)buf, &dwBufSize) != ERROR_SUCCESS)
                {
                   RegCloseKey(hKey);   
                }
                              
        }
       
        return buf;
}
*/

void OnPaint(HDC hdc, const RECT& rc)
{
   // char currentWallpaper = ret_wallpaper();  

    Graphics g(hdc);
    g.SetPageUnit(UnitPixel);
    RectF bounds(0, 0, float(rc.right), float(rc.bottom));

    Image bg(L"bb.jpg");
    g.DrawImage(&bg, bounds);

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam,
                         LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch(msg)
    {
    case WM_DESTROY: {PostQuitMessage(0); return 0;}
    
    case WM_PAINT:
        {
            hdc = BeginPaint(hwnd, &ps);
            OnPaint(hdc, ps.rcPaint);
            EndPaint(hwnd, &ps);
            return 0;

        }
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}
Все отлично создается и показывается картинка bb.jpg. Но! Используется синтаксис L"bb.jpg"? а как мне быть если вместо bb.jpg я захочу подставить что-то другое? Как мне этот параметр совмещать с этой литерой L, потому что без нее ничего не работает.

Задача у меня вообще такая: показать на форме картинку с Desktop. Пробовал вообще ковырять SystemParametersInfo, но в каком виде он возвращает путь к картинке я так и не понял, поэтому в примере уже использовал реестр.

То есть как полученный char подставить в этот параметр?
Ответить с цитированием
  (#4 (permalink)) Старый
mаjestic mаjestic вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.12.2010
По умолчанию 05.12.2010, 00:57

Можно поэкспериментировать с OleLoadPicture - она вроде бы позволяет грзить чего угодно... BMP, JPG, TGA и т.д.
Если нужны будут конкретные примеры - скажи попробую "настрогать"
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение картинки на форме gdvreg Java 2 17.12.2010 15:23
Отображение таблиц базы данных на форме chi-za MSSQL Server 1 02.09.2008 23:34
Сохранение картинок в IE Hontor Софт и программы 1 09.05.2007 21:14
Совмещение картинок на форме Алексеев Николай Delphi 2 24.10.2006 05:54
Как сделать предзагрузку картинок Diver2 DHTML, JavaScript, VBScript 38 27.08.2006 06:56
Отображение MJPEG на форме mapr Программирование графики 1 15.10.2005 17:11
Вставка картинок на форму NiKOLA C++ Builder 4 14.10.2005 16:21
Вытаскивание картинок из html kettle333 PHP 2 11.09.2005 16:16
Отображение HTML страницы на форме JStyleDaCome Visual C++ 2 29.07.2005 12:08
Отображение картинок в Rich text format Asdev Delphi 0 09.05.2005 14:42
Отображение картинок в IE как реализовать imported_VVS DHTML, JavaScript, VBScript 5 10.09.2003 19:00
Передвижения картинок на форме Форсаж Delphi 2 17.06.2003 20:28



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов