Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите правильно записать функцию FromHbitmap  (Прочитано 11529 раз)
0 Пользователей и 1 Гость смотрят эту тему.
onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« : 28-10-2016 06:29 » 


Всем привет!
Нашел в MSDN пример - ну прямо то,что нужно!
Начал набирать и проверять! Все вроде правильно!
Осталось всего несколько строк до конца И ВДРУГ ОДНА ИЗ СТРОК НЕ РАБОТАЕТ!!!
Работаю в Visual Studio 2013 (C++).



Пишется функция:
......
static HPALETTE Scene_Palette;

static System::Drawing::Image ^ CaptureScene(HDC hdcSrc, int iwidth, int iheight)
{ // hdcSrc - Хендел сцены, iwidth - ширина сцены, iheigh - высота сцены
 
   
HDC   hdcDest = CreateCompatibleDC(hdcSrc);                             
// Create compatible memory device context(DC)
   
HBITMAP hBitmap = CreateCompatibleBitmap(hdcSrc, iwidth,iheight);   
// Create compatible bitmap
   
HGDIOBJ hOld = SelectObject(hdcDest, hBitmap);
// Selects an object into the specified device context (DC)
// New object replaces the previous and has the same type

BitBlt(hdcDest, 0, 0, iwidth, iheight, hdcSrc, 0, 0, SRCCOPY);                 
// Copy from Scene into Compatible Bitmap

SelectObject(hdcDest, hOld);                                   
// Restore Selection

DeleteDC(hdcDest);
// Clear compatible memory device context(DC)

CreateLogicalPalette(hdcSrc);
System::Drawing::Image ^ SceneImage = Image.FromHbitmap(hBitmap,Scene_Palette);               
// Create .NET Image Object

DeleteObject(hBitmap);
// Free up the Compatible Bitmap object

return SceneImage;
// Return Image
}

static void CreateLogicalPalette(HDC hdc)
      {
         if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
         {
            UINT nSize = sizeof(LOGPALETTE)+(sizeof(PALETTEENTRY)* 256);
            LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
            pLP->palVersion = 0x300;
            pLP->palNumEntries =
               GetSystemPaletteEntries(hdc, 0, 255, pLP->palPalEntry);
            Scene_Palette = CreatePalette(pLP); // Create Logical Palette
            delete[] pLP;
         }
      }


Функцию Image.FromHbitmap пробовал писать в разных вариантах, c одним и двумя аргументами - ничего не помогает!
Ответы всегда похожие:
Error C2275: 'System::Drawing::Image' : illegal use of this type as an expression
Error C2228: left of '.FromHbitmap' must have class/struct/union

Помогите найти истину!

Regards,
Onic777
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 28-10-2016 08:03 » 

Цитата
Error C2228: left of '.FromHbitmap' must have class/struct/union

onic777, попробуй убрать циркумфлекс

Записан

onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« Ответ #2 : 28-10-2016 08:28 » 

Попробовал!

Цитата

     System::Drawing::Image SceneImage = Image.FromHbitmap(hBitmap);
     // Create .NET Image Object
     DeleteObject(hBitmap);
     // Free up the Compatible Bitmap object
     return SceneImage;
     // Return Image


Вывалилось еще куча ошибок!

error C3622: 'System::Drawing::Image': a class declared as 'abstract' cannot be instantiated   
error C2275: 'System::Drawing::Image' : illegal use of this type as an expression
error C2228: left of '.FromHbitmap' must have class/struct/union   
error C3767: 'System::Drawing::Image::Image': candidate function(s) not accessible
error C2440: 'return' : cannot convert from 'System::Drawing::Image' to 'System::Drawing::Image ^'

Onic777
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 28-10-2016 08:49 » 

я в шарпе вообще не силён. Но справочник
https://msdn.microsoft.com/en-us/library/k061we7x(v=vs.110).aspx
говорит, что возвращается объект
System.Drawing.Bitmap
https://msdn.microsoft.com/en-us/library/system.drawing.bitmap(v=vs.110).aspx

а вовсе не
System.Drawing.Image

причём, как я понимаю, Bitmap - потомок Image, так что тебе он подойдёт

(а Image и вовсе абстрактный)
Записан

onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« Ответ #4 : 28-10-2016 20:14 » 

Всем спасибо за помощь! Правильная запись:

static Bitmap^   My_Image;
         My_Image = System::Drawing::Image::FromHbitmap((IntPtr)hBitmap, (IntPtr)My_Palette);

Regards,
Onic777
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 29-10-2016 14:47 » 

Лёш, это не шарп, а С++, только тн CLI. Поэтому я тему в .NET перенёс.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 30-10-2016 13:09 » 

Джон, так ж не спорю, вызов винапи налицо )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines