如何获取元文件的句柄

physcis1988 2009-08-09 11:41:27
我在做用windowsAPI实现打印预览的相关程序,我在网上查到大多数程序的打印预览都是用如下的方法实现的:先在内存中用CreateMetaFile函数建立一个图元文件(metafile),该函数返回图元文件的hDC,然后通过Windows GDI函数向该文件输出文字和图形,最后在屏幕上使用PlayMetaFile函数显示该图元文件的内容,即可实现打印预览。
我在MSDN查到PlayMeteFiled的原型如下
BOOL PlayMetaFile(
HDC hdc, // handle to DC
HMETAFILE hmf // handle to metafile
);
我想知道如果我用以下语句创建了一个元文件
HDC hDc; //建立图元文件HDC
hDc=CreateMetaFile("file");
那么我该如何获取元文件的句柄,还有就是PlayMeteFile中的hdc就是CreateMetaFile返回的hdc吗?
...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paerxiushi 2009-08-09
  • 打赏
  • 举报
回复
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
static HMETAFILE hmf ;
static int cxClient, cyClient ;
HBRUSH hBrush ;
HDC hdc, hdcMeta ;
int x, y ;
PAINTSTRUCT ps ;

switch (message)
{
case WM_CREATE:
hdcMeta = CreateMetaFile (NULL) ;
hBrush = CreateSolidBrush (RGB (0, 0, 255)) ;
Rectangle (hdcMeta, 0, 0, 100, 100) ;

MoveToEx (hdcMeta, 0, 0, NULL) ;
LineTo (hdcMeta, 100, 100) ;
MoveToEx (hdcMeta, 0, 100, NULL) ;
LineTo (hdcMeta, 100, 0) ;

SelectObject (hdcMeta, hBrush) ;
Ellipse (hdcMeta, 20, 20, 80, 80) ;

hmf = CloseMetaFile (hdcMeta) ;

DeleteObject (hBrush) ;
return 0 ;

case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

SetMapMode (hdc, MM_ANISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;

for (x = 0 ; x < 10 ; x++)
for (y = 0 ; y < 10 ; y++)
{
SetWindowOrgEx (hdc, -100 * x, -100 * y, NULL) ;
PlayMetaFile (hdc, hmf) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
DeleteMetaFile (hmf) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
physcis1988 2009-08-09
  • 打赏
  • 举报
回复
楼上可以举一个简单的例子吗?
paerxiushi 2009-08-09
  • 打赏
  • 举报
回复
PlayMeteFile中的hdc就是CreateMetaFile返回的hdc吗?
---------------------------------------------------
不是的,一般来说PlayMetaFile中的hdc是指窗体设备环境HDC,而CreateMetaFile是指图元文件的设备环境HDC.
CreateMetaFile的使用过程一般是这样的:
1.调用CreateMetaFile(NULL),返回一个HDC,
2.利用HDC,并在它上面作图
3.完毕之后使用ClosMetaFile,这会返回一个HMETAFILE hemf.表示图元内容生成完毕。
4.在需要绘图的时候,得到窗体设备环境HDC hWndDC,然后调用
PlayEnhMetaFile (hWndDC, hemf, &rect) ;

具体背景知识与相关代码参见这里:
http://www.codeguru.cn/vc&mfc/WindowsProgramming/18.htm
paerxiushi 2009-08-09
  • 打赏
  • 举报
回复
你可以使用GetMetaFile函数来得到图元文件的句柄。但这个函数过时了,现在流行的是增强图元文件。
使用CreateEnhMetaFile来创建增强图元文件,或普通图元文件。使用GetEnhMetaFile得到增强图元文件的句柄
physcis1988 2009-08-09
  • 打赏
  • 举报
回复
自己顶一下,高手请进

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧