• MFC学习笔记2 按钮、TabControl


    一。按钮

    将按钮升级为自定义按钮,MyButton

    1.右键项目,添加MyButton类

    2.在MyButton类中添加自定义功能,此时MyButton类相当于一个窗口,事件是标准消息,不是通告消息。

    1 void MyButton::OnMouseMove(UINT nFlags, CPoint point) //当鼠标在MyButton(窗口)上移动时,改变按钮(窗口)位置
    2 {
    3     // TODO: 在此添加消息处理程序代码和/或调用默认值`
    4     int x = rand() % 400;
    5     int y = rand() % 400;
    6     this->MoveWindow(x, y, 100, 50);
    7 
    8     CButton::OnMouseMove(nFlags, point);
    9 }

     3.拖入Button控件,添加变量,类型选择MyButton

    4.给按钮添加图片,在OnInitDialog中添加代码:

    1 //加载位图
    2 CBitmap bitmap;
    3 bitmap.LoadBitmapW(IDB_BITMAP1);
    4 //bmp获取位图信息
    5 BITMAP bmp;
    6 bitmap.GetBitmap(&bmp);
    7 //给按钮设置位图
    8 m_button.SetBitmap(bitmap);
    9 m_button.MoveWindow(20, 20, bmp.bmWidth, bmp.bmHeight);

    二。TabControl

    1.在项目目录放入TabSheet.cpp和TabSheet.h文件,并在解决方案添加现有项,作为TabSheet类

    • TabSheet.cpp
    #include "pch.h"  
    #include "TabSheet.h"  
     
    #ifdef _DEBUG  
    #define new DEBUG_NEW  
    #undef THIS_FILE  
    static char THIS_FILE[] = __FILE__;  
    #endif  
     
    /////////////////////////////////////////////////////////////////////////////  
    // CTabSheet  
     
    CTabSheet::CTabSheet()  
    {  
        m_nNumOfPages = 0;  
        m_nCurrentPage = 0;  
    }  
     
    CTabSheet::~CTabSheet()  
    {  
    }  
     
     
    BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)  
        //{{AFX_MSG_MAP(CTabSheet)  
        ON_WM_LBUTTONDOWN()  
        //}}AFX_MSG_MAP  
    END_MESSAGE_MAP()  
     
    /////////////////////////////////////////////////////////////////////////////  
    // CTabSheet message handlers  
     
    BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)  
    {  
        if( MAXPAGE == m_nNumOfPages )  
            return FALSE;  
     
        m_nNumOfPages++;  
     
        m_pPages[m_nNumOfPages-1] = pDialog;  
        m_IDD[m_nNumOfPages-1] = ID;  
        m_Title[m_nNumOfPages-1] = title;  
     
        return TRUE;  
    }  
     
    void CTabSheet::SetRect()  
    {  
        CRect tabRect, itemRect;  
        int nX, nY, nXc, nYc;  
     
        GetClientRect(&tabRect);  
        GetItemRect(0, &itemRect);  
     
        nX=itemRect.left;  
        nY=itemRect.bottom+1;  
        nXc=tabRect.right-itemRect.left-2;  
        nYc=tabRect.bottom-nY-2;  
     
        m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);  
        for( int nCount=1; nCount < m_nNumOfPages; nCount++ )  
            m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);  
     
    }  
     
    void CTabSheet::Show()  
    {  
        for( int i=0; i < m_nNumOfPages; i++ )  
        {  
            m_pPages[i]->Create( m_IDD[i], this );  
            InsertItem( i, m_Title[i] );  
        }  
     
        m_pPages[0]->ShowWindow(SW_SHOW);  
        for( int i=1; i < m_nNumOfPages; i++)  
            m_pPages[i]->ShowWindow(SW_HIDE);  
     
        SetRect();  
     
    }  
     
    void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point)   
    {  
        CTabCtrl::OnLButtonDown(nFlags, point);  
     
        if(m_nCurrentPage != GetCurFocus())  
        {  
            m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);  
            m_nCurrentPage=GetCurFocus();  
            m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);  
            //      m_pPages[m_nCurrentPage]->SetFocus();  
        }  
    }  
     
    int CTabSheet::SetCurSel(int nItem)  
    {  
        if( nItem < 0 || nItem >= m_nNumOfPages)  
            return -1;  
     
        int ret = m_nCurrentPage;  
     
        if(m_nCurrentPage != nItem )  
        {  
            m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);  
            m_nCurrentPage = nItem;  
            m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);  
            //      m_pPages[m_nCurrentPage]->SetFocus();  
            CTabCtrl::SetCurSel(nItem);  
        }  
     
        return ret;  
    }  
     
    int CTabSheet::GetCurSel()  
    {  
        return CTabCtrl::GetCurSel();  
    } 
     
    //释放page资源
    void CTabSheet::Free()
    {
     
        CTabCtrl::DeleteAllItems();
        for( int i=0; i < m_nNumOfPages; i++ )  
        {  
            m_pPages[i]->DestroyWindow();
            m_IDD[i] = NULL;
            m_Title[i] = NULL;
        
        }  
        m_nCurrentPage = 0;
        m_nNumOfPages = 0;
        //CTabCtrl::DestroyWindow();  //注意不要将this指针释放了
    }
    • TabSheet.h
     1 #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)  
     2 #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_  
     3  
     4 #if _MSC_VER > 1000  
     5 #pragma once  
     6 #endif // _MSC_VER > 1000  
     7 // TabSheet.h : header file  
     8 //  
     9  
    10 /////////////////////////////////////////////////////////////////////////////  
    11 // CTabSheet window  
    12 #define MAXPAGE 16  
    13  
    14 class CTabSheet : public CTabCtrl  
    15 {  
    16     // Construction  
    17 public:  
    18     CTabSheet();  
    19  
    20     // Attributes  
    21 public:  
    22  
    23     // Operations  
    24 public:  
    25  
    26     // Overrides  
    27     // ClassWizard generated virtual function overrides  
    28     //{{AFX_VIRTUAL(CTabSheet)  
    29     //}}AFX_VIRTUAL  
    30  
    31     // Implementation  
    32 public:  
    33     int GetCurSel();  
    34     int SetCurSel(int nItem);  
    35     void Show();  
    36     void Free();
    37  
    38     void SetRect();  
    39     BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID);  
    40     virtual ~CTabSheet();  
    41  
    42     // Generated message map functions  
    43 protected:  
    44     LPCTSTR m_Title[MAXPAGE];  
    45     UINT m_IDD[MAXPAGE];  
    46     CDialog* m_pPages[MAXPAGE];  
    47     int m_nNumOfPages;  
    48     int m_nCurrentPage;  
    49     //{{AFX_MSG(CTabSheet)  
    50     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);  
    51     //}}AFX_MSG  
    52  
    53     DECLARE_MESSAGE_MAP()  
    54 };  
    55  
    56 /////////////////////////////////////////////////////////////////////////////  
    57  
    58 //{{AFX_INSERT_LOCATION}}  
    59 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.  
    60  
    61 #endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)

    2.新建两个Dialog作为两个子窗口,修改属性和ID。并生成.cpp和.h文件,为CDlgChild1和CDlgChild2

    style=child

    Border=None

    3.在主窗口.h中添加两个对话框.h文件并创建实例。

    CDlgChild1 dlg1;
    CDlgChild2 dlg2;

    4.为Tab_Control控件添加变量m_tab,类型为CTabSheet。

    4.在主对话框的OnInitDialog中为控件变量添加页。

    1     m_tab.AddPage(TEXT("第一页"), &dlg1, IDD_DIALOG1);
    2     m_tab.AddPage(TEXT("第二页"), &dlg2, IDD_DIALOG2);
    3     //显示
    4     m_tab.Show();

  • 相关阅读:
    经验:Library Cache Lock之异常分析-云和恩墨技术通讯精选
    Schnorr 签名算法与聚合签名
    5G 第五代移动通信网络
    《机器学习》周志华西瓜书习题参考答案:第9章
    启动tomcat,在黑色窗口中看到乱码
    Linux系统目录结构以及简单说明
    Linux系统目录结构以及简单说明
    锤子科技官网:问题整理及注意事项
    锤子科技官网:问题整理及注意事项
    锤子科技官网:问题整理及注意事项
  • 原文地址:https://www.cnblogs.com/sclu/p/11555713.html
Copyright © 2020-2023  润新知