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