добрый день.
у меня следующая проблема. есть 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();
}
Здравствуйте 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.
Если я правильно все понял...
Здравствуйте 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>Если я правильно все понял...
мне кажется, что проблема немного не в том. я опробовал предложенный вами спосоп. результат то же. то есть белый прямоугольник накладывается на существующий рисунок. мне кажется, что проблему нужно решать по другому. нужно нарисовать прозрачный прямоугольник, но с непрозрачными ограничивающими линиями.
думаю, решение очень простое. но вот только я не нашел, как рисуовать именно прозрачный прямоугольник.
простите за глупость)