📄 uihandle.cpp
字号:
#include "StdAfx.h"
#include "UIHandle.h"
//
// 将缓冲 data 中的数据在客户区 rcClient 中绘出曲线来
//
void DrawCurveByDataBuffer ( CDC *pDC, CRect &rcClient, COLORREF clr, BYTE *data, int size, int nCellSize/*=1*/, int nStepX/*=0*/ )
{
if ( !pDC || !pDC->GetSafeHdc() || !data || size <= nCellSize ) return;
ASSERT ( nCellSize <= sizeof(DWORD) );
// 创建兼容的内存DC
CDC memDC;
if ( !memDC.CreateCompatibleDC(pDC) )
return;
// 创建兼容的给内存DC做图的位图
CBitmap memBmp;
if ( !memBmp.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()+1) )
{
memDC.DeleteDC ();
return;
}
CBitmap *pOldmap = memDC.SelectObject(&memBmp);
if ( !pOldmap )
{
memDC.DeleteDC ();
memBmp.DeleteObject ();
return;
}
// 在内存DC中作图
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 );
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 );
}
// 将内存中的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 ();
}
// 删除某个窗体对象实例
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 || strlen_s(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 ResotreCursor ()
{
if ( !f_hCursor_Last )
f_hCursor_Last = LoadCursor(NULL, IDC_ARROW);
SetCursor(f_hCursor_Last); // restore cursor
f_hCursor_Last = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -