UIHandle.cpp
上传用户:hbzxgg2
上传日期:2009-03-28
资源大小:291k
文件大小:5k
- #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 = %dn", 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;
- }