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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: API+GDI+WTL(EnhMetaFile)  (Прочитано 8277 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FantomCat
Гость
« : 30-08-2003 13:37 » 

Здравствуйте!
У меня очередная трабла. Ничего не сохраняется в файл *.emf, точнее
сохраняется только пустой прямоугольник.
хотя кусок кода практически содран из МСДНа. Плз, хелп.
Напишите мне, что тут не так.
LRESULT OnSaveGraph(WORD,WORD,HWND,BOOL&)
   {
      if(!m_view1.m_hWnd)
      {
         ::MessageBox(0,"График не построен!","Внимание",MB_ICONEXCLAMATION);
         return 0;
      }
      HDC hdc = ::GetDC(m_view1.m_hWnd),hdc_meta;
      int iWidthMM = ::GetDeviceCaps(hdc, HORZSIZE);
      int iHeightMM = ::GetDeviceCaps(hdc, VERTSIZE);
      int iWidthPels = ::GetDeviceCaps(hdc, HORZRES);
      int iHeightPels = ::GetDeviceCaps(hdc, VERTRES);
      
      RECT rect;
      ::GetWindowRect(m_view1.m_hWnd, &rect);
      rect.left = (rect.left * iWidthMM * 100)/iWidthPels;
      rect.top = (rect.top * iHeightMM * 100)/iHeightPels;
      rect.right = (rect.right * iWidthMM * 100)/iWidthPels;
      rect.bottom = (rect.bottom * iHeightMM * 100)/iHeightPels;
      ::SaveDC(hdc);
      hdc_meta = CreateEnhMetaFile(hdc, "gr1.emf", &rect, 0);
      if(!hdc_meta)
         ::MessageBox(0,"couldn't save file!",0,0);
      ::CloseEnhMetaFile(hdc_meta);
      ::ReleaseDC(m_view1.m_hWnd,hdc);
      return 0;
   }
а размеры прямоугольника те, что надо получаются.
Записан
FantomCat
Гость
« Ответ #1 : 30-08-2003 14:38 » 

Все, всем теоретически спасибо. Проблема решена. Хоть и левым путем с заметным изменением кода, зато все работает, не нарушая "золотого" правила программиста Круто!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 30-08-2003 17:09 » 

А как собственно, а то тут народу в выходные мало - не все с дома гуляют - расскажи в чем была проблема, и ак решил?
Записан

А птичку нашу прошу не обижать!!!
FantomCat
Гость
« Ответ #3 : 01-09-2003 05:23 » new

КО. Расскажу. Только несколько маленьких поправочек:
- в чем именно была трабла, так и неизвестно;
- гуляю не с дома, а с работы;
- и последнее, не рашил, а решила   Вот такой я вот  Круто!
а теперь, кусок кода, как это все стало выглядеть

LRESULT OnSaveGraph(WORD,WORD,HWND,BOOL&)
   {
      //окно сохранения файла
      OPENFILENAME ofn;       // common dialog box structure
      char szFile[260];       // buffer for file name
      strcpy(szFile," ");

      // Initialize OPENFILENAME
      ZeroMemory(&ofn, sizeof(OPENFILENAME));
      ofn.lStructSize = sizeof(OPENFILENAME);
      ofn.hwndOwner = m_hWnd;
      ofn.lpstrFile = szFile;
      ofn.nMaxFile = sizeof(szFile);
      ofn.lpstrFilter = "Графические файлы(*.emf)\0*.emf\0";
      ofn.nFilterIndex = 1;
      ofn.lpstrFileTitle = NULL;
      ofn.nMaxFileTitle = 0;
      ofn.lpstrInitialDir = NULL;
      ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
      if(::GetSaveFileName(&ofn)!= TRUE)
         return 0;
      strcpy(szFile,ofn.lpstrFile);
      strcat(szFile,".emf");

      ////////////////////////
      HDC hdc = ::GetDC(0),hdc_meta;
      int iWidthMM = ::GetDeviceCaps(hdc, HORZSIZE);
      int iHeightMM = ::GetDeviceCaps(hdc, VERTSIZE);
      int iWidthPels = ::GetDeviceCaps(hdc, HORZRES);
      int iHeightPels = ::GetDeviceCaps(hdc, VERTRES);
      
      RECT rect;
      ::GetClientRect(m_view1.m_hWnd, &rect);
      rect.left = (rect.left * iWidthMM * 100)/iWidthPels;
      rect.top = (rect.top * iHeightMM * 100)/iHeightPels;
      rect.right = (rect.right * iWidthMM * 100)/iWidthPels;
      rect.bottom = (rect.bottom * iHeightMM * 100)/iHeightPels;

      hdc_meta = CreateEnhMetaFile(hdc, szFile, &rect, 0);
      if(!hdc_meta)
         ::MessageBox(0,"couldn't save file!",0,0);
      ::ReleaseDC(0,hdc);
      CDCHandle cdc(hdc_meta);
      m_view1.SaveToEMF(cdc);
      ::DeleteEnhMetaFile(::CloseEnhMetaFile(hdc_meta));      
      return 0;
   }
Вот так. А в функции m_view1.SaveToEMF(cdc) в эту DC-шку рисуется все, что мне надо. Может это и некрасивое решение, зато все отличненько работает! Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines