проблема с wmf
От: bugger Беларусь  
Дата: 22.05.02 13:25
Оценка:
добрый день.
у меня следующая проблема. есть wmf в clipbaord. мне нужно добавить к существующему рисунку ограничивающий прямоугольник и сохранить в файле. код есть, но чтото там не правильно. прямоугольник рисуется, но он закрывает собой весь рисунок. в результате получается сплошной белый прямоугольник.
подскажите пожалуйста решение.
спасибо.

if(OpenClipboard(NULL))
{
/*HGLOBAL*/HANDLE hGlobal=GetClipboardData(CF_METAFILEPICT);
if(hGlobal!=NULL)
{
IStream* istr=NULL;

METAFILEPICT FAR* lpPict;
lpPict=(METAFILEPICT FAR*)GlobalLock(hGlobal);


DWORD dwSize = GetMetaFileBitsEx(lpPict->hMF, 0 , NULL);

///////////////////////////////
HDC hMetaDC = CreateMetaFile(NULL);
SetMapMode(hMetaDC,MM_HIMETRIC);
CIGraftReportDlg* idlg=(CIGraftReportDlg*)AfxGetMainWnd();
CDC* dc=idlg->GetDC();
SIZE siz;
siz.cx=lpPict->xExt;
siz.cy=lpPict->yExt;
dc->HIMETRICtoLP(&siz);
SetWindowOrgEx(hMetaDC,0,0,NULL);
SetWindowExtEx(hMetaDC,siz.cx,siz.cy,NULL);


COLORREF darkgray = RGB(132,130,132); // dark gray
COLORREF black = RGB(0,0,0); // black
COLORREF lightgray = RGB(198,195,198); // lightgray
COLORREF white = RGB(255,255,255);
HBRUSH darkgraybrush = CreateSolidBrush(darkgray);
HBRUSH whitebrush = CreateSolidBrush(white);
HBRUSH lightgraybrush = CreateSolidBrush(lightgray);
HPEN blackpen = CreatePen(PS_NULL,1,black);

HGDIOBJ oldpen = SelectObject(hMetaDC,blackpen);

Rectangle(hMetaDC,0,0,siz.cx,siz.cy);


SelectObject(hMetaDC,oldpen);

POINT oldviewportorg;
SetViewportOrgEx(hMetaDC,0,0,&oldviewportorg);
SetWindowExtEx(hMetaDC,siz.cx,siz.cy,NULL);
DeleteObject(darkgraybrush);
DeleteObject(lightgraybrush);
DeleteObject(whitebrush);
DeleteObject(blackpen);

PlayMetaFile(hMetaDC,lpPict->hMF);
DeleteMetaFile(lpPict->hMF);
lpPict->hMF=CloseMetaFile(hMetaDC);

///////////////////////////////


LPVOID pvData=::VirtualAlloc(NULL,dwSize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
UINT ui=GetMetaFileBitsEx(lpPict->hMF,dwSize,pvData);
HGLOBAL hgl = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,0);
HRESULT hr = ::CreateStreamOnHGlobal(hgl,TRUE,&istr);
CPictureHolder pic;
pic.CreateFromMetafile(lpPict->hMF,lpPict->xExt,lpPict->yExt);

LONG s=0;
pic.m_pPict->SaveAsFile(istr,TRUE,&s);
pvData = GlobalLock(hgl);
CFile file;
if(file.Open("c:\\mywmf.wmf",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
{
file.Write(pvData,dwSize+22);
file.Close();
}
GlobalUnlock(hgl);
::VirtualFree(pvData,dwSize,MEM_DECOMMIT | MEM_RELEASE);
}

CloseClipboard();
}
Re: проблема с wmf
От: AlexRb  
Дата: 23.05.02 02:04
Оценка:
Здравствуйте bugger, Вы писали:

B>добрый день.

B>у меня следующая проблема. есть wmf в clipbaord. мне нужно добавить к существующему рисунку ограничивающий прямоугольник и сохранить в файле. код есть, но чтото там не правильно. прямоугольник рисуется, но он закрывает собой весь рисунок. в результате получается сплошной белый прямоугольник.
B>подскажите пожалуйста решение.
B>спасибо.

B> Rectangle(hMetaDC,0,0,siz.cx,siz.cy);


А если вместо Rectangle использовать:

int FrameRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);


The FrameRect function draws a border around the specified rectangle by using the specified brush. The width and height of the border are always one logical unit.

Если я правильно все понял...
Re[2]: проблема с wmf
От: bugger Беларусь  
Дата: 23.05.02 06:50
Оценка:
Здравствуйте AlexRb, Вы писали:

AR>Здравствуйте bugger, Вы писали:


B>>добрый день.

B>>у меня следующая проблема. есть wmf в clipbaord. мне нужно добавить к существующему рисунку ограничивающий прямоугольник и сохранить в файле. код есть, но чтото там не правильно. прямоугольник рисуется, но он закрывает собой весь рисунок. в результате получается сплошной белый прямоугольник.
B>>подскажите пожалуйста решение.
B>>спасибо.

B>> Rectangle(hMetaDC,0,0,siz.cx,siz.cy);


AR>А если вместо Rectangle использовать:


AR>
AR>int FrameRect(
AR>  HDC hDC,           // handle to DC
AR>  CONST RECT *lprc,  // rectangle
AR>  HBRUSH hbr         // handle to brush
AR>);
AR>


AR>The FrameRect function draws a border around the specified rectangle by using the specified brush. The width and height of the border are always one logical unit.


AR>Если я правильно все понял...


мне кажется, что проблема немного не в том. я опробовал предложенный вами спосоп. результат то же. то есть белый прямоугольник накладывается на существующий рисунок. мне кажется, что проблему нужно решать по другому. нужно нарисовать прозрачный прямоугольник, но с непрозрачными ограничивающими линиями.
думаю, решение очень простое. но вот только я не нашел, как рисуовать именно прозрачный прямоугольник.
простите за глупость)
Re: проблема с wmf
От: sealg Россия  
Дата: 23.05.02 07:18
Оценка:
Здравствуйте bugger, Вы писали:

B>добрый день.

B>у меня следующая проблема. есть wmf в clipbaord. мне нужно добавить к существующему рисунку ограничивающий прямоугольник и сохранить в файле. код есть, но чтото там не правильно. прямоугольник рисуется, но он закрывает собой весь рисунок. в результате получается сплошной белый прямоугольник.
B>подскажите пожалуйста решение.
B>спасибо.

...

B> COLORREF white = RGB(255,255,255);


remove> HBRUSH darkgraybrush = CreateSolidBrush(darkgray);
remove> HBRUSH whitebrush = CreateSolidBrush(white);
remove> HBRUSH lightgraybrush = CreateSolidBrush(lightgray);
add> HBRUSH nullbrush = GetStockObject(HOLLOW_BRUSH);

B> HPEN blackpen = CreatePen(PS_NULL,1,black);
B>
B> HGDIOBJ oldpen = SelectObject(hMetaDC,blackpen);

add> HGDIOBJ oldbrush = SelectObject(hMetaDC,nullbrush);

B>
B> Rectangle(hMetaDC,0,0,siz.cx,siz.cy);
B>
B> SelectObject(hMetaDC,oldpen);

add> SelectObject(hMetaDC,oldbrush);

B> POINT oldviewportorg;
B> SetViewportOrgEx(hMetaDC,0,0,&oldviewportorg);
B> SetWindowExtEx(hMetaDC,siz.cx,siz.cy,NULL);

remove> DeleteObject(darkgraybrush);
remove> DeleteObject(lightgraybrush);
remove> DeleteObject(whitebrush);

B> DeleteObject(blackpen);

...


ЗЫ: И кстати, какое отношение к MFC имеет работа с метафайлами и clipboard'ом ?
Опыт позволяет нам ошибаться гораздо увереннее...
Re[2]: проблема с wmf
От: bugger Беларусь  
Дата: 23.05.02 08:11
Оценка:
Здравствуйте sealg, Вы писали:



B>> COLORREF white = RGB(255,255,255);

S>
remove>> HBRUSH darkgraybrush = CreateSolidBrush(darkgray);
remove>> HBRUSH whitebrush = CreateSolidBrush(white);
remove>> HBRUSH lightgraybrush = CreateSolidBrush(lightgray);
add>> HBRUSH nullbrush = GetStockObject(HOLLOW_BRUSH);
S>

B>> HPEN blackpen = CreatePen(PS_NULL,1,black);
B>>
B>> HGDIOBJ oldpen = SelectObject(hMetaDC,blackpen);
S>
add>> HGDIOBJ oldbrush = SelectObject(hMetaDC,nullbrush);
S>

B>>
B>> Rectangle(hMetaDC,0,0,siz.cx,siz.cy);
B>>
B>> SelectObject(hMetaDC,oldpen);
S>
add>> SelectObject(hMetaDC,oldbrush);
S>

B>> POINT oldviewportorg;
B>> SetViewportOrgEx(hMetaDC,0,0,&oldviewportorg);
B>> SetWindowExtEx(hMetaDC,siz.cx,siz.cy,NULL);
S>
remove>> DeleteObject(darkgraybrush);
remove>> DeleteObject(lightgraybrush);
remove>> DeleteObject(whitebrush);
S>

B>> DeleteObject(blackpen);

S>...



S>ЗЫ: И кстати, какое отношение к MFC имеет работа с метафайлами и clipboard'ом ?


сделал именно так, как вы писали. но все равно пока что по старому. но я еще проверю. идея как бы понятна.

зачем это нужно? очень просто. просто я пишу программу, которая вытягивает проекты из FlowCharter. в частности картинки оттуда. картинки вытягиваю через буфер и сохраняю в файле. но картинки должны быть ограничены прямоугольником. вот и причина моего вопроса. готовая картинка хранится в буфере. сохранять в файле я уже умею. но вот нужно еще ограничить ее прямоугольником. но у меня получается так, что он лежит сверху картинки и закрывает ее.
Re: проблема с wmf
От: Patalog Россия  
Дата: 23.05.02 10:31
Оценка:
Здравствуйте bugger, Вы писали:

B>добрый день.

B>у меня следующая проблема. есть wmf в clipbaord. мне нужно добавить к существующему рисунку ограничивающий прямоугольник и сохранить в файле. код есть, но чтото там не правильно. прямоугольник рисуется, но он закрывает собой весь рисунок. в результате получается сплошной белый прямоугольник.
B>подскажите пожалуйста решение.
B>спасибо.

А ежели в hMetaDC подсунить Null brush? Типа SelectObject(hMetaDC, GetStockObject(NULL_BRUSH)). А потом уже и Rectangle...
Почетный кавалер ордена Совка.
Re[2]: проблема с wmf
От: bugger Беларусь  
Дата: 24.05.02 06:00
Оценка:
Здравствуйте Patalog, Вы писали:



P>А ежели в hMetaDC подсунить Null brush? Типа SelectObject(hMetaDC, GetStockObject(NULL_BRUSH)). А потом уже и Rectangle...


это все было опробовано. ничего не помогает.
пока что я пришел к такому выводу, почему проблема.
мне кажется, что этот прямоугольник я пробую рисовать в clipboarde. ведь wmf находится именно так. мне кжется, что сначала нужно эту картинку скопировать в память и там уже рисовать. а потом все хранить в файл.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.