浙江财经大学
信工学院ACM集训队

[Win32]增强型元文件5(枚举元文件)

本文由 Ocrosoft 于 2018-06-14 23:08:41 发表

枚举元文件使用EnumEnhMetaFile,函数会将元文件的每个操作以及头记录、结束记录传递给回调函数,可以在回调函数中处理每个操作,不需要修改元文件,也不需要创建新的元文件

1.1.main.c

#define OEMRESOURCE
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

TCHAR szAppName[] = TEXT("EMF5");

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	HWND     hwnd;
	MSG      msg;
	WNDCLASS wndclass;

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("This program requires Windows NT!"),
			szAppName, MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName, TEXT("Enhanced Metafile Demo #5"),
		WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL);

	ShowWindow(hwnd, iCmdShow);
	UpdateWindow(hwnd);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

// *pEmfRecord, 描述元文件记录,->iType属性表示操作的类型,
// 绘制直线操作类型为EMR_LINETO,选择画笔画刷为EMR_SELECYOBJECT
// 可以用iType进行判断,从而不进行某些操作
// 其他的参数在下一个程序中介绍
int CALLBACK EnhMetaFileProc(HDC hdc, HANDLETABLE *pHandleTable, 
	CONST ENHMETARECORD *pEmfRecord, int iHandles, LPARAM pData)
{
	PlayEnhMetaFileRecord(hdc, pHandleTable, pEmfRecord, iHandles);

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	HENHMETAFILE hemf;
	PAINTSTRUCT ps;
	RECT rect;

	switch (message)
	{

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

		GetClientRect(hwnd, &rect);

		rect.left = rect.right / 4;
		rect.right = 3 * rect.right / 4;
		rect.top = rect.bottom / 4;
		rect.bottom = 3 * rect.bottom / 4;

		hemf = GetEnhMetaFile(TEXT("emf3.emf"));

		// EnumEngMetaFile(hdc, hmf, proc, param, *lprect)
		// 对于.emf文件中的每一部分,调用proc
		// proc: 回调
		// param: 传递给回调函数的参数
		// hdc, hemf, rect与PlayEngMetaFile相同
		EnumEnhMetaFile(hdc, hemf, EnhMetaFileProc, NULL, &rect);
		DeleteEnhMetaFile(hemf);

		EndPaint(hwnd, &ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

欢迎转载,请保留出处与链接。Ocrosoft » [Win32]增强型元文件5(枚举元文件)

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址