QQ登录

只需一步,快速开始

上位机MFC波动文本实例

[ 复制链接 ]
效果演示

上位机MFC波动文本实例

上位机MFC波动文本实例

例程从CStatic派生一个CSinusFrame类,实现正弦波形滚动文本,其中,滚动速度、滚动文本及其字体都可以设置,参见上图。
例程使用的两文件源代码可以在下面复制使用,也可以直接下载例程源代码使用:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CTest.rar 
文件大小:37.24 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


实现过程:
1.新建一对话框工程,界面如上所示,添加控件并排版。
滑块,编辑框,按钮,图像控件。其中图像控件的ID要做修改IDC_STATIC1,并设置属性为矩形等。

2.将例程根目录文件复制并加载到自己工程中使用,这样工程会多出一集成类CSinusDlg。
接着就是这个类的使用。包含头文件,并与图像控件关联,当前滑块编辑框控件也关联变量。
#include "SinusFrame.h"
CFont m_font;
// Dialog Data
//{{AFX_DATA(CCTestDlg)
enum { IDD = IDD_CTEST_DIALOG };
CSinusFrame        m_Static;
CSliderCtrl        m_Slider;
CString        m_Text;
//}}AFX_DATA

紧接着初始化变量
VERIFY(m_font.CreatePointFont(220, "Arial Black"));
m_Text = "_____________hi____________________"                                        "this is www.gkbc8.com demo for static."
"you can use the code any time any where ________________________________"
m_Slider.SetRange(-10, 10);
m_Slider.SetPos(6);
m_Slider.SetLineSize(1);
m_Slider.SetPageSize(5);
m_Static.SetText(m_Text);
m_Static.SetFont(&m_font);
m_Static.SetSinusSpeed(6);
m_Static.Start();
UpdateData(false);

3.后面就是滑块,编辑框和按钮功能的实现。
添加WM_HSCROLL消息处理函数
  1. <blockquote>void CCTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
复制代码

双击编辑框添加文本更改处理函数点击函数
  1. void CCTestDlg::OnChangeEdit1()
  2. {
  3.         UpdateData();
  4.         if(m_Text.GetLength() > 0)
  5.                 m_Static.SetText(m_Text);
  6. }
复制代码
双击按钮控件,添加字体设置的

  1. void CCTestDlg::OnButton1()
  2. {
  3.         LOGFONT lf;
  4.         m_font.GetLogFont(&lf);
  5.        
  6.         CFontDialog        dlg(&lf);
  7.         if(dlg.DoModal()==IDOK)
  8.         {
  9.                 dlg.GetCurrentFont(&lf);
  10.                 m_font.DeleteObject();
  11.                 VERIFY(m_font.CreateFontIndirect(&lf));
  12.                 m_Static.SetFont(&m_font);
  13.         }       
  14. }
复制代码
4.最后就是编译运行例程,查看效果。下面是例程中的两文件源代码:
  1. #ifndef AFX_SINUSFRAME_H__41258CBF_8436_11D1_9C04_084D65000000__INCLUDED_
  2. #define AFX_SINUSFRAME_H__41258CBF_8436_11D1_9C04_084D65000000__INCLUDED_

  3. class CSinusFrame : public CStatic
  4. {
  5. // Konstruktion
  6. public:
  7.         CSinusFrame();

  8. // Attribute
  9. public:

  10. // Operationen
  11. public:

  12. // erschreibungen
  13.         // Vom Klassen-Assistenten generierte virtuelle Funktions黚erschreibungen
  14.         //{{AFX_VIRTUAL(CSinusFrame)
  15.         //}}AFX_VIRTUAL

  16. // Implementierung
  17. public:
  18.         void SetSinusSpeed(int n);
  19.         void SetFont(CFont* pFont);
  20.         void Stop();
  21.         void Start();
  22.         void SetText(LPCTSTR lpszText);
  23.         virtual ~CSinusFrame();

  24.         // Generierte Nachrichtenzuordnungsfunktionen
  25. protected:
  26.         //{{AFX_MSG(CSinusFrame)
  27.         afx_msg void OnFontChange();
  28.         afx_msg void OnSize(UINT nType, int cx, int cy);
  29.         afx_msg void OnClose();
  30.         //}}AFX_MSG

  31.         DECLARE_MESSAGE_MAP()
  32. private:
  33.         void Cleanup();
  34.         void DoCharBlit();
  35.         void Scroll();
  36.         TCHAR GetNextChar();
  37.         void DoSinScroll();
  38.         int GetNextSinusOffset();
  39.         double GetNextSinValue();
  40.         void Initialize();

  41.         int m_nSinusSpeed;
  42.         int m_nSinusOffset;
  43.         int m_nSinusPos;
  44.         int m_nCharWidth;
  45.         int m_nCharHeight;
  46.         int m_nPixLeft;
  47.         int m_nTextPos;

  48.         double m_dSinusTable[720];
  49.        
  50.         UINT m_nTimer;
  51.        
  52.         static void CALLBACK AFX_EXPORT TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime);
  53.        
  54.         bool m_bRunning;
  55.         bool m_bInitialized;

  56.         CFont*        m_pFont;
  57.         CBitmap* m_pBMSinus;
  58.         CBitmap* m_pBMScroll;
  59.         CDC*                m_pDCScroll;
  60.         CDC*                m_pDCSinus;
  61.         CRect                m_rcScroll;
  62.         CRect                m_rcClient;
  63.         CString        m_strText;
  64. };

  65. /////////////////////////////////////////////////////////////////////////////

  66. //{{AFX_INSERT_LOCATION}}
  67. // Microsoft Developer Studio f黦t zus鋞zliche Deklarationen unmittelbar vor der vorhergehenden Zeile ein.

  68. #endif // AFX_SINUSFRAME_H__41258CBF_8436_11D1_9C04_084D65000000__INCLUDED_
复制代码
  1. // SinusFrame.cpp: Implementierungsdatei
  2. //

  3. #include "stdafx.h"
  4. #include "SinusFrame.h"
  5. #include <math.h>
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif

  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSinusFrame

  13. CSinusFrame::CSinusFrame()
  14. {
  15.         m_bInitialized = false;
  16.         m_bRunning                = false;
  17.         m_nTimer                        = 0;
  18.         m_nTextPos                = 0;
  19.         m_nSinusPos                = 0;
  20.         m_nPixLeft                = 0;
  21.         m_nSinusOffset = 0;
  22.         m_nSinusSpeed = -3;

  23.         m_pFont                        = NULL;
  24.         m_pDCScroll                = NULL;
  25.         m_pDCSinus                = NULL;
  26.         m_pBMScroll                = NULL;
  27.         m_pBMSinus                = NULL;       
  28.        
  29.         const double rad = 2.0*3.141592654/360.0;
  30.         int i; float f;
  31.         for(i=0, f=0.0; i<720; i++, f+=0.5f)
  32.                 m_dSinusTable[i] = sin(rad*f);
  33. }

  34. CSinusFrame::~CSinusFrame()
  35. {
  36.         Cleanup();
  37. }


  38. BEGIN_MESSAGE_MAP(CSinusFrame, CStatic)
  39.         //{{AFX_MSG_MAP(CSinusFrame)
  40.         ON_WM_FONTCHANGE()
  41.         ON_WM_SIZE()
  42.         ON_WM_CLOSE()
  43.         //}}AFX_MSG_MAP
  44. END_MESSAGE_MAP()

  45. /////////////////////////////////////////////////////////////////////////////
  46. // Behandlungsroutinen f黵 Nachrichten CSinusFrame

  47. void CSinusFrame::Initialize()
  48. {
  49.         ASSERT(::IsWindow(m_hWnd));
  50.         if(m_bInitialized==true)
  51.                 return;

  52.         CFont* pOldFont;

  53.         // Font-Ausma遝 ermitteln...
  54.         CDC* pDC = GetDC();
  55.         ASSERT(pDC);
  56.         if(m_pFont)
  57.                 pOldFont = pDC->SelectObject(m_pFont);

  58.         TEXTMETRIC tm;
  59.         VERIFY(pDC->GetTextMetrics(&tm));
  60.         m_nCharHeight = tm.tmHeight;
  61.         m_nCharWidth  = tm.tmMaxCharWidth;

  62.         GetClientRect(m_rcClient);

  63.         Cleanup();
  64.         m_pDCScroll = new CDC;
  65.         m_pDCSinus        = new CDC;
  66.         m_pBMScroll        = new CBitmap;
  67.         m_pBMSinus        = new CBitmap;
  68.         ASSERT(m_pDCScroll && m_pDCSinus && m_pBMScroll && m_pBMSinus);

  69.         m_rcScroll.SetRect(0, 0, m_rcClient.Width()+m_nCharWidth, m_nCharHeight);
  70.        
  71.         VERIFY(m_pDCScroll->CreateCompatibleDC(pDC));
  72.         VERIFY(m_pBMScroll->CreateCompatibleBitmap(pDC, m_rcScroll.Width(), m_rcScroll.Height()));
  73.        
  74.         m_pDCScroll->SelectObject(m_pBMScroll);
  75.         m_pDCScroll->PatBlt(0, 0, m_rcScroll.Width(), m_rcScroll.Height(), BLACKNESS);
  76.         m_pDCScroll->SetTextColor(RGB(255,255,192));
  77.         m_pDCScroll->SetBkColor(RGB(0,0,0));
  78.        
  79.         if(m_pFont)
  80.                 m_pDCScroll->SelectObject(m_pFont);
  81.        
  82.         VERIFY(m_pDCSinus->CreateCompatibleDC(pDC));
  83.         VERIFY(m_pBMSinus->CreateCompatibleBitmap(pDC, m_rcClient.Width(), m_rcClient.Height()));
  84.        
  85.         m_pDCSinus->SelectObject(m_pBMSinus);
  86.         m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);

  87.         ReleaseDC(pDC);
  88.        
  89.         if(m_pFont)
  90.                 pDC->SelectObject(pOldFont);

  91.         m_bInitialized = true;
  92. }

  93. void CSinusFrame::OnFontChange()
  94. {
  95.         CStatic::OnFontChange();
  96.         m_bInitialized = false;       
  97. }

  98. void CSinusFrame::OnSize(UINT nType, int cx, int cy)
  99. {
  100.         CStatic::OnSize(nType, cx, cy);
  101.         m_bInitialized = false;       
  102. }

  103. void CALLBACK AFX_EXPORT CSinusFrame::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
  104. {
  105.         ASSERT(hWnd);
  106.         CSinusFrame* pSin = (CSinusFrame*)CWnd::FromHandle(hWnd);
  107.         pSin->Scroll();
  108. }

  109. void CSinusFrame::SetText(LPCTSTR lpszText)
  110. {
  111.         m_strText = lpszText;
  112.         m_nTextPos = 0;
  113.         m_bInitialized = false;       
  114. }

  115. void CSinusFrame::Start()
  116. {
  117.         ASSERT(::IsWindow(m_hWnd));

  118.         if(m_bRunning)
  119.                 Stop();

  120.         m_bRunning = true;
  121.         Initialize();
  122.         m_nTimer = SetTimer(1, 15, TimerProc);
  123.         ASSERT(m_nTimer!=0);
  124. }

  125. void CSinusFrame::Stop()
  126. {
  127.         ASSERT(::IsWindow(m_hWnd));

  128.         if(m_bRunning)
  129.         {
  130.                 ASSERT(m_nTimer!=0);
  131.                 KillTimer(m_nTimer);
  132.                 m_bRunning = false;
  133.         }
  134. }

  135. TCHAR CSinusFrame::GetNextChar()
  136. {
  137.         if(m_nTextPos >= m_strText.GetLength())
  138.                 m_nTextPos = 0;

  139.         return m_strText[m_nTextPos++];
  140. }

  141. void CSinusFrame::Scroll()
  142. {
  143.         if(m_bInitialized && m_bRunning)
  144.         {
  145.                 DoCharBlit();
  146.                 DoSinScroll();
  147.                
  148.                 CDC* pDC = GetDC();
  149.                 pDC->BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), m_pDCSinus, 0, 0, SRCCOPY);
  150.                 ReleaseDC(pDC);
  151.         }
  152.         else
  153.                 Initialize();
  154. }

  155. void CSinusFrame::DoCharBlit()
  156. {
  157.         if(m_nPixLeft <= 0)
  158.         {
  159.                 TCHAR c = GetNextChar();

  160.                 m_pDCScroll->PatBlt(m_rcClient.right, m_rcScroll.top, m_rcScroll.right, m_rcScroll.bottom, BLACKNESS);
  161.                 CSize sz = m_pDCScroll->GetTextExtent((LPCTSTR)&c, 1);
  162.                 m_pDCScroll->TextOut(m_rcClient.right, m_rcScroll.top, (LPCTSTR)&c, 1);

  163.                 m_nPixLeft = sz.cx;
  164.         }
  165. }

  166. void CSinusFrame::DoSinScroll()
  167. {
  168.         int nScrollWidth = -2;
  169.        
  170.         // first scroll Scroll-Bitmap
  171.         m_pDCScroll->BitBlt(0, 0, m_rcScroll.Width()-2, m_rcScroll.Height(), m_pDCScroll, 2, 0, SRCCOPY);

  172.         // clear sinus-bitmap
  173.         m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);

  174.         // get sinustable-startposition
  175.         m_nSinusPos = GetNextSinusOffset();

  176.         for(int i=0; i<m_rcClient.Width(); i++)
  177.         {
  178.                 double d = GetNextSinValue();
  179.                
  180.                 int y = ((m_rcClient.Height() - 2*m_rcScroll.Height()) >> 1) + (m_rcScroll.Height() >> 1);
  181.                 y += (int)(d * y);

  182.                 m_pDCSinus->BitBlt(i, y, 1, y+m_rcScroll.Height(), m_pDCScroll, i, 0, SRCCOPY);
  183.         }

  184.         m_nPixLeft += nScrollWidth;
  185. }

  186. void CSinusFrame::OnClose()
  187. {
  188.         Stop();       
  189.         CStatic::OnClose();
  190. }

  191. double CSinusFrame::GetNextSinValue()
  192. {
  193.         if(++m_nSinusPos >= 720)
  194.                 m_nSinusPos = 0;

  195.         return m_dSinusTable[m_nSinusPos];
  196. }

  197. int CSinusFrame::GetNextSinusOffset()
  198. {
  199.         m_nSinusOffset += m_nSinusSpeed;
  200.        
  201.         if(m_nSinusSpeed > 0 && m_nSinusOffset >= 720)
  202.                 m_nSinusOffset = 0;
  203.         else if(m_nSinusSpeed < 0 && m_nSinusOffset < 0)
  204.                 m_nSinusOffset = 719;

  205.         return m_nSinusOffset;
  206. }

  207. void CSinusFrame::SetFont(CFont * pFont)
  208. {
  209.         ASSERT(pFont);
  210.         m_pFont                        = pFont;
  211.         m_nTextPos                = 0;
  212.         m_bInitialized = false;       
  213. }

  214. void CSinusFrame::SetSinusSpeed(int n)
  215. {
  216.         m_nSinusSpeed = n;
  217. }

  218. void CSinusFrame::Cleanup()
  219. {
  220.         delete m_pDCScroll;
  221.         delete m_pDCSinus;
  222.         delete m_pBMScroll;
  223.         delete m_pBMSinus;

  224.         m_pDCScroll                = NULL;
  225.         m_pDCSinus                = NULL;
  226.         m_pBMScroll                = NULL;
  227.         m_pBMSinus                = NULL;       
  228. }
复制代码





回复

使用道具 举报

快速回复 返回列表 客服中心 搜索