Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.251.154] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Парни у меня снова возникли проблемы, мне нужно работать с PNG, нужно создать окно на основе PNG. По этой теме незнаю ничего, говорят GDI+ поможет, но инфы по этому поводу я не нашел, помогите пожалуйста.
|
Сообщ.
#2
,
|
|
|
Вот начинай отсюда - Вывести картинку в JPEG,GIF,PNG,TIFF средствами Win. Там второй способок, как раз GDI+.
|
Сообщ.
#3
,
|
|
|
Цитата Maxidrom @ Парни у меня снова возникли проблемы, мне нужно работать с PNG, нужно создать окно на основе PNG. регион сделать или просто картинку наляпать? если регион BOOL SetBitmapRgn(HBITMAP hRgnBitmap)//цвет "прозрачности" определяется по точке(0,0) { //создание региона по маске if(hRgnBitmap==NULL) return FALSE; HRGN hRgnDest; HRGN hRgn; BITMAP bmp; GetObject(hRgnBitmap, sizeof(BITMAP), (LPSTR)&bmp); int bpp = bmp.bmBitsPixel >> 3; BYTE* pBits=new BYTE[bmp.bmWidth*bmp.bmHeight*bpp]; GetBitmapBits(hRgnBitmap,bmp.bmWidth*bmp.bmHeight*bpp,pBits); DWORD dwTransPixel=*(DWORD*)pBits; //узнаем цвет прозрачности dwTransPixel <<= 32 - bmp.bmBitsPixel; hRgnDest=::CreateRectRgn(0,0,0,0); //определение непрозрачных точек for (int i = 0; i < bmp.bmHeight; i++) { int nStartX=-1; for (int j = 0; j < bmp.bmWidth; j++) { DWORD dwPixel = *(DWORD*)(pBits + (i * bmp.bmWidth + j) * bpp) << (32 - bmp.bmBitsPixel); if (dwPixel!=dwTransPixel) { if (nStartX<0) { nStartX = j; } else if (j == (bmp.bmWidth - 1)) { hRgn = CreateRectRgn( nStartX, i, j, i + 1 ); CombineRgn( hRgnDest, hRgnDest, hRgn, RGN_OR); nStartX=-1; } } else if (nStartX>=0) { hRgn = CreateRectRgn(nStartX, i, j, i + 1); CombineRgn(hRgnDest, hRgnDest, hRgn, RGN_OR); nStartX=-1; } } } delete[] pBits; //подключаем созданный регион к окну ::SetWindowRgn(m_hWnd,hRgnDest,TRUE);//где m_hWnd - хендл окна у которого изменяется регион return TRUE; } но маску думаю лучше задать не посредством png, а при помоши монохромного(для уменьшения размера) bmp, потомучто в png будут наблюдаться неоднородности из-за сжатия... а скин уже накладывать посредством gdi+, как указал neooleg, хотя если нужна загрузка картинок из ресурсов, то смотрим в сторону конструктора Image( IStream *stream, BOOL useEmbeddedColorManagement ); ну а как создать stream из ресурса описано в [C++,WinAPI]Загрузка картинки |
Сообщ.
#4
,
|
|
|
Спасибо попробую разобраться
|
Сообщ.
#5
,
|
|
|
У меня так ничего и не получилось, вобще есть какие-нибудь DLL для работы с PNG без гемороя? У меня есть проект сделанный на MFC, он умеет выводить PNG (с помощью какой-то imgdecoder.dll) но этот MFC я вообще не понимаю как че там работает. Вот если есть эта dll, можно узнать какие функции она экспортирует?
З.Ы. с этим PNG уже два дня голову ломаю в итоге у меня return NULL( |
Сообщ.
#6
,
|
|
|
Пример на VB, с переводом проблем не возникнет?
Прикреплённый файл_png_alpha.rar (51.71 Кбайт, скачиваний: 497) |
Сообщ.
#7
,
|
|
|
Возникли( VB я тоже к сожадению не знаю
|
Сообщ.
#8
,
|
|
|
Вот я научился выводить изображение попиксельно, кто-нибудь может объяснить как происходит вывод на рабочий стол окна, у которого в разных местах переменная полупрозрачность. Во всех примерах что я находил и которые мне тут дали используют BLENDFUNCTION и UpdateLayeredWindow и там все получается - отображается окно с разной полупрозрачностью, но я никак не вгоню КАК это происходит, объясните пожалуйста. Заранее благодарен!
|
Сообщ.
#9
,
|
|
|
Цитата Maxidrom @ Возникли( VB я тоже к сожадению не знаю Хм. А какой знаешь? Цитата Maxidrom @ Вот я научился выводить изображение попиксельно PNG? Чем и куда? Цитата Maxidrom @ кто-нибудь может объяснить как происходит вывод на рабочий стол окна, у которого в разных местах переменная полупрозрачность GDI учитывает альфа-канал и смешивает каждый пиксель формы с пикселем фона... |
Сообщ.
#10
,
|
|
|
Цитата B.V. Хм. А какой знаешь? Знаю только C++. Цитата B.V. PNG? Чем и куда? С помощью GDI+ вывожу PNG в простое окно, считывает попиксельно и учитывает альфу у каждого пиксела. Graphics g(hDC); Bitmap myBitmap(L"lol.png"); Color pixelColor; for (int i=0; i<256; i++) { for (int j=0; j<256; j++) { myBitmap.GetPixel(i, j, &pixelColor); SolidBrush brush(pixelColor); g.FillRectangle(&brush, Rect(i, j, 1, 1)); } } Но как мне это теперь вывести на рабочий стол в я не знаю((( |
Сообщ.
#11
,
|
|
|
Цитата Maxidrom @ Знаю только C++. Ну, разница невелика. Подключи к проекту gdiplus.h. А что бы не писать все время Gdiplus:: сразу укажи using namespace Gdiplus;... Далее, по-моему, там все интуитивно понятно (в моем примере). |
Сообщ.
#12
,
|
|
|
Я не могу разобраться с типами данных там везде Dim ... As Long. Не понимаю этого, в инете нашел что это int, тупик вобщем.
|
Сообщ.
#13
,
|
|
|
#define _WIN32_WINNT 0x0500 #include <windows.h> #include <tchar.h> #include <gdiplus.h> #pragma comment(lib,"gdiplus.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = _T("MyClass"); wcex.hIconSm = NULL; RegisterClassEx(&wcex); HWND hWnd = CreateWindow(wcex.lpszClassName, _T("MyWnd"), WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (::IsWindow(hWnd)&&GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } BITMAPINFO BMI; using namespace Gdiplus; ULONG_PTR gdiplusToken; HDC hCDC; UINT H,W; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { BMI.bmiHeader.biSize=sizeof(BMI.bmiHeader); BMI.bmiHeader.biBitCount = 32; BMI.bmiHeader.biHeight = 500; BMI.bmiHeader.biWidth = 500; BMI.bmiHeader.biPlanes = 1; BMI.bmiHeader.biSizeImage = BMI.bmiHeader.biWidth * BMI.bmiHeader.biHeight * (BMI.bmiHeader.biBitCount / 8); HDC hDTDC=GetDC(NULL); hCDC = CreateCompatibleDC(hDTDC); ReleaseDC(NULL,hDTDC); HBITMAP hBitmap = CreateDIBSection(hCDC,&BMI, DIB_RGB_COLORS, NULL, 0, 0); HBITMAP hOldObject = (HBITMAP)SelectObject(hCDC, hBitmap); GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); GpGraphics *graphics; DllExports::GdipCreateFromHDC(hCDC, &graphics); GpImage* image; DllExports::GdipLoadImageFromFile(L"mspaint.png",&image); if(image==NULL) { MessageBox(0,_T("картинку положи на место"),0,0x10); PostQuitMessage(0); } SetWindowLong(hWnd,GWL_EXSTYLE, (GetWindowLong(hWnd,GWL_EXSTYLE)|WS_EX_LAYERED&~WS_EX_WINDOWEDGE)); SetWindowLong(hWnd,GWL_STYLE, (GetWindowLong(hWnd,GWL_STYLE)&~WS_CAPTION)); SetLayeredWindowAttributes(hWnd,0,0,LWA_COLORKEY); DllExports::GdipGetImageHeight(image, &H); DllExports::GdipGetImageWidth(image, &W); SetWindowPos(hWnd,NULL,0,0,W,H,SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED); DllExports::GdipDrawImageRect(graphics, image, 0, 0, (REAL)W, (REAL)H); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hDC=::BeginPaint(hWnd,&ps); ::BitBlt(hDC,0,0,W,H,hCDC,0,0,SRCCOPY); ::EndPaint(hWnd,&ps); break; } case WM_DESTROY: GdiplusShutdown(gdiplusToken); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } |
Сообщ.
#14
,
|
|
|
To ElcnU
Спасибо огромное |