На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Работа с PNG , GDI+ или что-нить другое
    Парни у меня снова возникли проблемы, мне нужно работать с PNG, нужно создать окно на основе PNG. По этой теме незнаю ничего, говорят GDI+ поможет, но инфы по этому поводу я не нашел, помогите пожалуйста.
      Вот начинай отсюда - Вывести картинку в JPEG,GIF,PNG,TIFF средствами Win. Там второй способок, как раз GDI+.
        Цитата Maxidrom @
        Парни у меня снова возникли проблемы, мне нужно работать с PNG, нужно создать окно на основе PNG.

        регион сделать или просто картинку наляпать?
        если регион
        ExpandedWrap disabled
          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, хотя если нужна загрузка картинок из ресурсов, то смотрим в сторону конструктора
        ExpandedWrap disabled
          Image(          IStream *stream,
              BOOL useEmbeddedColorManagement
          );

        ну а как создать stream из ресурса описано в [C++,WinAPI]Загрузка картинки
        Сообщение отредактировано: ElcnU -
          Спасибо попробую разобраться
            У меня так ничего и не получилось, вобще есть какие-нибудь DLL для работы с PNG без гемороя? У меня есть проект сделанный на MFC, он умеет выводить PNG (с помощью какой-то imgdecoder.dll) но этот MFC я вообще не понимаю как че там работает. Вот если есть эта dll, можно узнать какие функции она экспортирует?

            З.Ы. с этим PNG уже два дня голову ломаю в итоге у меня return NULL(
              Пример на VB, с переводом проблем не возникнет?
              Прикреплённый файлПрикреплённый файл_png_alpha.rar (51.71 Кбайт, скачиваний: 497)
                Возникли( VB я тоже к сожадению не знаю
                  Вот я научился выводить изображение попиксельно, кто-нибудь может объяснить как происходит вывод на рабочий стол окна, у которого в разных местах переменная полупрозрачность. Во всех примерах что я находил и которые мне тут дали используют BLENDFUNCTION и UpdateLayeredWindow и там все получается - отображается окно с разной полупрозрачностью, но я никак не вгоню КАК это происходит, объясните пожалуйста. Заранее благодарен!
                    Цитата Maxidrom @
                    Возникли( VB я тоже к сожадению не знаю


                    Хм. А какой знаешь?

                    Цитата Maxidrom @
                    Вот я научился выводить изображение попиксельно


                    PNG? Чем и куда?

                    Цитата Maxidrom @
                    кто-нибудь может объяснить как происходит вывод на рабочий стол окна, у которого в разных местах переменная полупрозрачность


                    GDI учитывает альфа-канал и смешивает каждый пиксель формы с пикселем фона...
                      Цитата B.V.

                      Хм. А какой знаешь?

                      Знаю только C++.
                      Цитата B.V.

                      PNG? Чем и куда?

                      С помощью GDI+ вывожу PNG в простое окно, считывает попиксельно и учитывает альфу у каждого пиксела.
                      ExpandedWrap disabled
                        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));
                           }
                        }

                      Но как мне это теперь вывести на рабочий стол в я не знаю(((
                      Сообщение отредактировано: Maxidrom -
                        Цитата Maxidrom @
                        Знаю только C++.


                        Ну, разница невелика. Подключи к проекту gdiplus.h. А что бы не писать все время Gdiplus:: сразу укажи using namespace Gdiplus;... Далее, по-моему, там все интуитивно понятно (в моем примере).
                          Я не могу разобраться с типами данных там везде Dim ... As Long. Не понимаю этого, в инете нашел что это int, тупик вобщем.
                            ExpandedWrap disabled
                              #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;
                              }
                            Сообщение отредактировано: ElcnU -
                              To ElcnU
                              Спасибо огромное
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,1057 ]   [ 16 queries used ]   [ Generated: 20.04.24, 00:54 GMT ]