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

📄 devpage.cpp

📁 Windows 图形编程 书籍
💻 CPP
字号:
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : devpage.cpp			                                             //
//  Description: KDevicePage class                                                   //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define STRICT
#define NOCRYPT
#define WINVER       0x0500

#include <windows.h>
#include <tchar.h>

#include "resource.h"

#include "..\\..\\include\\property.h"
#include "..\\..\\include\\listview.h"

#include "DevPage.h"
#include "DevCaps.h"
#include "DCAttr.h"

void AddDisplayDevices(HWND hList)
{
	DISPLAY_DEVICE Dev;

	Dev.cb = sizeof(Dev);

	SendMessage(hList, CB_RESETCONTENT, 0, 0);

	for (unsigned i=0; 
	     EnumDisplayDevices(NULL, i, & Dev, 0);
		 i++ )
		SendMessage(hList, CB_ADDSTRING, 0, (LPARAM) Dev.DeviceName);

 	SendMessage(hList, CB_SETCURSEL, 0, 0);
}


int FrameBufferSize(int width, int height, int bpp)
{
	int bytepp = ( bpp + 7 ) / 8;	             // bytes per pixel
	int byteps = ( width * bytepp + 3 ) / 4 * 4; // bytes per scanline

	return height * byteps;						 // bytes per frame buffer
}


void AddDisplaySettings(HWND hList, LPCTSTR pszDeviceName)
{
	DEVMODE  dm;

	dm.dmSize		 = sizeof(DEVMODE);
	dm.dmDriverExtra = 0;

	SendMessage(hList, LB_RESETCONTENT, 0, 0);

	for (unsigned i=0;
	     EnumDisplaySettings(pszDeviceName, i, & dm);
		 i++ )
	{
		TCHAR szTemp[MAX_PATH];

		wsprintf(szTemp, _T("%d by %d, %d bits, %d Hz, %d Kb"), 
			dm.dmPelsWidth, 
			dm.dmPelsHeight, 
			dm.dmBitsPerPel,
			dm.dmDisplayFrequency,
			FrameBufferSize(dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel) / 1024
			);

		SendMessage(hList, LB_ADDSTRING, 0, (LPARAM) szTemp);
	}
}


BOOL KDevicePage::OnInitDialog(HWND hWnd)
{
	AddDisplayDevices(GetDlgItem(hWnd, IDC_DEVICE));

	OnDeviceChange(hWnd);

    return TRUE;
}


BOOL KDevicePage::OnDeviceChange(HWND hWnd)
{
	TCHAR szDeviceName[MAX_PATH];

	GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);
	
	{
		unsigned iDevNum = 0; 
		DISPLAY_DEVICE Device;

		Device.cb = sizeof(Device);

		while ( EnumDisplayDevices(NULL, iDevNum, & Device, 0) )
			if ( _tcscmp(szDeviceName, Device.DeviceName)==0 )
				break;
			else
				iDevNum ++;

		SetDlgItemText(hWnd, IDC_DEVICESTRING, Device.DeviceString);
		SetDlgItemText(hWnd, IDC_DEVICEID,     Device.DeviceID);
		SetDlgItemText(hWnd, IDC_DEVICEKEY,    Device.DeviceKey);

		SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_RESETCONTENT, 0, 0);
					
		if ( Device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "ATTACHED_TO_DESKTOP");

		if ( Device.StateFlags & DISPLAY_DEVICE_MULTI_DRIVER )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MULTI_DRIVER");

		if ( Device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "PRIMARY_DEVICE");

		if ( Device.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MIRRORING_DRIVER");

		if ( Device.StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "VGA_COMPATIBLE");

		if ( Device.StateFlags & DISPLAY_DEVICE_MODESPRUNED )
			SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MODESPRUNED");

		SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_SETCURSEL, 0, 0);
	}

	AddDisplaySettings(GetDlgItem(hWnd, IDC_MODES), szDeviceName);

	return TRUE;
}



BOOL KDevicePage::OnDeviceCaps(HWND hWnd)
{
	TCHAR szDeviceName[MAX_PATH];

	GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);

	HDC hDC = CreateDC(_T("DISPLAY"), szDeviceName, NULL, NULL);

	KDeviceCaps caps(hDC);

	caps.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DEVICECAPS));
	
	DeleteDC(hDC);

	return TRUE;
}


BOOL KDevicePage::OnDCAttributes(HWND hWnd)
{
	TCHAR szDeviceName[MAX_PATH];

	GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);

	HDC hDC = CreateDC(_T("DISPLAY"), szDeviceName, NULL, NULL);

	KDCAttributes attr(hDC);

	attr.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DCATTRIBUTES), hWnd);
	
	DeleteDC(hDC);

	return TRUE;
}


BOOL KDevicePage::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
	    case WM_INITDIALOG:
			return OnInitDialog(hWnd);

		case WM_COMMAND:
			switch ( LOWORD(wParam) )
			{
				case IDC_DEVICE:
					if ( HIWORD(wParam)==CBN_SELCHANGE )
						return OnDeviceChange(hWnd);
					break;

				case IDC_DEVICECAPS:
					return OnDeviceCaps(hWnd);

				case IDC_DCATTR:
					return OnDCAttributes(hWnd);
			}
    }
    
    return FALSE;
}

⌨️ 快捷键说明

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