⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvlist.c

📁 傅立叶变换和小波变换是图像压缩的重要工具。该代大戏是利用小波变换进行图像压缩。
💻 C
字号:
//#define	WIN32_LEAN_AND_MEAN
#include	<windows.h>
#include	<stdio.h> // for sprintf
#include	<stdlib.h>
#include	<assert.h>

#include	"driver.h"
#include	"drvlist_rc.h"
#include	"drvlist.h"

typedef	struct	DriverInfo
{
	int		diDriver;
	char	diDriverName[256];
	int		diMode;
	char	diModeName[256];
	int		w,h;
	struct	DriverInfo * diNext;
}	DriverInfo;

static	DriverInfo * Enum_drvlist;
static int PickedDriver;
static int PickedMode;

static int Enum_CurDriver;
static char * Enum_CurDriverName;
static int Enum_SeekMinW,Enum_SeekMinH;
static int Enum_SeekMaxW,Enum_SeekMaxH;

static	void	Destroydrvlist(DriverInfo *dlist)
{
	DriverInfo *	temp;

	while	(dlist)
	{
		temp = dlist->diNext;
		free(dlist);
		dlist = temp;
	}
}

bool Builddrvlist_ModeCB(int Mode, char *ModeName, int Width,int Height,int BPP, void *Context)
{
	OutputDebugString(Enum_CurDriverName);
	OutputDebugString(" : ");
	OutputDebugString(ModeName);
	OutputDebugString("\r\n");

	if ( Width >= Enum_SeekMinW && Width <= Enum_SeekMaxW &&
		 Height>= Enum_SeekMinH && Height<= Enum_SeekMaxH )
	{
	DriverInfo * dinfo;
		dinfo = malloc(sizeof(*dinfo));
		if	(!dinfo)
		{
			return false;
		}
		dinfo->diNext = Enum_drvlist;
		Enum_drvlist = dinfo;

		dinfo->diDriver = Enum_CurDriver;
		dinfo->diMode = Mode;
		strcpy(dinfo->diDriverName,Enum_CurDriverName);
		strcpy(dinfo->diModeName,ModeName);

		dinfo->w = Width;
		dinfo->h = Height;
	}

return true;
}

bool Builddrvlist_CB(int Driver, char *DriverName, void *Context)
{

	Enum_CurDriver = Driver;
	Enum_CurDriverName = DriverName;

	return SoftDriver_EnumModes(Driver,DriverName,Builddrvlist_ModeCB,NULL);
}

static DriverInfo *Builddrvlist(void)
{
	Enum_drvlist = NULL;

	SoftDriver_EnumSubDrivers(Builddrvlist_CB,NULL);

	return Enum_drvlist;
}

static	BOOL	CALLBACK	DlgProc(HWND hwndDlg, uint uMsg, WPARAM wParam, LPARAM lParam)
{
	static	DriverInfo *	drvlist;

	switch	(uMsg)
	{
	case	WM_INITDIALOG:
		drvlist = (DriverInfo *)lParam;
		if	(drvlist)
		{
			DriverInfo *	temp;
			HWND			drvlistBox;
			HDC				hDC;
			int				MaxCX;

			drvlistBox = GetDlgItem(hwndDlg, IDC_DRIVERLIST);
			hDC = GetDC(drvlistBox);

			MaxCX = 0;

			temp = drvlist;
			while	(temp)
			{
				char			buff[256];
				SIZE			extents;
				
				sprintf(buff, "%s %s", temp->diDriverName, temp->diModeName);
				SendDlgItemMessage(hwndDlg, IDC_DRIVERLIST, LB_ADDSTRING, (WPARAM)0, (LPARAM)buff);
				GetTextExtentPoint(hDC, buff, strlen(buff), &extents);
				if	(extents.cx > MaxCX)
					MaxCX = extents.cx;
				temp = temp->diNext;
			}

			SendDlgItemMessage(hwndDlg, IDC_DRIVERLIST, LB_SETCURSEL, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hwndDlg, IDC_DRIVERLIST, LB_SETHORIZONTALEXTENT, (WPARAM)MaxCX, (LPARAM)0);

			ReleaseDC(drvlistBox, hDC);

			return TRUE;
		}
		break;

	case	WM_COMMAND:
		if	(LOWORD(wParam) == IDOK)
		{
			int		DriverIdx;

			if	(drvlist)
			{
				DriverInfo *	Temp;
				DriverIdx = SendDlgItemMessage(hwndDlg, IDC_DRIVERLIST, LB_GETCURSEL, (WPARAM)0, (LPARAM)0);
//				SetDefaultDriver(drvlist, DriverIdx);
				Temp = drvlist;
				while	(DriverIdx--)
				{
					Temp = Temp->diNext;
					assert(Temp != NULL);
				}
				PickedDriver = Temp->diDriver;
				PickedMode = Temp->diMode;
			}
			EndDialog(hwndDlg, 1);
		}
		if	(LOWORD(wParam) == IDCANCEL)
			EndDialog(hwndDlg, 0);
		break;
	}

	return 0;
}

bool drvlist_PickDriver_Closest(HANDLE hInstance, HWND hwnd, int SeekW, int SeekH)
{
DriverInfo *drvlist,*drv;
int			 PickedW,res;

	PickedDriver = 0;
	PickedMode = 0;

	Enum_SeekMinW = SeekW;
	Enum_SeekMinH = SeekH;
	Enum_SeekMaxW = 999999;
	Enum_SeekMaxH = 999999;

	drvlist = Builddrvlist();

	res = 0;
	PickedW = 999999999;

	for(drv = drvlist;drv;drv = drv->diNext)
	{
		if ( drv->w < PickedW )
		{
			PickedDriver = drv->diDriver;
			PickedMode = drv->diMode;
			PickedW = drv->w;
			res = 1;
		}
	}

	if ( drvlist )
		Destroydrvlist(drvlist);

	if ( ! res )
		return false;

return SoftDriver_Init(PickedDriver,PickedMode,hwnd);
}

bool drvlist_PickDriver_Range(HANDLE hInstance, HWND hwnd, int SeekMinW, int SeekMinH, int SeekMaxW, int SeekMaxH)
{
DriverInfo * drvlist;
int			 res;

	PickedDriver = 0;
	PickedMode = 0;

	if ( SeekMaxW < SeekMinW ) SeekMaxW = 999999;
	if ( SeekMaxH < SeekMinH ) SeekMaxH = 999999;

	Enum_SeekMinW = SeekMinW;
	Enum_SeekMinH = SeekMinH;
	Enum_SeekMaxW = SeekMaxW;
	Enum_SeekMaxH = SeekMaxH;

	drvlist = Builddrvlist();

	if ( drvlist == NULL ) 
	{
		return false;
	}
	else if ( drvlist->diNext == NULL )
	{
		PickedDriver = drvlist->diDriver;
		PickedMode = drvlist->diMode;

		Destroydrvlist(drvlist);
	}
	else
	{

		res = DialogBoxParam(hInstance,
							 MAKEINTRESOURCE(IDD_DRIVERDIALOG),
							 hwnd,
							 DlgProc,
							 (LPARAM)drvlist);

		Destroydrvlist(drvlist);

		if ( res != 1)
			return false;
	}

return SoftDriver_Init(PickedDriver,PickedMode,hwnd);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -