2014-09-26 2 views
1

У меня возникла проблема с масштабированием изображения, отображаемого в кадре Picture Control. Ожидаемый результат аналогичен следующей ссылке: A scrollable, zoomable, and scalable picture box. Изображение увеличено в пределах рамки изображения. Обратите внимание, что картинка увеличена.Увеличьте изображение на картинке Visual Studio C++

Однако это может быть реализовано в .NET Framework 2.0. Я искал некоторую информацию в Интернете, но ни один из них не использовал C/C++ Windows API Visual Studio. Как я могу увеличить изображение в окне изображения Picture Control, когда я работаю над Windows Forms Visual Studio C++ 2010. Спасибо за любой ответ.

+0

Можете ли вы уточнить, что вы имеете в виду "увеличить изображение внутри изображения коробки"? Вы имеете в виду рисование части изображения в статическом контроле? И, говоря «работа над Windows Forms VS C++ 2010», вы имеете в виду использование управляемого C# кода в C++? – elimad

+0

Я хочу уменьшить локальную часть изображения и показать на картинке. Кроме того, я могу использовать мышь для перемещения области видимости в окне изображения. Этот эффект подобен микроскопу. И я не использую управляемый C#. Спасибо. – Kuo

+0

Хорошо, это понятно, по крайней мере, мы полностью в мире winapi.И, вероятно, в окне изображения вы подразумеваете статический контроль в диалоговом окне. Не так ли? Было бы легко, если бы вы могли поделиться каким-то кодом, а не обязательно всем источником. – elimad

ответ

0

Без какого-либо исходного кода сложно комментировать. StackOverflow предназначен для решения проблем; мы можем устранить ваш исходный код и заставить его работать, и в ходе которого мы также можем точно настроить дизайн.

Во всяком случае, я хотел бы дать некоторые указатели:

  1. Один или два ящика изображения: целиком и полностью зависит от ваших требований UI.
  2. Отображая полную или частичную область изображения: StretchBlt - это мощный API , который может быть использован для достижения. См. MSDN documentation.
  3. Какой класс использовать для рамки изображения: если используется MFC, то выведите класс из CStatic, перегрузите OnPaint() и используйте StretchBlt для рисования изображения.
  4. Классы, используемые для изображения: CBitmap, CImage, Gdiplus::Image.
    У каждого есть свои плюсы и минусы.
    Если прозрачные изображения/PNG должны быть обработаны, лучше пойдите для Gdiplus::Image. Вы можете получить достаточно информации здесь:
    CBitmap
    CImage
    Gdiplus::Image

Надеется, что это даст вам некоторый стартер.

+0

Большое спасибо за ваш общий. Я нашел метод. Я поместил PictureBox в Panel, который похож на контейнер. Я могу увеличить PictureBox внутри этой панели и не выходить за рамки окна. – Kuo

+0

рад помочь. Закройте вопрос, если проблема решена путем маркировки в качестве ответа. в противном случае, пожалуйста, дайте мне знать, чтобы я мог улучшить ответ. – elimad

3

У меня возникла одна и та же проблема, и я много искал, но не получил решение в cpp (свободно доступно в C# и VB). Итак, наконец, я решил реализовать его самостоятельно. Если размер вашего изображения больше, чем размер изображения, то только 1 уровень масштабирования (оригинальный размер изображения) вы можете сделать с моей реализацией. Я поможем вам в реализации. В текущей реализации , если вы нажмете левую кнопку мыши, будет ZoomIn и , если вы сделаете правый щелчок мышью, будет ZoomOut.

Предполагая, что вы прочитали файл изображения (.png, .jpg, .bmp, ...) в bmpPicture.

Bitmap^bmpPicture = gcnew Bitmap (strFilename); // если не может помочь

 private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { 

    MouseEventArgs ^ms = (MouseEventArgs^)e; 

          if (ms->Button == System::Windows::Forms::MouseButtons::Left) 
          { 
           int pbx = ms->X; 
           int pby = ms->Y; 

           int img_x = (pbx * mwidth/pbwidth * 1.0f); 
           int img_y = (pby * mheight/pbheight * 1.0f); 

           pictureBox1->Location = System::Drawing::Point(pbx - img_x, pby - img_y); 
           pictureBox1->SizeMode = PictureBoxSizeMode::AutoSize; 
           pictureBox1->Image = bmpPicture; 
    } 
    else if(ms->Button == System::Windows::Forms::MouseButtons::Right) 
    { 

           int pbx = ms->X; 
           int pby = ms->Y; 

           pictureBox1->Location = System::Drawing::Point(0, 0); 
           pictureBox1->SizeMode = PictureBoxSizeMode::StretchImage; 
           pictureBox1->Image = bmpPicture; 

    } 
    } 

    Hope this will help you... 
Смежные вопросы