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

📄 uihandle.cpp

📁 ◆◆◆ 《投掷飞镖记分工具》◆◆◆ 操作系统 : Windows Mobile 5.0 说明 : 中秋节和家人赏月
💻 CPP
字号:
#include "StdAfx.h"
#include "PublicFunc.h"

//
// 将缓冲 data 中的数据在客户区 rcClient 中绘出曲线来
//
void DrawCurveByDataBuffer ( CDC *pDC, CRect &rcClient, COLORREF clr, BYTE *data, int size, CBrush *m_pbrsBkGnd/*=NULL*/, int nCellSize/*=1*/, int nStepX/*=0*/ )
{
	if ( !pDC || !pDC->GetSafeHdc() || !data || size <= nCellSize ) return;

	ASSERT ( nCellSize <= sizeof(DWORD) );
	POINT *ptAry = new POINT[size/nCellSize];
	if ( !ptAry ) return;
	memset ( ptAry, 0, sizeof(POINT)*size/nCellSize );

	// 创建兼容的内存DC
	CDC memDC;
	if ( !memDC.CreateCompatibleDC(pDC) )
	{
		delete[] ptAry;
		return;
	}
	// 创建兼容的给内存DC做图的位图
	CBitmap memBmp;
	if ( !memBmp.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()+1) )
	{
		memDC.DeleteDC ();
		delete[] ptAry;
		return;
	}
	CBitmap *pOldmap = memDC.SelectObject(&memBmp);
	if ( !pOldmap )
	{
		memDC.DeleteDC ();
		memBmp.DeleteObject ();
		delete[] ptAry;
		return;
	}

	// 在内存DC中作图
	if ( m_pbrsBkGnd && m_pbrsBkGnd->GetSafeHandle() )
	{
		memDC.FillRect ( &rcClient, m_pbrsBkGnd );
	}

	CPen Pen, *pOldPen;
	VERIFY(Pen.CreatePen(PS_SOLID, 1, clr ));
	pOldPen = memDC.SelectObject ( &Pen );

	DWORD dwMaxValue = GetHexDataByBitNum ( nCellSize*8 );
	DWORD dwCountValue = 0;
	memcpy ( &dwCountValue, data, nCellSize );
	int y = (int) ( (double)dwCountValue * (double)rcClient.Height() / (double)dwMaxValue );
//	memDC.MoveTo ( 0, y );
	ptAry[0].x = 0; ptAry[0].y = y;
	float fStepX = 0.0;
	if ( nStepX != 0 )
		fStepX = (float)nStepX;
	else
		fStepX = (float)rcClient.Width() / (float)(size/nCellSize-1);
	float fLineX = 0;

	for ( int i=nCellSize; i<size; i+=nCellSize )
	{
		fLineX += fStepX;
		if ( (int)fLineX > rcClient.Width() )
		{
			ASSERT ( FALSE );
			break;
		}
		dwCountValue = 0;
		memcpy ( &dwCountValue, &data[i], nCellSize );
	//	TRACE ( L"i = %d, Value = 0x%x, fLineX = %d\n", i, dwCountValue, (int)fLineX );
		y = (int) ( (double)dwCountValue * (double)rcClient.Height() / (double)dwMaxValue );

//		memDC.LineTo ( (int)fLineX, y );
		ptAry[i/nCellSize].x = (int)fLineX; ptAry[i/nCellSize].y = y;
	}

	memDC.Polyline ( ptAry, size/nCellSize );
	// 将内存中的DC图写到屏幕上
	VERIFY ( pDC->BitBlt ( rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height()+1, &memDC, 0, 0, SRCCOPY ) );
	if ( pOldmap ) memDC.SelectObject(pOldmap);
	Pen.DeleteObject();
	if ( pOldPen ) memDC.SelectObject ( pOldPen );
	memDC.DeleteDC ();
	memBmp.DeleteObject ();

	delete[] ptAry;
}


// 删除某个窗体对象实例
void DeleteInstance ( CWnd **ppWnd )
{
	if ( !ppWnd || !(*ppWnd) ) return;
	if ( ::IsWindow((*ppWnd)->m_hWnd) )
		(*ppWnd)->DestroyWindow();
	delete (*ppWnd);
	(*ppWnd) = NULL;
}

//
// 获取工作区间大小
//
CSize GetWorkAreaSize ()
{
	CSize sz;
	RECT rect;
	SystemParametersInfo ( SPI_GETWORKAREA,0,&rect,0 );
	sz.cx = rect.right - rect.left;
    sz.cy = rect.bottom - rect.top;
	return sz;
}
//
// 处理微调按钮
//
void HandleSpanClick(
		CWnd *pOwnerWnd,
		UINT nEditCtrlID,
		NMHDR* pNMHDR,
		LRESULT* pResult,
		int nMaxValue,
		int nMinValue,
		int nInterval/*=1*/)
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	int nNumber = pOwnerWnd->GetDlgItemInt ( nEditCtrlID, NULL );
	if ( nInterval < 1 ) nInterval = 1;
	BOOL nMultiple = ( ( nNumber % nInterval ) == 0 );	// 是否为整数倍

	if ( pNMUpDown->iDelta == 1 )	// 减少
	{
		if ( nMultiple )
			nNumber -= nInterval;
		else
			nNumber = ( nNumber / nInterval * nInterval );

	}
	else	// 增加
	{
		if ( nMultiple )
			nNumber += nInterval;
		else
			nNumber = ( ( nNumber / nInterval + 1 ) * nInterval );
	}

	if ( nNumber > nMaxValue )
			nNumber = nMaxValue;
	if ( nNumber < nMinValue )
			nNumber = nMinValue;

	pOwnerWnd->SetDlgItemInt ( nEditCtrlID, nNumber );
	CEdit *pEdit = (CEdit*)pOwnerWnd->GetDlgItem(nEditCtrlID);
	ASSERT ( pEdit );
	pEdit->SetSel ( 0, -1 );
	pEdit->SetFocus();

	*pResult = 0;
}

//
// 从文件中读取一个位图文件
//
BOOL LoadBitmapFromFile(CBitmap &bmp, LPCTSTR lpszBmpPath)
{
	if ( !lpszBmpPath || lstrlen(lpszBmpPath) < 1 ) return FALSE;

	HBITMAP hBitmap = NULL;
#ifdef WINCE
	hBitmap = SHLoadDIBitmap ( lpszBmpPath );
#else
	hBitmap = (HBITMAP)::LoadImage(NULL, lpszBmpPath, IMAGE_BITMAP,
                    0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
#endif
	if( hBitmap == NULL)
	{
		return FALSE;
	}
	if ( bmp.GetSafeHandle() )
	{
		bmp.DeleteObject();
	}
	bmp.Attach(hBitmap);
	return TRUE;
}

void DrawBitmap ( CBitmap &bmp, CDC *pDC, CRect &rc, BOOL bStretch )
{
	if ( bmp.GetSafeHandle() && pDC )
	{		
		CDC memDC;
		memDC.CreateCompatibleDC ( pDC );
		CBitmap *pOB = memDC.SelectObject ( &bmp );

		if ( bStretch )
		{
			BITMAP BitMap;
			bmp.GetBitmap ( &BitMap );
			pDC->StretchBlt ( rc.left,
				rc.top,
				rc.Width(),
				rc.Height(),
				&memDC,
				0,
				0,
				BitMap.bmWidth,
				BitMap.bmHeight,
				SRCCOPY );
		}
		else
		{
			pDC->BitBlt ( rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY );
		}
		memDC.SelectObject ( pOB );
		memDC.DeleteDC();
	}
}

HCURSOR f_hCursor_Last = NULL;
void SetWaitCursor ()
{
	f_hCursor_Last = GetCursor();//save the current cursor
	SetCursor(LoadCursor(NULL, IDC_WAIT));// set the wait cursor while searching
}

void RestoreCursor ()
{
	if ( !f_hCursor_Last )
		f_hCursor_Last = LoadCursor(NULL, IDC_ARROW);

	SetCursor(f_hCursor_Last);		// restore cursor
	f_hCursor_Last = NULL;
}

/********************************************************************/
/*																	*/
/* Function name : AutoSizeColumns									*/
/* Description   : 													*/
/*																	*/
/********************************************************************/
void AutoSizeColumns(CListCtrl *pListCtrl) 
{
	// Call this after your the control is filled
	pListCtrl->SetRedraw(FALSE);
	int mincol = 0;
    int maxcol = pListCtrl->GetHeaderCtrl()->GetItemCount()-1;
    for (int col = mincol; col <= maxcol; col++) 
	{
		pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE);
        int wc1 = pListCtrl->GetColumnWidth(col);
        pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER);
        int wc2 = pListCtrl->GetColumnWidth(col);
        // 10 is minumim column width
		int wc = max(10, max(wc1,wc2));
        pListCtrl->SetColumnWidth(col,wc);
     }
     pListCtrl->SetRedraw(TRUE);
}

//
// 激活一个窗口,让它出现在所有窗口的前面
//
void ActiveWindowToForeground ( CWnd *pWnd )
{
	ASSERT ( pWnd && ::IsWindow ( pWnd->m_hWnd ) );
	pWnd->SetForegroundWindow ();
	pWnd->SetActiveWindow ();
	// 总在最前面,又放回去
	pWnd->SetWindowPos ( &pWnd->wndTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
	pWnd->SetWindowPos ( &pWnd->wndNoTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);

}

/********************************************************************************
* Function Type	:	Global
* Parameter		:	color		-	原始的rgb值
* Return Value	:	结果字符串长度
* Description	:	得到反色的rgb值
*********************************************************************************/
COLORREF GetInverseColor(COLORREF color)
{
	BYTE r = (BYTE)(color & 0xff);
	BYTE g = (BYTE)((color >> 8) & 0xff);
	BYTE b = (BYTE)((color >> 16) & 0xff);
	return RGB(~r,~g,~b);
}
//
// 更新菜单状态
//
void UpdateMenuState ( CMenu *pMenu, UINT nSubMenuID, UINT fState)
{
	if ( !pMenu ) return;
	MENUITEMINFO hMenuInfo;
	memset ( &hMenuInfo, 0, sizeof(MENUITEMINFO) );
	hMenuInfo.cbSize = sizeof(MENUITEMINFO);
	hMenuInfo.fMask = MIIM_STATE;
	hMenuInfo.fState |= fState;
	SetMenuItemInfo ( pMenu->GetSafeHmenu(), nSubMenuID, FALSE, &hMenuInfo );
}

void RemarkListSelected ( CListCtrl *pListCtrl, int nItem, BOOL bSelect )
{
	ASSERT ( pListCtrl );
	UINT nState = pListCtrl->GetItemState ( nItem, LVIS_SELECTED );
	if ( bSelect )
	{
		nState |= LVIS_SELECTED;
		pListCtrl->SetSelectionMark ( nItem );
	}
	else
	{
		nState &= ~LVIS_SELECTED;
	}

	pListCtrl->SetItemState (
			nItem,
			nState,				// nState
			LVIS_SELECTED );	// nMask
}

/********************************************************************************
* Function Type	:	global
* Parameter		:	None
* Return Value	:	None
* Description	:	选定指定行,并让选定的行滚动到第一排
*********************************************************************************/
void SetListSelected(CListCtrl *pListCtrl, int nItem, BOOL bMoveToTop/*=TRUE*/, BOOL bGetFocus/*=TRUE*/)
{
	ASSERT ( pListCtrl );
	int nItemCount = pListCtrl->GetItemCount();
	if ( nItem < 0 || nItem >= nItemCount )
		return;

	pListCtrl->SetRedraw ( FALSE );
	for ( int i=0; i<nItemCount; i++ )
	{
		RemarkListSelected ( pListCtrl, i, FALSE );
	}

	RemarkListSelected ( pListCtrl, nItem, TRUE );
	
	// 滚动到第一行
	if ( bMoveToTop )
	{
		CRect rc;
		pListCtrl->GetSubItemRect( nItem, 0, LVIR_LABEL , rc );
		CSize sz(0,rc.top - rc.Height() );
		pListCtrl->Scroll( sz );
	}
	// 获得焦点
	if ( bGetFocus ) pListCtrl->SetFocus();
	pListCtrl->SetRedraw ( TRUE );
}

⌨️ 快捷键说明

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