На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Поместить изображение в CStatic
    Сейчас у меня изображение рисуется как-бы поверх статика. Как рисовать в нем?
    SetBitmap не подходит, т.к. нет изменения размеров изображения под контрол.


    ExpandedWrap disabled
      BOOL CFileMappingDlg::OnInitDialog()
      {
          CDialog::OnInitDialog();
       
          // Set the icon for this dialog.  The framework does this automatically
          //  when the application's main window is not a dialog
          SetIcon(m_hIcon, TRUE);         // Set big icon
          SetIcon(m_hIcon, FALSE);        // Set small icon
       
          // TODO: Add extra initialization here
          myStatic.Create(NULL, WS_BORDER|WS_CHILD|WS_VISIBLE|SS_BITMAP|
              SS_CENTERIMAGE, CRect(10,10,250,250),  this, 11001);
       
          return TRUE;  // return TRUE  unless you set the focus to a control
      }
       
       
      void CFileMappingDlg::DrawImage(CPaintDC* dc)
      {
       
           // Получить область рисования
        CRect rClientRect;
        myStatic.GetClientRect(rClientRect);
        //GetClientRect(rClientRect);
        rClientRect.NormalizeRect();
        
        // Параметры рисования
        //const int iDisp = 1;// Отступы от краев клиентской области
        int iWidth = rClientRect.Width() - 2/* * iDisp*/; // Ширина области рисования
        int iHeight = rClientRect.Height() - 2/* * iDisp*/; // Высота области рисования
       
       
           HBITMAP hbitmap =
            (HBITMAP) ::LoadImage(AfxGetInstanceHandle(),
            "c:\\1.bmp", IMAGE_BITMAP, 0, 0,
                       LR_LOADFROMFILE | LR_CREATEDIBSECTION);
          //myStatic.SetBitmap( hbitmap );
          
          if(hbitmap){// Файл успешно загружен
            // Создаем экземпляр класса CBitmap
            CBitmap m_Bitmap;
            // Прикрепляем загруженный рисунок к объекту класса
            m_Bitmap.Attach(hbitmap);
            // Создать родную структуру для объекта класса CBitmap
            BITMAP bm;
            // Перекачать загруженное в структуру HBITMAP изображение
            // в родную для объекта m_Bitmap структуру BITMAP
            m_Bitmap.GetBitmap(&bm);
            // Создать совместимый контекст устройства в памяти
            // по переданному в функцию параметру CPaintDC* dc
            CDC dcMem;
            dcMem.CreateCompatibleDC(dc);
            // Поместить растровое изображение в dc памяти
            dcMem.SelectObject(m_Bitmap); // Может адрес?
            // Копировать и изменить размеры точечного
            // рисунка по диалоговому окну холста
            dc->StretchBlt(rClientRect.top, rClientRect.left, iWidth, iHeight,// Приемник: dc экрана
              &dcMem, 0, 0, bm.bmWidth, bm.bmHeight,// Источник: dc памяти
              SRCCOPY);
          }
      }
      // If you add a minimize button to your dialog, you will need the code below
      //  to draw the icon.  For MFC applications using the document/view model,
      //  this is automatically done for you by the framework.
       
      void CFileMappingDlg::OnPaint()
      {
          CPaintDC dc(this); // Локальный контекст устройства
          DrawImage(&dc);
      }


    И еще, при переносе функции LoadImage в OnInitDialog, загрузка происходит, но при перетаскивании окна картинка пропадает.
    Сообщение отредактировано: TechnoMag -
      1. добавь переменную типа CStatic при помощи визарда на диалоге
      унаследуйся от CStatic и перегрузи там OnPaint
      замени тип переменной со CStatic на производный класс.
      После этого у тебя будет отдельный класс, отвечающий за работу статика


      Цитата TechnoMag @
      И еще, при переносе функции LoadImage в OnInitDialog, загрузка происходит, но при перетаскивании окна картинка пропадает.


      Цитата TechnoMag @
      ExpandedWrap disabled
        m_Bitmap.Attach(hbitmap);

      деструктор заберет с собой хендл в небытие, то есть вызовет DeleteObject
      нужно после окончания использования вызывать Detach, либо Attach сделать единожды после LoadImage
        По первому пункту ничего не понял.
        - не могу добавить переменную типа CStatic при помощи визарда. В нем есть только стандартные типы. VS 2008
        - "замени тип переменной со CStatic на производный класс" ??
        - разве у статика есть OnPaint?
        подробней пожалуйста объясните.

        У меня щас получается, что при перемещении окна все контролы в нем затираются.
        Прикреплённый файлПрикреплённый файлFileMapping1.zip (44,72 Кбайт, скачиваний: 132)
        Сообщение отредактировано: TechnoMag -
          Цитата TechnoMag @
          - не могу добавить переменную типа CStatic при помощи визарда. В нем есть только стандартные типы. VS 2008

          в редакторе ресурсов на диалог бросаешь статик, даешь ему идентификатор. Затем правой кнопкой по этому статику и Add Variable, там поставишь галочку на Control Variable, введешь название и выберешь тип.
          Если вручную, то идешь в класс диалога и в функции DoDataExchange производишь связывание переменной контрола с самим контролом на статике при помощи макроса DDX_Control

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

          Цитата TechnoMag @
          - разве у статика есть OnPaint?

          зачем спрашивать, если ты уже попробовал? OnPaint это обработчик сообщения WM_PAINT, которое есть у всех окон.

          Цитата TechnoMag @
          У меня щас получается, что при перемещении окна все контролы в нем затираются.

          сделай все правильно со статиком и будет все нормально. только проследи за hbitmap. мало того что нужно делать detach, так у тебя еще есть SelectObject, а то что выбираешь в контекст, нужно возвращать назад по завершению OnPaint...
            Вы меня запутали. Сначала вы говорите о переменной, потом откуда-то появляется производный класс.

            Цитата
            в редакторе ресурсов на диалог бросаешь статик, даешь ему идентификатор. Затем правой кнопкой по этому статику и Add Variable, там поставишь галочку на Control Variable, введешь название и выберешь тип.


            Переменную создал, но как тогда создать отдельный класс? И нужен ли он вообще?

            Цитата
            После этого у тебя будет отдельный класс, отвечающий за работу статика


            Я так понимаю должны быть файлы mystatic.cpp и mystatic.h как в первом атаче, но я это делал через AddClass, потом вручную сделал класс членом диалога. И динамически создал статик производного класса.

            И рисовать битмап нужно в OnPaint производного класса или в OnPaint диалога все-таки?
              Цитата TechnoMag @
              Переменную создал, но как тогда создать отдельный класс? И нужен ли он вообще?

              ну ты же хотел в статике рисовать... поэтому нужен.
              отдельный класс создаётся отдельной операцией и с созданием переменной не имеет ничего общего. Только нужно у конечной переменной в конце заменить CStatic на свой класс. это у тебя тоже сделано было


              Цитата TechnoMag @
              Я так понимаю должны быть файлы mystatic.cpp и mystatic.h как в первом атаче, но я это делал через AddClass, потом вручную сделал класс членом диалога. И динамически создал статик производного класса.

              да я видел как ты сделал. класс создал, и статик динамический. А я объяснял как его привязать к ресурсу диалога.


              Цитата TechnoMag @
              И рисовать битмап нужно в OnPaint производного класса или в OnPaint диалога все-таки?

              в OnPaint производного класса, ибо нафига эти танцы вообще нужны были ....


              Цитата TechnoMag @
              Вы меня запутали. Сначала вы говорите о переменной, потом откуда-то появляется производный класс.

              на форуме я про это объяснял уже с десяток раз и обычно никто не путался...
              Сообщение отредактировано: ElcnU -
                В общем отобразить битмап в статике получилось. Вы говорили, что нужно освободить контекст устройства после рисования, кроме этих операций

                ExpandedWrap disabled
                          m_Bitmap.Detach();
                      dcMem->DeleteDC();
                      dc->DeleteDC();


                нужно еще что-то делать? Связанное с SelectObject ...
                  Цитата TechnoMag @
                  В общем отобразить битмап в статике получилось. Вы говорили, что нужно освободить контекст устройства после рисования, кроме этих операций

                  я не говорил про освобождение контекста...
                  почитай Рисование в DC, будет полезней, чем я буду каждое недопонимание пытаться объяснить
                  Сообщение отредактировано: ElcnU -
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0376 ]   [ 17 queries used ]   [ Generated: 14.05.24, 19:00 GMT ]