📄 drvlist.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 + -