На главную Наши проекты:
Журнал   ·   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  все  ( Перейти к последнему сообщению )  
> Вывод изображения в static control , консультация
    Нужно вывести bmp в static. Делаю с помощью STM_SETIMAGE, но если изображение больше чем static , то оно не рисуется полностью. Так вот как ужать (или растянуть) картинку на весь статик?
      Используй StretchBlt с режимом HALFTONE
        И что это даст?
          Профит это даст.
            а пример кода или ссылку можно?
              помог SS_REALSIZECONTROL
                Цитата www @
                а пример кода или ссылку можно?

                ПОИСК: StretchBlt
                Например, Поместить изображение в CStatic

                SS_REALSIZECONTROL не сглаживает изображение при масштабировании
                  Вот вернулся опять...

                  Есть такой вопрос: нужно нарисовать в памяти изображение, а затем вывести его в static. Делаю так, но на выходе получаю черный квадрат. Где я не прав?

                  ExpandedWrap disabled
                    bool  DrawObject::Draw(HWND hWnd, ImageObject &hImage)
                    {
                        RECT rct={0};
                        GetClientRect(hWnd,&rct);
                     
                        HDC dc=GetDC(hWnd);
                        HDC dest=CreateCompatibleDC(dc);
                     
                        DrawScale(dest,rct,maxY,maxC);
                        ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N);
                     
                        DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj);
                     
                        ReleaseDC(hWnd,dc);
                        return true;
                    }
                     
                    bool DrawObject::DrawImage(HWND hWnd,int wDest,int hDest,ImageObject &hImage)
                    {
                        HBITMAP hBitmap=hImage.GetImageHandle();
                     
                        if(hBitmap)
                            {
                            hBitmap=(HBITMAP)SendMessage(hWnd,STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap);
                                    return true;
                            }
                     
                        return false;
                    }
                     
                    bool DrawObject::DrawScale(HDC &hdcDst,RECT rct,int maxY,int maxC)
                    {
                        HPEN hAxisPen=CreatePen(PS_SOLID,2,RGB(0x00,0x00,0xff));
                        HGDIOBJ hOld=SelectObject(hdcDst,hAxisPen);
                     
                        MoveToEx(hdcDst,rct.left+10,rct.top+10,NULL);
                        LineTo(hdcDst,rct.left+10,rct.bottom-10);
                        LineTo(hdcDst,rct.right-10,rct.bottom-10);
                     
                        DeleteObject(hAxisPen);
                        return true;
                    }
                    CreateCompatibleBitmap не хватает ну и SelectObject...
                    Сообщение отредактировано: ElcnU -
                      дописал вот так, но результата нет
                      ExpandedWrap disabled
                        bool  DrawObject::Draw(HWND hWnd, ImageObject &hImage)
                        {
                            RECT rct={0};
                            GetClientRect(hWnd,&rct);
                         
                            HDC dc=GetDC(hWnd);
                            HDC dest=CreateCompatibleDC(dc);
                            HBITMAP hCompatibleBitmap=CreateCompatibleBitmap(dc,rct.right-rct.left,rct.bottom-rct.top);
                            SelectObject(dest,hCompatibleBitmap);
                         
                            DrawScale(dest,rct,maxY,maxC);
                            ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N);
                         
                            DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj);
                         
                            ReleaseDC(hWnd,dc);
                            return true;
                        }
                        Дык у тебя DrawImage() посылает SendMessage, а не рисует на hCompatibleBitmap, а потом типа BitBlt на DC статика.
                        Вот от этого у тебя ничего и нету
                          еще бы быть уверенным как получается изображение из контекста в DrawGisto.... там есть SelectObject, чтоб вернуть заполненый битмап?
                          Сообщение отредактировано: ElcnU -
                            2Dem_max
                            а как нарисовать в hCompatibleBitmap? нужно в памяти сформировать изображение, а потом вывести его в static с помощью STM_SETIMAGE.

                            2ElcnU все выглядит так

                            ExpandedWrap disabled
                              bool DrawObject::DrawImage(HWND hWnd,int wDest,int hDest,ImageObject &hImage)
                              {
                                  HBITMAP hBitmap=hImage.GetImageHandle();
                               
                                  if(hBitmap)
                                  {
                                      hBitmap=(HBITMAP)SendMessage(hWnd,STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap);
                                  }
                               
                                  return false;
                              }
                               
                               
                              bool DrawObject::DrawScale(HDC &hdcDst,RECT rct,int maxY,int maxC)
                              {
                                  HPEN hAxisPen=CreatePen(PS_SOLID,2,RGB(0x00,0x00,0xff));
                                  HGDIOBJ hOld=SelectObject(hdcDst,hAxisPen);
                               
                                  MoveToEx(hdcDst,rct.left+10,rct.top+10,NULL);
                                  LineTo(hdcDst,rct.left+10,rct.bottom-10);
                                  LineTo(hdcDst,rct.right-10,rct.bottom-10);
                               
                                  DeleteObject(hAxisPen);
                               
                                  return true;
                              }
                               
                              ImageObject* DrawObject::DrawGisto(HDC &dest,RECT rct,int maxY, int maxC,int *vector,int N)
                              {  
                                  double xStep=(rct.right-rct.left-20)/256;
                                  double yStep=(rct.bottom-rct.top-20)/maxC;
                               
                                  HBITMAP hCompatibleBitmap=CreateCompatibleBitmap(dest,rct.right-rct.left,rct.bottom-rct.top);
                                  SelectObject(dest,hCompatibleBitmap);
                               
                                  HPEN hGistoPen=CreatePen(PS_SOLID,1,RGB(0xff,0x00,0x00));
                                  HGDIOBJ hOld=SelectObject(dest,hGistoPen);
                               
                                  for(int i=0;i<N;i++)
                                  {
                                      MoveToEx(dest,xStep*i,rct.bottom-10,NULL);
                                      LineTo(dest,xStep*i,yStep*vector[i]);
                                  }
                               
                                  SelectObject(dest,hOld);
                                  DeleteObject(hGistoPen);
                               
                                  return new ImageObject(hCompatibleBitmap);
                              }  
                               
                               
                              bool  DrawObject::DrawGistogram(HWND hWnd, ImageObject &hImage)
                              {
                                  RECT rct={0};
                                  GetClientRect(hWnd,&rct);
                                  HDC dc=GetDC(hWnd);
                                  hImage.CalculateGistogramm(dc);
                               
                                  int *vector=hImage.GetGistoVector();
                               
                                  int maxY=0,maxC=0;
                                  int N=hImage.GetGistoCount();
                               
                                  for(int i=0;i<N;i++)
                                  {
                                      if(vector[i/*яркость*/]>maxC)
                                          maxC=vector[i];
                                      if(i>maxY && i!=0)
                                          maxY=i;
                                  }
                               
                                  HDC dest=CreateCompatibleDC(dc);
                                  DrawScale(dest,rct,maxY,maxC);
                                  ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N);
                                  DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj);
                               
                                  ReleaseDC(hWnd,dc);
                               
                                  return true;
                              }
                            Сообщение отредактировано: www -
                              может наведет на мысль Разделить HBITMAP на куски (сообщение #1834452)

                              стоит обратить внимание, что битмап отвязывался от контекста перед возвратом из функции
                                Сам Bjarne Stroustrup дал ответ: "Так перед тем как битмап HBITMAP запиcывать в файл .bmp его надо удалить из контекста памяти."
                                GDI

                                Вызов DeleteDC(dest); перед return new ImageObject(hCompatibleBitmap); помог.

                                :)
                                Сообщение отредактировано: www -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0404 ]   [ 16 queries used ]   [ Generated: 28.03.24, 15:03 GMT ]