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

📄 foosys.cpp

📁 一个国人自己实现图像库的程序(有参考价值)
💻 CPP
字号:
#include "stdafx.h"
#include "..\Include\fooSys.h"
#include "..\Include\fooBit.h"
#include <commdlg.h>
#include <shellapi.h>

//===================================================================

//	Get error code's description
PTSTR  fooGetErrorString (DWORD dwError)
{
	static TCHAR	szBuffer[256] ;
	BOOL			dwResult ;

	ZeroMemory (szBuffer, sizeof(TCHAR) * 256) ;
	dwResult = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL,
		   					  dwError,
							  MAKELANGID (LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
							  szBuffer, 256, NULL) ;
	if (dwResult == 0)
	{
		// Is it a network-related error ?
		HMODULE hDll = LoadLibraryEx (TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES) ;
		if (hDll != NULL)
		{
            FormatMessage (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
						   hDll, dwError, MAKELANGID (LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
						   szBuffer, 256, NULL) ;
            FreeLibrary (hDll) ;
         }
	}
	return szBuffer ;
}

//===================================================================
void  fooFormatCommaNumber (DWORD dwNum, TCHAR * szBuffer, int iBufLen)
{
	if ((szBuffer != NULL) && (iBufLen > 0))
	{
		TCHAR		num[64] ;
		::wsprintf (num, TEXT("%lu"), dwNum) ;
		NUMBERFMT	nf ;
		nf.NumDigits = 0 ;
		nf.LeadingZero = FALSE ;
		nf.Grouping = 3 ;
		nf.lpDecimalSep = TEXT(".") ;
		nf.lpThousandSep = TEXT(",") ;
		nf.NegativeOrder = 0 ;
		::GetNumberFormat (LOCALE_USER_DEFAULT, 0, num, &nf, szBuffer, iBufLen) ;
	}
}
//===================================================================
//	Open a Control Pad
BOOL fooControlPad (HWND hwnd, DWORD dwType)
{
	PTSTR	psPad = NULL ;
	switch (dwType)
	{
	case 0 :		//	桌面属性
		psPad = TEXT("desk.cpl") ;
		break ;
	case 1 :		//	Internet属性
		psPad = TEXT("Inetcpl.cpl") ;
		break ;
	case 2 :		//	多媒体属性
		psPad = TEXT("Mmsys.cpl") ;
		break ;
	case 3 :		//	Modem属性
		psPad = TEXT("Modem.cpl") ;
		break ;
	case 4 :		//	网络属性
		psPad = TEXT("Netcpl.cpl") ;
		break ;
	case 5 :		//	电源管理属性
		psPad = TEXT("Powercfg.cpl") ;
		break ;
	case 6 :		//	添加/删除程序属性
		psPad = TEXT("Appwiz.cpl") ;
		break ;
	case 7 :		//	鼠标属性
		psPad = TEXT("Main.cpl") ;
		break ;
	case 8 :		//	系统属性
		psPad = TEXT("Sysdm.cpl") ;
		break ;
	case 9 :		//	日期/时间属性
		psPad = TEXT("Timedate.cpl") ;
		break ;
	case 10 :		//	桌面主题
		psPad = TEXT("Themes.cpl") ;
		break ;
	}
	if (!psPad)	return FALSE ;
	ShellExecute (hwnd, TEXT("open"), TEXT("control"), psPad, TEXT(""), SW_SHOWNORMAL);
	return TRUE ;
}

//===================================================================

void  fooGetLargestDisplayMode (DISPLAYMODE * mode)
{
	if (mode == NULL)	return ;
	DEVMODE		devmode ;
	::fooInitStruct (mode, false) ;
	::fooInitStruct (&devmode, false) ;
	devmode.dmSize = sizeof(DEVMODE) ;
	DWORD	iIndex = 0 ;
	while (::EnumDisplaySettings (NULL, iIndex++, &devmode))
		if (devmode.dmPelsWidth >= mode->dwWidth)
		{
			mode->dwBits	  = devmode.dmBitsPerPel ;
			mode->dwWidth	  = devmode.dmPelsWidth ;
			mode->dwHeight	  = devmode.dmPelsHeight ;
			mode->dwFrequency = devmode.dmDisplayFrequency ;
		}
	return ;
}

//===================================================================

void  fooGetCurrentDisplayMode (DISPLAYMODE * mode)
{
	if (mode == NULL)	return ;
	DEVMODE		devmode ;
	::ZeroMemory (mode, sizeof(*mode)) ;
	::ZeroMemory (&devmode, sizeof(devmode)) ;
	devmode.dmSize = sizeof(devmode) ;
	::EnumDisplaySettingsEx (NULL, ENUM_CURRENT_SETTINGS, &devmode, EDS_RAWMODE) ;
	mode->dwBits	  = devmode.dmBitsPerPel ;
	mode->dwWidth	  = devmode.dmPelsWidth ;
	mode->dwHeight	  = devmode.dmPelsHeight ;
	mode->dwFrequency = devmode.dmDisplayFrequency ;
}

//===================================================================

LONG fooSetDisplayMode (DISPLAYMODE mode)
{
	DEVMODE		dm ;
	dm.dmSize		= sizeof (dm) ;
	dm.dmPelsWidth	= mode.dwWidth ;
	dm.dmPelsHeight = mode.dwHeight ;
	dm.dmBitsPerPel = mode.dwBits ;
	dm.dmDisplayFrequency = mode.dwFrequency ;
	dm.dmFields		= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY ;
    return ChangeDisplaySettings (&dm, CDS_UPDATEREGISTRY);
}

//===================================================================

void  fooExpandBox (BOOL fExpand, HWND hDlg, int DefaultBox_ID)
{
	RECT	rcDefault, rcChild, rcDlg ;
	HWND	hDefaultBox, hChild ;

	hDefaultBox = GetDlgItem (hDlg, DefaultBox_ID) ;
	GetWindowRect (hDefaultBox, &rcDefault) ;

	hChild = GetTopWindow (hDlg) ;	// GetFirstChild
	for ( ; hChild != NULL ; hChild = GetWindow(hChild, GW_HWNDNEXT))
	{
		GetWindowRect (hChild, &rcChild) ;

		if (!IntersectRect (&rcDlg, &rcChild, &rcDefault))
			EnableWindow (hChild, fExpand) ;
	}	// Enable/Disable all child windows outside of the default box.

	if (!fExpand)
	{
		GetWindowRect (hDlg, &rcDlg) ;
		if (GetWindowLong (hDlg, GWL_USERDATA) == 0)
		{	
				// 第一次运行,缩小
			SetWindowLong (hDefaultBox, GWL_USERDATA, MAKELONG(rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top)) ;
			ShowWindow (hDefaultBox, SW_HIDE) ;
		}
		SetWindowPos(hDlg, NULL, 0, 0, rcDefault.right - rcDlg.left, rcDefault.bottom - rcDlg.top,
					 SWP_NOZORDER | SWP_NOMOVE) ;
		::fooGetErrorString (::GetLastError ()) ;
	}
	else
	{
		DWORD dwDims = GetWindowLong (hDefaultBox, GWL_USERDATA) ;
		SetWindowPos (hDlg, NULL, 0, 0, LOWORD(dwDims), HIWORD(dwDims), SWP_NOZORDER | SWP_NOMOVE) ;
		SendMessage (hDlg, DM_REPOSITION, 0, 0) ;
		InvalidateRect (hDlg, NULL, TRUE) ;
	}
	return ;
}

//===================================================================

// Example : szFilter = "Executable Files (*.exe, *.dll)\0*.exe;*.dll\0"
//						"All Files (*.*)\0*.*\0\0" ;
BOOL  fooShowFileDialog (HWND hWnd, BOOL bOpen, TCHAR * szFullName,
						 PCTSTR szIniDir, PCTSTR Title, PCTSTR szFilter)
{
	OPENFILENAME	ofn ;
	TCHAR			InitDir[MAX_PATH] ;
	
	if (szFullName == NULL)
		return FALSE ;
	if (szIniDir)
		lstrcpy (InitDir, szIniDir) ;
	else
		::GetCurrentDirectory (MAX_PATH, InitDir) ;

	::ZeroMemory (&ofn, sizeof(OPENFILENAME)) ;
	szFullName[0] = TEXT('\0') ;
	ofn.lStructSize       = sizeof (OPENFILENAME) ;
    ofn.hwndOwner         = hWnd ;
    ofn.hInstance         = NULL ;
    ofn.lpstrFilter       = szFilter ? szFilter : TEXT("All Files (*.*)\0*.*\0\0") ;
    ofn.lpstrCustomFilter = NULL ;
    ofn.nMaxCustFilter    = 0 ;
    ofn.nFilterIndex      = 0 ;
    ofn.nMaxFile          = MAX_PATH ;
    ofn.nMaxFileTitle     = MAX_PATH ;
    ofn.lpstrInitialDir   = InitDir ;
    ofn.lpstrTitle        = Title ? Title : (bOpen ? TEXT("Open File") : TEXT("Save File")) ;
	ofn.lpstrFile		  = szFullName ;
    ofn.nFileExtension    = 0 ;
    ofn.lpstrDefExt       = TEXT("*") ;
    ofn.lCustData         = 0 ;
    ofn.lpfnHook          = NULL ;
    ofn.lpTemplateName    = NULL ;
    ofn.Flags             = OFN_ENABLESIZING | (bOpen ? 0 : OFN_OVERWRITEPROMPT) ;

	return (bOpen ? (::GetOpenFileName (&ofn) != 0) : (::GetSaveFileName (&ofn) != 0)) ;
}

//===================================================================

BOOL  fooShowColorDialog (COLORREF * ColorSelect, COLORREF InitColor[16])
{
	CHOOSECOLOR			cc ;
	static COLORREF    _crCustomColors[16] = { RGB(192,220,192), RGB(166,202,240), RGB(0,0,0), RGB(255,255,255),
											   RGB(255,0,0), RGB(0,255,0), RGB(0,0,255), RGB(202,38,79),
											   RGB(192,220,192), RGB(192,220,192), RGB(192,220,192), RGB(192,220,192),
											   RGB(192,220,192), RGB(192,220,192), RGB(192,220,192), RGB(192,220,192) } ;
	if (ColorSelect == NULL)
		return FALSE ;
	if (InitColor)
		CopyMemory (_crCustomColors, InitColor, 16 * sizeof(COLORREF)) ;

	cc.lStructSize    = sizeof (CHOOSECOLOR) ;
	cc.hwndOwner      = NULL ;
	cc.hInstance      = NULL ;
	cc.rgbResult      = RGB (166, 202, 240) ;
	cc.lpCustColors   = _crCustomColors ;
	cc.Flags          = CC_RGBINIT | CC_FULLOPEN ;
	cc.lCustData      = 0 ;
	cc.lpfnHook       = NULL ;
	cc.lpTemplateName = NULL ;

	if (!::ChooseColor (&cc))	return FALSE ;
	if (InitColor)
		CopyMemory (InitColor, _crCustomColors, 16 * sizeof(COLORREF)) ;
	return TRUE ;
}

//===================================================================

void  fooOnChangeDlgSize (HWND hDlg,
						  RECT rcDest, RECT rcSrc,
						  UINT nNumCtrl,
						  UINT nCtrl[],
						  UINT nMethod[])
{
	if ((nCtrl == NULL) || (nMethod == NULL))
		return ;

	// 所有坐标运算都为Screen坐标
	RECT	rcCtrl ;
	RECT	rcCtrlNew ;
	BOOL	bXLeft, bYUp ;	// 偏左?偏上?

	::ClientToScreen (hDlg, (POINT *) &rcDest.left) ;
	::ClientToScreen (hDlg, (POINT *) &rcDest.right) ;
	::ClientToScreen (hDlg, (POINT *) &rcSrc.left) ;
	::ClientToScreen (hDlg, (POINT *) &rcSrc.right) ;
	for (int i = 0 ; i < (int) nNumCtrl ; i++)
	{
		::GetWindowRect (::GetDlgItem (hDlg, nCtrl[i]), &rcCtrl) ;	// rcCtrl <-- Screen
		bXLeft = ( ((rcCtrl.left + rcCtrl.right) / 2) <= ((rcSrc.left + rcSrc.right) / 2) ) ;
		bYUp = ( ((rcCtrl.top + rcCtrl.bottom) / 2) <= ((rcSrc.top + rcSrc.bottom) / 2) ) ;
		switch (nMethod[i])
		{
			case DLG_RESIZE_MOVE :
				if (bXLeft)
				{
					rcCtrlNew.right = rcDest.right - (rcSrc.right - rcCtrl.right) * (rcDest.right - rcDest.left) / (rcSrc.right - rcSrc.left) ;
					rcCtrlNew.left = rcCtrlNew.right - (rcCtrl.right - rcCtrl.left) ;
				}
				else
				{
					rcCtrlNew.left = (rcCtrl.left - rcSrc.left) * (rcDest.right - rcDest.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
					rcCtrlNew.right = rcCtrlNew.left + (rcCtrl.right - rcCtrl.left) ;
				}
				if (bYUp)
				{
					rcCtrlNew.bottom = rcDest.bottom - (rcSrc.bottom - rcCtrl.bottom) * (rcDest.bottom - rcDest.top) / (rcSrc.bottom - rcSrc.top)  ;
					rcCtrlNew.top = rcCtrlNew.bottom - (rcCtrl.bottom - rcCtrl.top) ;
				}
				else
				{
					rcCtrlNew.top = rcDest.top + (rcCtrl.top - rcSrc.top) * (rcDest.bottom - rcDest.top) / (rcSrc.bottom - rcSrc.top)  ;
					rcCtrlNew.bottom = rcCtrlNew.top + (rcCtrl.bottom - rcCtrl.top) ;
				}
				break ;

			case DLG_RESIZE_STRETCH :
				rcCtrlNew.right  = (rcDest.right - rcDest.left) * (rcCtrl.right - rcSrc.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
				rcCtrlNew.bottom = (rcDest.bottom - rcDest.top) * (rcCtrl.bottom - rcSrc.top) / (rcSrc.bottom - rcSrc.top) + rcDest.top ;
				rcCtrlNew.left = (rcDest.right - rcDest.left) * (rcCtrl.left - rcSrc.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
				rcCtrlNew.top  = (rcDest.bottom - rcDest.top) * (rcCtrl.top - rcSrc.top) / (rcSrc.bottom - rcSrc.top) + rcDest.top ;
				break ;
		}
		::ScreenToClient (hDlg, (POINT *) &rcCtrlNew.left) ;
		::ScreenToClient (hDlg, (POINT *) &rcCtrlNew.right) ;
		::MoveWindow (::GetDlgItem (hDlg, nCtrl[i]), rcCtrlNew.left, rcCtrlNew.top, rcCtrlNew.right - rcCtrlNew.left, rcCtrlNew.bottom - rcCtrlNew.top, TRUE) ;
	}
}

//===================================================================

⌨️ 快捷键说明

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