<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    MFC上下浮動與漸入漸出消息提示框實現

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    類似QQ與360軟件,消息提示有兩種。上下浮動、漸入漸出。


    1、上下浮動提示框實現

    機制,定時器響應上下浮動消息。

    主要API:MoveWindow。


    源碼如下UpDownTipDlg.h、UpDownTipDlg.cpp。

    UpDownTipDlg.h

    [cpp] view plaincopy
    1. /* 
    2. *@brief 上下浮動提示框 
    3. *@date 2012-8-9 
    4. */  
    5. #pragma once  
    6.   
    7.   
    8. // CUpDownTipDlg dialog  
    9.   
    10. class CUpDownTipDlg : public CDialog  
    11. {  
    12.     DECLARE_DYNAMIC(CUpDownTipDlg)  
    13.   
    14. public:  
    15.     CUpDownTipDlg(CWnd* pParent = NULL);   // standard constructor  
    16.     virtual ~CUpDownTipDlg();  
    17.   
    18.     // Dialog Data  
    19.     enum { IDD = IDD_MCMSG_DLG };  
    20.   
    21.     void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);  
    22.   
    23. protected:  
    24.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  
    25.     virtual BOOL OnInitDialog();  
    26.     //響應關閉消息,刪除對象  
    27.     virtual void OnCancel();  
    28.     virtual void PostNcDestroy();  
    29.     afx_msg void OnTimer(UINT_PTR nIDEvent);  
    30.     afx_msg void OnBnClickedOk();  
    31.     afx_msg void OnBnClickedCancel();  
    32.   
    33.     DECLARE_MESSAGE_MAP()  
    34.   
    35. private:  
    36.     void InitDlgPosition();  
    37.   
    38. private:  
    39.     CString m_strTipInfo;  
    40. };  

    UpDownTipDlg.cpp

    [cpp] view plaincopy
    1. // MCMsgTipDlg.cpp : implementation file  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "mcmsgtip_demo.h"  
    6. #include "UpDownTipDlg.h"  
    7.   
    8. const UINT_PTR POP_WINDOW = 1;  
    9. const UINT_PTR DISPLAY_DELAY = 2;  
    10. const UINT_PTR CLOSE_WINDOW = 3;  
    11.   
    12. const UINT POP_ELAPSE = 1;  
    13. const UINT DELAY_ELAPSE = 5000;  
    14. const UINT CLOSE_ELAPSE = 1;  
    15.   
    16. //上下浮動跨度  
    17. const UINT FLOAT_SPAN = 2;  
    18.   
    19. // CUpDownTipDlg dialog  
    20.   
    21. IMPLEMENT_DYNAMIC(CUpDownTipDlg, CDialog)  
    22.   
    23. CUpDownTipDlg::CUpDownTipDlg(CWnd* pParent /*=NULL*/)  
    24. : CDialog(CUpDownTipDlg::IDD, pParent)  
    25. , m_strTipInfo(_T(""))  
    26. {  
    27.   
    28. }  
    29.   
    30. CUpDownTipDlg::~CUpDownTipDlg()  
    31. {  
    32. }  
    33.   
    34. void CUpDownTipDlg::DoDataExchange(CDataExchange* pDX)  
    35. {  
    36.     CDialog::DoDataExchange(pDX);  
    37. }  
    38.   
    39.   
    40. BEGIN_MESSAGE_MAP(CUpDownTipDlg, CDialog)  
    41.     ON_WM_TIMER()  
    42.     ON_BN_CLICKED(IDOK, &CUpDownTipDlg::OnBnClickedOk)  
    43.     ON_BN_CLICKED(IDCANCEL, &CUpDownTipDlg::OnBnClickedCancel)  
    44. END_MESSAGE_MAP()  
    45.   
    46.   
    47. // CUpDownTipDlg message handlers  
    48. void CUpDownTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)  
    49. {  
    50.     m_strTipInfo = strTipInfo;  
    51.     Create(IDD, pParent);  
    52.     ShowWindow(SW_SHOW);  
    53. }  
    54.   
    55. BOOL CUpDownTipDlg::OnInitDialog()  
    56. {  
    57.     CDialog::OnInitDialog();  
    58.   
    59.     // TODO:  Add extra initialization here  
    60.     SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);  
    61.   
    62.     InitDlgPosition();  
    63.   
    64.     //消息彈出效果  
    65.     SetTimer(POP_WINDOW, POP_ELAPSE, NULL);  
    66.   
    67.     return TRUE;  
    68. }  
    69.   
    70. void CUpDownTipDlg::InitDlgPosition()  
    71. {  
    72.     CRect rectInit;  
    73.     GetWindowRect(&rectInit);  
    74.   
    75.     RECT rect;  
    76.     SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);  
    77.     int cy = rect.bottom-rect.top;  
    78.     int cx = rect.right-rect.left;  
    79.   
    80.     int nx = rect.right - rectInit.Width();  
    81.     int ny = cy;  
    82.   
    83.     rectInit.MoveToXY(nx, ny);  
    84.   
    85.     MoveWindow(rectInit);  
    86. }  
    87.   
    88. void CUpDownTipDlg::OnTimer(UINT_PTR nIDEvent)  
    89. {  
    90.     RECT rect;  
    91.     SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);  
    92.     int cy = rect.bottom-rect.top;  
    93.     int cx = rect.right-rect.left;  
    94.   
    95.     CRect rectTip;  
    96.     GetWindowRect(&rectTip);  
    97.   
    98.     switch (nIDEvent)  
    99.     {  
    100.     case POP_WINDOW:  
    101.         {  
    102.             if (rectTip.bottom > cy)  
    103.             {  
    104.                 rectTip.MoveToY(rectTip.top - FLOAT_SPAN);  
    105.   
    106.                 MoveWindow(rectTip);  
    107.             }  
    108.             else  
    109.             {  
    110.                 KillTimer(POP_WINDOW);  
    111.                 SetTimer(DISPLAY_DELAY, DELAY_ELAPSE, NULL);  
    112.             }  
    113.   
    114.             break;  
    115.         }  
    116.     case DISPLAY_DELAY:  
    117.         {  
    118.             KillTimer(DISPLAY_DELAY);  
    119.             SetTimer(CLOSE_WINDOW, CLOSE_ELAPSE, NULL);  
    120.   
    121.             break;  
    122.         }  
    123.     case CLOSE_WINDOW:  
    124.         {  
    125.             if (rectTip.top <= cy)  
    126.             {  
    127.                 rectTip.MoveToY(rectTip.top + FLOAT_SPAN);  
    128.   
    129.                 MoveWindow(rectTip);  
    130.             }  
    131.             else  
    132.             {  
    133.                 KillTimer(CLOSE_WINDOW);  
    134.                 PostMessage(WM_CLOSE);  
    135.             }  
    136.   
    137.             break;  
    138.         }  
    139.     }  
    140.   
    141.     CDialog::OnTimer(nIDEvent);  
    142. }  
    143.   
    144. void CUpDownTipDlg::OnCancel()  
    145. {  
    146.     DestroyWindow();  
    147. }  
    148.   
    149. void CUpDownTipDlg::PostNcDestroy()  
    150. {  
    151.     CDialog::PostNcDestroy();  
    152.   
    153.     //窗口銷毀時,刪除該對象  
    154.     delete this;  
    155. }  
    156.   
    157. void CUpDownTipDlg::OnBnClickedOk()  
    158. {  
    159.     OnOK();  
    160.   
    161.     ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反饋-是"), _T("提示"), MB_OK);  
    162. }  
    163.   
    164. void CUpDownTipDlg::OnBnClickedCancel()  
    165. {  
    166.     OnCancel();  
    167. }  

    2、漸入漸出提示框實現

    機制,定時器響應淡入淡出消息。

    主要API:AnimateWindow。


    源碼如下InOutTipDlg.h、InOutTipDlg.cpp。

    InOutTipDlg.h

    [cpp] view plaincopy
    1. /* 
    2. *@brief 淡入淡出提示框 
    3. *@date 2012-8-9 
    4. */  
    5. #pragma once  
    6.   
    7. // CInOutTipDlg dialog  
    8. class CInOutTipDlg : public CDialog  
    9. {  
    10.     DECLARE_DYNAMIC(CInOutTipDlg)  
    11.   
    12. public:  
    13.     CInOutTipDlg(CWnd* pParent = NULL);   // standard constructor  
    14.     virtual ~CInOutTipDlg();  
    15.   
    16.     // Dialog Data  
    17.     enum { IDD = IDD_MCMSG_DLG };  
    18.   
    19.     void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);  
    20.   
    21. protected:  
    22.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  
    23.     virtual BOOL OnInitDialog();  
    24.     //響應關閉消息,刪除對象  
    25.     virtual void OnCancel();  
    26.     virtual void PostNcDestroy();  
    27.     afx_msg void OnTimer(UINT_PTR nIDEvent);  
    28.     afx_msg void OnBnClickedOk();  
    29.     afx_msg void OnBnClickedCancel();  
    30.   
    31.     DECLARE_MESSAGE_MAP()  
    32.   
    33. private:  
    34.     void InitDlgPosition();  
    35.   
    36. private:  
    37.     CString m_strTipInfo;  
    38. };  

    InOutTipDlg.cpp

    [cpp] view plaincopy
    1. // MCMsgTipDlg.cpp : implementation file  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "mcmsgtip_demo.h"  
    6. #include "InOutTipDlg.h"  
    7.   
    8. const UINT_PTR BLAND_IN = 4;  
    9. const UINT_PTR BLAND_OUT = 5;  
    10.   
    11. const UINT IN_ELAPSE = 1;  
    12. const UINT OUT_ELAPSE = 5000;  
    13.   
    14. // CInOutTipDlg dialog  
    15.   
    16. IMPLEMENT_DYNAMIC(CInOutTipDlg, CDialog)  
    17.   
    18. CInOutTipDlg::CInOutTipDlg(CWnd* pParent /*=NULL*/)  
    19. : CDialog(CInOutTipDlg::IDD, pParent)  
    20. , m_strTipInfo(_T(""))  
    21. {  
    22.   
    23. }  
    24.   
    25. CInOutTipDlg::~CInOutTipDlg()  
    26. {  
    27. }  
    28.   
    29. void CInOutTipDlg::DoDataExchange(CDataExchange* pDX)  
    30. {  
    31.     CDialog::DoDataExchange(pDX);  
    32. }  
    33.   
    34. BEGIN_MESSAGE_MAP(CInOutTipDlg, CDialog)  
    35.     ON_WM_TIMER()  
    36.     ON_BN_CLICKED(IDOK, &CInOutTipDlg::OnBnClickedOk)  
    37.     ON_BN_CLICKED(IDCANCEL, &CInOutTipDlg::OnBnClickedCancel)  
    38. END_MESSAGE_MAP()  
    39.   
    40. // CInOutTipDlg message handlers  
    41. void CInOutTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)  
    42. {  
    43.     m_strTipInfo = strTipInfo;  
    44.     Create(IDD, pParent);  
    45.     ShowWindow(SW_HIDE);  
    46. }  
    47.   
    48. BOOL CInOutTipDlg::OnInitDialog()  
    49. {  
    50.     CDialog::OnInitDialog();  
    51.   
    52.     // TODO:  Add extra initialization here  
    53.     SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);  
    54.   
    55.     InitDlgPosition();  
    56.   
    57.     //消息漸入漸出效果  
    58.     SetTimer(BLAND_IN, IN_ELAPSE, NULL);  
    59.   
    60.     return TRUE;  
    61. }  
    62.   
    63. void CInOutTipDlg::InitDlgPosition()  
    64. {  
    65.     CRect rectInit;  
    66.     GetWindowRect(&rectInit);  
    67.   
    68.     RECT rect;  
    69.     SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);  
    70.     int cy = rect.bottom-rect.top;  
    71.     int cx = rect.right-rect.left;  
    72.   
    73.     int nx = rect.right - rectInit.Width();  
    74.     int ny = cy - rectInit.Height();  
    75.   
    76.     rectInit.MoveToXY(nx, ny);  
    77.   
    78.     MoveWindow(rectInit);  
    79. }  
    80.   
    81. void CInOutTipDlg::OnTimer(UINT_PTR nIDEvent)  
    82. {  
    83.     RECT rect;  
    84.     SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);  
    85.     int cy = rect.bottom-rect.top;  
    86.     int cx = rect.right-rect.left;  
    87.   
    88.     CRect rectTip;  
    89.     GetWindowRect(&rectTip);  
    90.   
    91.     switch (nIDEvent)  
    92.     {  
    93.     case BLAND_IN:  
    94.         {  
    95.             KillTimer(BLAND_IN);  
    96.             AnimateWindow(1000, AW_BLEND);   
    97.   
    98.             SetTimer(BLAND_OUT, OUT_ELAPSE, NULL);  
    99.             break;  
    100.         }  
    101.     case BLAND_OUT:  
    102.         {  
    103.             KillTimer(BLAND_OUT);  
    104.             AnimateWindow(1000, AW_BLEND|AW_HIDE);  
    105.             PostMessage(WM_CLOSE);  
    106.             break;  
    107.         }  
    108.     }  
    109.   
    110.     CDialog::OnTimer(nIDEvent);  
    111. }  
    112.   
    113. void CInOutTipDlg::OnCancel()  
    114. {  
    115.     DestroyWindow();  
    116. }  
    117.   
    118. void CInOutTipDlg::PostNcDestroy()  
    119. {  
    120.     CDialog::PostNcDestroy();  
    121.   
    122.     //窗口銷毀時,刪除該對象  
    123.     delete this;  
    124. }  
    125.   
    126. void CInOutTipDlg::OnBnClickedOk()  
    127. {  
    128.     OnOK();  
    129.   
    130.     ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反饋-是"), _T("提示"), MB_OK);  
    131. }  
    132.   
    133. void CInOutTipDlg::OnBnClickedCancel()  
    134. {  
    135.     OnCancel();  
    136. }  

    3、兩種消息框調用

    [cpp] view plaincopy
    1. void ShowTipWindow(const CString& strTipInfo)  
    2. {  
    3.     CButton* pCheckBtn = (CButton*)GetDlgItem(IDC_CHECK_IO);  
    4.     if (BST_CHECKED == pCheckBtn->GetCheck())  
    5.     {  
    6.         //漸入漸出效果彈框  
    7.         CInOutTipDlg* pMsgWindow=new CInOutTipDlg();  
    8.         pMsgWindow->ShowMsgWindow(this, strTipInfo);  
    9.     }  
    10.     else  
    11.     {  
    12.         //上下浮動方式彈框  
    13.         CUpDownTipDlg* pMsgWindow=new CUpDownTipDlg();  
    14.         pMsgWindow->ShowMsgWindow(this, strTipInfo);  
    15.     }  
    16. }  

    兩個消息提示框,都封裝了ShowMsgWindow接口,傳入父窗口和待提示信息就可以了。

    ^_^這個調用方式有內存泄露現象,具體實現的時候,可以在對話框銷毀時(virtual void PostNcDestroy()),提供一個回調刪除接口。

     

    from:http://blog.csdn.net/segen_jaa/article/details/7848598

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全