概述:

CQsStatic 继承与CStatic,主要支持控件的自绘,文本的颜色、文本大小等属性,并且支持底图背景和鼠标进入与鼠标移出等相关操作等。

CQsStatic 实现如下:

#pragma once;
#include "QsInclude.h"
#include "UserMessage.h"
#include "UiPublicDefine.h"//  大小调整方式
typedef enum
{E_SizeAdjustStyl_No = 0,E_SizeAdjustStyl_Left,E_SizeAdjustStyl_Center,E_SizeAdjustStyl_Right
} enSizeAdjustStyle;class CQsStatic : public CWindowImpl<CQsStatic, CStatic>,public CImageMgrCtrlBase< CQsStatic>
{std::vector< Image* > m_vtImage;  //图片对象volatile bool    m_bMouseTrack;   //鼠标是否进入Image*  m_pImageMoseIn;UINT m_nActiveFrameNo;  //当前祯号UINT m_nTotalFrames;    //总祯数UINT m_nInterval;       //页面翻转时间UINT m_nDisTimer;UINT m_uFormat;BOOL m_isDrawEdge;      //是否绘制边框Color m_EdgeClr;        //边框颜色Color m_LineClr;        //阴影线颜色int   m_leftspace;      //距左边的距离int   m_rightspace;     //距右边的距离int   m_topspace;     //距上边的距离int   m_bottomspace;    //距底边的距离BOOL   m_bReturn;enSizeAdjustStyle   m_eSizeAdjustStyle;typedef CWindowImpl< CQsStatic, CStatic > theBaseClass;typedef CImageMgrCtrlBase< CQsStatic> theImageCtrlBaseClass;
public:BEGIN_MSG_MAP( CQsStatic )MESSAGE_HANDLER( WM_PAINT, OnPaint )MESSAGE_HANDLER( WM_TIMER, OnTimer )MESSAGE_HANDLER( WM_TIMER, OnDestroy )//MESSAGE_HANDLER( WM_SETWINDOWTEXT )MESSAGE_HANDLER( WM_MOUSELEAVE, OnMouseLeave )MESSAGE_HANDLER( WM_MOUSEMOVE, OnMouseMove )CHAIN_MSG_MAP( theImageCtrlBaseClass )DEFAULT_REFLECTION_HANDLER()END_MSG_MAP()/***@method   CQsStatic*@brief    CQsStatic类构造函数*    *@return   */CQsStatic() :m_nActiveFrameNo( 0 ),m_nTotalFrames( 0 ),m_nInterval( 5000 ),m_nDisTimer( 0 ){m_bMouseTrack = TRUE; m_uFirstPos = CONTROL_STA_FIRST;m_uLastPos = CONTROL_STA_LAST;m_uFormat = DT_SINGLELINE|DT_LEFT;m_isDrawEdge = FALSE;                  //默认为没有边框m_EdgeClr = Color(128, 255, 255, 255);  //默认边框颜色m_LineClr = Color(200, 182, 164, 183);   //默认阴影线颜色m_pImageMoseIn = NULL;m_leftspace = 0;      //距左边的距离m_rightspace = 0;     //距右边的距离m_topspace = 0;     //距上边的距离m_bottomspace = 0;    //距底边的距离m_eSizeAdjustStyle = E_SizeAdjustStyl_No;m_bReturn = FALSE;}/***@method   ~CQsStatic*@brief    CQsStatic析构造函数*    *@return   */virtual ~CQsStatic(){if(m_pImageMoseIn != NULL){delete m_pImageMoseIn;}}/***@method   SubclassWindow*@brief    类对象关联*    *@param    HWND hWnd   对象句柄*@return   BOOL*/BOOL SubclassWindow( HWND hWnd ){if( m_nDisTimer > 0 ){KillTimer( m_nDisTimer );m_nDisTimer = 0;}BOOL bRet = theBaseClass::SubclassWindow( hWnd );if( m_nTotalFrames > 1 ){m_nDisTimer = (UINT)SetTimer( 1001, m_nInterval );}//WS_EX_TRANSPARENTModifyStyleEx( 0, WS_EX_TRANSPARENT );return bRet;}/***@method   SetWindowTextEx*@brief    设置文字显示,重写防止刷新闪烁。*    *@param    LPCTSTR lpszString*@return   void*/void SetWindowTextEx(LPCTSTR lpszString){SetRedraw(FALSE);SetWindowText(lpszString);SetRedraw(TRUE);Invalidate(FALSE);}/***@method   SetbReturn*@brief    设置是否支持换车换行符*    *@return   void*/void SetbReturn(BOOL bRetrun){m_bReturn = bRetrun;}BOOL SetWindowText(LPCTSTR lpszString) throw(){ATLASSERT(::IsWindow(m_hWnd));BOOL bRet = ::SetWindowText(m_hWnd, lpszString);AdjustSize();return bRet;}void SetSizeAdjustStyle( enSizeAdjustStyle eStyle ) {m_eSizeAdjustStyle = eStyle;}void AdjustSize( void ){if ( E_SizeAdjustStyl_No == m_eSizeAdjustStyle ){return;}WTL::CDC paintDC( ::GetDC(m_hWnd) );Graphics graph( paintDC.m_hDC);CRect rtStatic;GetWindowRect(&rtStatic);GetParent().ScreenToClient( &rtStatic );// 计算绘制文字所需的区域RectF rtfTitle( 0, 0, 10000, 10 );//HFONT hFont = GetFont( );HFONT hFont = GetStateFont( CONTROL_STA_NORMAL );Font font( paintDC.m_hDC, hFont );StringFormat strfmtTitle;strfmtTitle.SetAlignment( StringAlignmentNear );strfmtTitle.SetLineAlignment( StringAlignmentNear );RectF boundTitle;//WTL::CString strText;//GetWindowText( strText );int nLength = GetWindowTextLength();TCHAR* szText = new TCHAR[nLength+1];memset( szText, 0, sizeof(TCHAR)*(nLength+1));GetWindowText( szText, nLength+1 );std::wstring strText = szText;graph.MeasureString( strText.c_str(), (INT)strText.length(), &font, rtfTitle, &strfmtTitle, &boundTitle );int nNewWidth = (int)(boundTitle.Width) + m_leftspace + m_rightspace;int nOldWidth = rtStatic.Width();if ( E_SizeAdjustStyl_Left == m_eSizeAdjustStyle ){SetWindowPos( NULL, 0, 0, boundTitle.Width, rtStatic.Height(), SWP_NOMOVE|SWP_NOZORDER );}else if ( E_SizeAdjustStyl_Center == m_eSizeAdjustStyle ){SetWindowPos( NULL, rtStatic.left - (nNewWidth-nOldWidth)/2, rtStatic.top, nNewWidth, rtStatic.Height(), SWP_NOZORDER );}else if ( E_SizeAdjustStyl_Right == m_eSizeAdjustStyle ){SetWindowPos( NULL, rtStatic.left - (nNewWidth-nOldWidth), rtStatic.top, nNewWidth, rtStatic.Height(), SWP_NOZORDER );}else{}}/***@method   SetTextFormat*@brief    设置字体显示格式*    *@param    UINT uFormat*@return   void*/void SetTextFormat(UINT uFormat){m_uFormat = uFormat;}/***@method   SetTextSpace*@brief    设置绘制文字的空间*    *@param    int leftspace*@param    int rightspace*@param    int widthspace*@param    int heightspace*@return   void*/void SetTextSpace(int leftspace,int rightspace,int topspace,int bottomspace)     {m_leftspace = leftspace;      //距左边的距离m_rightspace = rightspace;     //距右边的距离m_topspace = topspace;           //距上边的距离m_bottomspace = bottomspace;    //距底边的距离}/***@method   SetStyle*@brief    设置static的图片是否绘制边框,及其边框颜色*    *@param    BOOL bDrawEdge = FALSE  用于控制是否绘制边框,默认值为FALSE*@param    Color edgeClr = Color(128,255,255,255)边框颜色,默认值为白色*@param    Color lineClr= Color(200,182,164,183)阴影线,默认值为灰色*@return   void*/void SetEdgeStyle(BOOL bDrawEdge = FALSE,Color edgeClr = Color(128, 255, 255, 255), Color lineClr = Color(255, 128, 128, 128)){m_isDrawEdge = bDrawEdge;m_EdgeClr = edgeClr;m_LineClr = lineClr;}
protected:/***@method   OnTimer*@brief    页面翻转时间*    *@param    UINT uMsg         消息类型*@param    WPARAM wParam     未被使用*@param    LPARAM lParam     详见MSDN*@param    BOOL& bHandled    未被使用*@return   LRESULT*/LRESULT OnTimer( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ ){if( m_nTotalFrames <= 1 ){return 0;}m_nActiveFrameNo++;if( m_nActiveFrameNo >= m_nTotalFrames ){m_nActiveFrameNo = 0;}Invalidate();return 0;}/***@method   OnDestroy*@brief    清除资源*    *@param    UINT uMsg        消息类型*@param    WPARAM wParam    未被使用*@param    LPARAM lParam    详见MSDN*@param    BOOL&  bHandled  未被使用*@return   LRESULT*/LRESULT OnDestroy( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ ){//清除图片,释放内存for( size_t i = 0; i < m_vtImage.size(); i++ ){delete m_vtImage[i];}m_vtImage.clear();if( m_nDisTimer > 0 ){KillTimer( m_nDisTimer );m_nDisTimer = 0;}return 0;}/***@method   DrawEdgeEx*@brief    绘制图片的边框*    *@param    HDC &hDC  设备内容具备*@param    CRect & rc 绘图区域*@param    Color &edgeClr 边框颜色*@param    Color &lineClr 阴影线颜色*@return   void*/void DrawEdgeEx(HDC &hDC, CRect & rc, Color &edgeClr, Color &lineClr){//Pen  mypen(Color(128, 255,255, 255),14);Pen  mypen(edgeClr,10);Pen  mypen1(Color(64, 65,65, 65),1);//Pen  mypen2(Color(200,182,164,183),3);Pen  mypen2(lineClr,3);Graphics mygraph(hDC);mygraph.DrawRectangle(&mypen,1,1,rc.Width()-2,rc.Height()-2);mygraph.DrawRectangle(&mypen1,0,0,rc.Width()-1,rc.Height()-1);//画线Point  startpoint(rc.right,0);Point  endpoint(rc.right,rc.bottom);mygraph.DrawLine(&mypen2,startpoint,endpoint);startpoint.X = 0;startpoint.Y = rc.bottom;endpoint.X = rc.right;endpoint.Y = rc.bottom;mygraph.DrawLine(&mypen2,startpoint,endpoint);mygraph.ReleaseHDC(hDC);}public:/***@method   OnMouseMove*@brief    鼠标进入消息响应函数*    *@param    UINT uMsg 消息类型*@param    WPARAM wParam*@param    LPARAM lParam*@param    BOOL& bHandled*@return   LRESULT*/LRESULT OnMouseMove( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled ){if ( m_bMouseTrack ){// 向父窗口发送BN_MOUSEIN扩展通知消息HWND hParent = GetParent();if ( NULL != hParent ){WPARAM wParam = MAKELONG( ::GetWindowLong(m_hWnd, GWL_ID), STAT_MOUSEIN );::PostMessage( hParent, WM_COMMANDEX, wParam, (LPARAM)m_hWnd );}}if(m_bMouseTrack){Invalidate();// 启动鼠标离开时间TRACKMOUSEEVENT tme;tme.cbSize  = sizeof(tme);tme.hwndTrack = m_hWnd;tme.dwFlags = TME_LEAVE|TME_HOVER;TrackMouseEvent(&tme);m_bMouseTrack = FALSE;}bHandled = FALSE;return 0;}/***@method   OnMouseLeave*@brief    鼠标离开消息响应函数*    *@param    UINT uMsg 消息类型*@param    WPARAM wParam*@param    LPARAM lParam*@param    BOOL& bHandled*@return   LRESULT*/LRESULT OnMouseLeave( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled ){if(!m_bMouseTrack){Invalidate();bHandled = FALSE;m_bMouseTrack = TRUE;// 向父窗口发送BN_MOUSEOUT扩展通知消息HWND hParent = GetParent();if ( NULL != hParent ){WPARAM wParam = MAKELONG( ::GetWindowLong(m_hWnd, GWL_ID), STAT_MOUSEOUT );::PostMessage( hParent, WM_COMMANDEX, wParam, (LPARAM)m_hWnd );}}return 0;}/***@method   SetImageMoseIn*@brief    *    *@param    Image * pImage*@return   void*/void SetImageMoseIn(Image* pImage){m_pImageMoseIn = pImage->Clone();}/***@method   GetStrRow*@brief    得到字符串的行数*    *@param    CString & str*@return   int*/int GetStrRow(CString& str){int i=0;int c=0;do{i = str.Find(_T('\n'),i+1);++c;}while ((i != -1)&&i!= str.GetLength()-1);return c;}/***@method   GetRowString*@brief    得到*    *@param    CString & str*@return   void*/void GetRowString(int nCount,CString str,vector<CString>& strVector){for(int i =0;i<nCount;i++){int nLeght = str.Find(_T('\n'));CString strTemp;if (nLeght > 0){strTemp = str.Left(nLeght+1);str.Delete(0,nLeght+1);}else{strTemp = str;}strVector.push_back(strTemp);}}/***@method   OnPaint*@brief    绘制消息函数*    *@param    UINT uMsg            消息类型*@param    WPARAM wParam        未被使用*@param    LPARAM lParam        详见MSDN*@param    BOOL&  bHandled      未被使用*@return   LRESULT*/LRESULT OnPaint( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ ){WTL::CPaintDC paintDC( m_hWnd );paintDC.SetBkMode( TRANSPARENT );CRect rc;GetClientRect( rc );//创建内存作图对象WTL::CDC dc;dc.CreateCompatibleDC( paintDC.m_hDC );WTL::CBitmap memBitmap;memBitmap.CreateCompatibleBitmap( paintDC.m_hDC, rc.Width(), rc.Height() );HBITMAP hOldBmp = dc.SelectBitmap( memBitmap );dc.SetBkMode( TRANSPARENT );//获得控件背景::SendMessage( GetParent(), WM_DRAWBKGNDUI, ( WPARAM )dc.m_hDC, ( LPARAM )m_hWnd );int nLeft = 0;int ntop = 0;if (m_isDrawEdge){//绘制边框DrawEdgeEx(dc.m_hDC,rc,m_EdgeClr,m_LineClr);nLeft = ntop = 6;}POINT pt;GetCursorPos( &pt );BOOL bMouseIn =FALSE;HWND hwnd = WindowFromPoint(pt);if(hwnd==m_hWnd){bMouseIn = TRUE;}if(bMouseIn == TRUE) //鼠标在static内{if(m_pImageMoseIn != NULL){Image *pImage = m_pImageMoseIn;Graphics graph( dc.m_hDC );//graph.DrawImage( pImage, Rect( nLeft, ntop, rc.Width()-2*nLeft, rc.Height()-2*ntop), // 0, 0, pImage->GetWidth(), pImage->GetHeight(), UnitPixel );RectF rtfDest( (REAL)nLeft, (REAL)ntop, REAL(rc.Width()-2*nLeft), REAL(rc.Height()-2*ntop) );StretchImageExceptCorner( graph, pImage, rtfDest, 5, 5, 5, 5 );graph.ReleaseHDC( dc.m_hDC );}else{if( m_vtImage.size() > m_nActiveFrameNo ){Image *pImage = m_vtImage[m_nActiveFrameNo];Graphics graph( dc.m_hDC );
//                  graph.DrawImage( pImage, Rect( nLeft, ntop, rc.Width()-2*nLeft, rc.Height()-2*ntop),
//                      0, 0, pImage->GetWidth(), pImage->GetHeight(), UnitPixel );RectF rtfDest( (REAL)nLeft, (REAL)ntop, REAL(rc.Width()-2*nLeft), REAL(rc.Height()-2*ntop) );StretchImageExceptCorner( graph, pImage, rtfDest, 5, 5, 5, 5 );graph.ReleaseHDC( dc.m_hDC );}}}else{if( m_vtImage.size() > m_nActiveFrameNo ){Image *pImage = m_vtImage[m_nActiveFrameNo];Graphics graph( dc.m_hDC );
//              graph.DrawImage( pImage, Rect( nLeft, ntop, rc.Width()-2*nLeft, rc.Height()-2*ntop),
//                  0, 0, pImage->GetWidth(), pImage->GetHeight(), UnitPixel );RectF rtfDest( (REAL)nLeft, (REAL)ntop, REAL(rc.Width()-2*nLeft), REAL(rc.Height()-2*ntop) );StretchImageExceptCorner( graph, pImage, rtfDest, 5, 5, 5, 5 );graph.ReleaseHDC( dc.m_hDC );}}//绘制文字int len = GetWindowTextLength();if( len > 0 ){len += 1;CString strText;GetWindowText( strText.GetBuffer( len ), len );strText.ReleaseBuffer();HFONT hFont = GetStateFont( CONTROL_STA_NORMAL );HFONT hOldFont = dc.SelectFont( hFont );dc.SetTextColor( GetFontColor( CONTROL_STA_NORMAL ) );CRect rect(rc);rect.left = rect.left+ m_leftspace;rect.right = rect.right+ m_rightspace;rect.top = rect.top+ m_topspace;rect.bottom = rect.bottom+ m_bottomspace;if(m_bReturn == TRUE){int nCount = GetStrRow(strText);int nLenght = rect.Height()/nCount;vector<CString> verstring;GetRowString(nCount,strText,verstring);for (int i =0;i<nCount;i++){rect.top = i*nLenght;rect.bottom = (i+1)*nLenght;dc.DrawText(verstring[i], -1, &rect, GetTextFormat( ) | DT_NOPREFIX);}}else{dc.DrawText( strText, -1, &rect, GetTextFormat( ) | DT_NOPREFIX);}//LONG lStyle = GetWindowLong( GWL_STYLE );dc.SelectFont( hOldFont );::DeleteObject( hFont );}paintDC.BitBlt( 0, 0, rc.Width(), rc.Height(), dc.m_hDC, 0, 0, SRCCOPY );dc.SelectBitmap( hOldBmp );memBitmap.DeleteObject();dc.DeleteDC();return 0;}private:/***@method   GetTextFormat*@brief    得到文字的对齐方式(用DrawText()输出时的格式)*    *@return   UINT*/UINT GetTextFormat(){return m_uFormat;//UINT uFormat = 0;//DT_WORDBREAK;//button上的字必须是一行//if ((lStyle&SS_SIMPLE)==SS_SIMPLE)//{//  uFormat = DT_SINGLELINE;//}//if ((lStyle&SS_LEFTNOWORDWRAP)==SS_LEFTNOWORDWRAP)//{// uFormat = DT_WORDBREAK | DT_EDITCONTROL ;//}//else if ((lStyle&SS_ENDELLIPSIS)==SS_ENDELLIPSIS)//{// uFormat = DT_END_ELLIPSIS;//}//x方向//if ( (lStyle & SS_CENTER)==SS_CENTER )//x方向,中//{//    uFormat |= DT_CENTER;//}//else if ( (lStyle & SS_RIGHT)==SS_RIGHT )//x方向,右//{//   uFormat |= DT_RIGHT;//}//else if ( (lStyle & SS_LEFT) == SS_LEFT )//x方向,左//{//    uFormat |= DT_LEFT;//}//else//缺省,左对齐//{//   uFormat |= DT_LEFT;//}y方向//if( ( lStyle & SS_CENTER ) == SS_CENTER ) //y方向,中//{// uFormat |= DT_VCENTER;//}////return uFormat;}
public:/***@method   DeleteImage*@brief       删除static设置的图片*    *@return   void*/void DeleteImage(){for( size_t i = 0; i < m_vtImage.size(); i++ ){delete m_vtImage[i];}m_vtImage.clear();}/***@method   SetImage*@brief    设置图像*    *@param    Image *pImg       指向图像的指针*@param    UINT uInterval = 5000   图片换祯时间*@return   BOOL*/BOOL SetImage( Image *pImg, UINT uInterval = 5000 ){m_nInterval = uInterval;if( m_nDisTimer != 0 ){KillTimer( m_nDisTimer );m_nDisTimer = 0;}if( m_vtImage.size() > 0 ){//清除图片,释放内存for( size_t i = 0; i < m_vtImage.size(); i++ ){delete m_vtImage[i];}m_vtImage.clear();}if( NULL == pImg ){return FALSE;}//获得图片祯数m_nActiveFrameNo = 0;m_nTotalFrames = 0;    //总祯数UINT count = pImg->GetFrameDimensionsCount();GUID* pDimensionIDs = new GUID[count];pImg->GetFrameDimensionsList( pDimensionIDs, count );m_nTotalFrames = pImg->GetFrameCount( &pDimensionIDs[0] );//复制每一帧的图片,并将图片加入到列表中UINT i = 0;int width = pImg->GetWidth();int height = pImg->GetHeight();while( true ){//如果该帧不存在,则退出,否则,加入图片列表if( Ok == pImg->SelectActiveFrame( pDimensionIDs, i++ ) ){Bitmap bmp( width, height );Graphics graph( &bmp );graph.DrawImage( pImg, Rect( 0, 0, width, height ), 0, 0, width, height, UnitPixel );m_vtImage.push_back( bmp.Clone( 0, 0, width, height, bmp.GetPixelFormat() ) );}else{break;}}delete []pDimensionIDs;if(m_vtImage.size()==0) //当图片解析错误的时,添加一张图片!{m_vtImage.push_back(pImg->Clone());}if( ( m_nTotalFrames > 1 ) && IsWindow() ){m_nDisTimer = (UINT)SetTimer( 1001, m_nInterval );}CRect rc;GetWindowRect( rc );ScreenToClient( rc );InvalidateRect( rc, TRUE );return TRUE;}/***@method   SetImage*@brief    设置按钮图像*    *@param    UINT uID      图片在资源中存放的ID*@param    LPCTSTR sTR   图片在资源中存放的资源标签*@param    UINT uInterval = 5000  图片换祯时间*@return   BOOL*/BOOL SetImage( UINT uID, LPCTSTR sTR, UINT uInterval = 5000 ){Image *pImage = ImageFromIDResourceEx( uID, sTR );if( NULL == pImage ){return FALSE;}BOOL bRet = SetImage( pImage, uInterval );delete pImage;return bRet;}/***@method   SetImageEx*@brief    截取图片的一部分设置到控件中*    *@param    Image *pImg   指向图像的指针*@param    int nX        指定截取图片的起始点,x坐标*@param    int nY        指定截取图片的起始点,y坐标*@param    int nWidth    指定截取图片的宽度*@param    int nHeigth   指定截取图片的宽度*@param    UINT uInterval = 5000  图片换祯时间*@return   BOOL*/BOOL SetImageEx( Image *pImg, int nX, int nY, int nWidth, int nHeigth, UINT uInterval = 5000 ){m_nInterval = uInterval;if( m_nDisTimer != 0 ){KillTimer( m_nDisTimer );m_nDisTimer = 0;}if( m_vtImage.size() > 0 ){//清除图片,释放内存for( size_t i = 0; i < m_vtImage.size(); i++ ){delete m_vtImage[i];}m_vtImage.clear();}if( NULL == pImg ){return FALSE;}//获得图片祯数m_nActiveFrameNo = 0;m_nTotalFrames = 0;    //总祯数UINT count = pImg->GetFrameDimensionsCount();GUID* pDimensionIDs = new GUID[count];pImg->GetFrameDimensionsList( pDimensionIDs, count );m_nTotalFrames = pImg->GetFrameCount( &pDimensionIDs[0] );//复制每一帧的图片,并将图片加入到列表中UINT i = 0;int width = pImg->GetWidth();int height = pImg->GetHeight();while( Ok == pImg->SelectActiveFrame( pDimensionIDs, i++ ) ){//如果该帧不存在,则退出,否则,加入图片列表Bitmap bmp( width, height );Graphics graph( &bmp );graph.DrawImage( pImg, Rect( 0, 0, width, height ), nX, nY, nWidth, nHeigth, UnitPixel );m_vtImage.push_back( bmp.Clone( 0, 0, width, height, bmp.GetPixelFormat() ) );}delete []pDimensionIDs;if( ( m_nTotalFrames > 1 ) && IsWindow() ){m_nDisTimer = (UINT)SetTimer( 1001, m_nInterval );}CRect rc;GetWindowRect( rc );ScreenToClient( rc );InvalidateRect( rc, TRUE );return TRUE;}/***@method   SetImageEx*@brief    截取图片的一部分设置到控件中*    *@param    UINT uID     指向图像的指针*@param    LPCTSTR sTR*@param    int nX       指定截取图片的起始点,x坐标*@param    int nY       指定截取图片的起始点,y坐标*@param    int nWidth   指定截取图片的宽度*@param    int nHeigth  指定截取图片的宽度*@param    UINT uInterval = 5000  图片换祯时间*@return   BOOL*/BOOL SetImageEx( UINT uID, LPCTSTR sTR, int nX, int nY, int nWidth, int nHeigth, UINT uInterval = 5000 ){Image *pImage = ImageFromIDResourceEx( uID, sTR );if( NULL == pImage )return FALSE;BOOL bRet = SetImageEx( pImage, nX, nY, nWidth, nHeigth, uInterval );delete pImage;return bRet;}};

WTL自绘界面库(CQsStatic)相关推荐

  1. 仿迅雷播放器教程 -- C++ windows界面库对比(11)

    从上一篇文章中可以看出,C++的界面方向还很弱,没有任何一个界面库可以一统天下,所以才造成了界面库百家争鸣的情况. 从时间上看: 1.出来最早的是QT,1991年就有了. 2.VC++ 虽然1992年 ...

  2. 【190528】VC++ 纯API自绘图形实现的XP界面库源代码

    源码下载简介 VC++纯API自绘图形实现的XP界面库,这已经是本人水平的最大限度了,尽自己最大的努力用纯VC++代码实现的自绘窗体,没有使用任何的图片资源,虽然是个半成品,但熟知要完成一个功能强大的 ...

  3. 一些界面库比较以及如何选择界面库

    记得很早的时候看了一个哥们写的界面库的使用历程,当时还挺有感触的,不断地尝试,不断地被坑,最后有两条结论: 1.自己积累界面库: 2.买就买贵的.好的,并且提前根据自己需要协商好. 今天又重看关于界面 ...

  4. 仿迅雷播放器教程 -- 权威界面库对比 (8)

    上一个教程对MFC的历史已经介绍很多了,那么界面方面该怎么选择呢? 说起界面,那真是百家争鸣.C++里面其他的都好说,像什么XML解析顶多也就十几个著名开源库而已.Office 操作的开源库仅有几个, ...

  5. 软件开发:界面库详细对比,开发工具的选择指导

    说起界面,那真是百家争鸣.C++里面其他的都好说,像什么XML解析顶多也就十几个著名开源库而已.Office 操作的开源库仅有几个,更可怜的是有个很著名的Office开源库只有JAVA和C#版本,但是 ...

  6. C++ 100款开源界面库——内容细节(现在有变动)不必深究,普及就好

    C++ 100款开源界面库 (10) from:http://www.cnblogs.com/Alberl/p/3375162.html (声明:Alberl以后说到开源库,一般都是指著名的.或者不著 ...

  7. C++开发之界面库资源推荐篇

    开发C++的界面,如果用MFC显得过于传统和呆板,如果是企业应用无所谓,要求没那么高,如果是互联网应用,就显得太单调了,不能容易的写出漂亮的界面,吸引眼球,像QQ,360这种客户端界面怎么开发出来的呢 ...

  8. 仿迅雷播放器教程 -- C++ 100款开源界面库 (10)

    (声明:Alberl以后说到开源库,一般都是指著名的.或者不著名但维护至少3年以上的.那些把代码一扔就没下文的,Alberl不称之为开源库,只称为开源代码.这里并不是贬低,像Alberl前面那个系列的 ...

  9. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——代码结构(完)

    三年前,准备将金山界面库做一个全面的剖析.后来由于种种原因,这个系列被中断而一直没有更新.时过境迁,现在在windows上从事开发的人员越来越少,关注这块的技术的朋友也很少了.本以为这系列也随着技术的 ...

  10. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——问题

    随着物质生活的丰富,人们的精神生活也越来越丰富.人们闲暇的时间也相对变多,于是很多人就开始寻找打发时间的方法.其中电视便是其中一种非常重要的消遣方式.假如我们打开电视机,看到了一个电视台正在播一部我们 ...

最新文章

  1. python生成对象内部执行过程
  2. JS基础篇--HTML DOM classList 属性
  3. Python中类型最佳判断方法
  4. shell 循环 read line
  5. 架构设计 | 异步处理流程,多种实现模式详解
  6. 获得代理ippython_Python学习笔记六(免费获取代理IP)
  7. 测试开发:聊一聊自动化测试框架,值得收藏!
  8. 好文章推荐 数据库mysql
  9. node.js核心模块
  10. 通过笔记本wifi共享到以太网接口方法--使用嵌入式设备接入互联网
  11. CNGI高校驻地网IPv6用户数量排名
  12. 蝴蝶网络 Butterfly network
  13. niit考试题库计算机英语翻译,NIIT SM2-MT1模拟试题 HELP KEY
  14. 幸福和不幸福是对比出来的
  15. Super Res Zoom,借助 Pixel 3 增强图像清晰度和细节
  16. 由legacy+MBR改为UEFI+GPT引导方式
  17. linux中用c语言编写一个经纬度转换大地坐标
  18. SATA学习笔记 3 --- SATA简介
  19. 帝国推送插件-免费帝国CMS实时推送插件
  20. 用Python做的大航海时代ol划船按键器

热门文章

  1. CHD6.3环境中,集中kylin3.0,错误解决.NoClassDefFoundError: org/apache/commons/configuration/ConfigurationE
  2. 怎样取消php加密mppe,PHP 加密问题 求大神帮忙? 谢谢
  3. windows电脑如何设置定时关机?电脑设置定时关机的方法
  4. 留学论文辅导计算机专业Essay写作范文
  5. 计算机化学博士点,2017年新增博士硕士授予单位公布!各高校博士、硕士学位授权点建设的总体情况如何?...
  6. Xilinx HLS 学习笔记1
  7. Audio Hijack Pro 3.7.4 录制应用程序内播放的声音
  8. Dragonfly 修改数据像素点大小
  9. 6成人跳槽为钱,最新裸辞调查报告出炉!
  10. java线程 stop()_Java中的线程Thread方法之---stop()