当前位置:首页 > 代码 > 正文

mfc标签控件代码下载(mfc控件大全)

admin 发布:2022-12-19 19:32 165


本篇文章给大家谈谈mfc标签控件代码下载,以及mfc控件大全对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

MFC中,标签控件中m_tab.GetItemRect(0,rt);

0是tab的第几个Item, rt是CRect类型的变量, 获取到的边界矩形数据就存放在其中.

MFC 控件的使用

网上有很多这方面的参考,推荐上这个网站上看看:

东西挺全的。。

下面是 其中的一小部分:

MFC教程_ 应用程序的退出应用程序的退出

一个Windows应用程序启动之后,一般是进入消息循环,等待或者处理用户的输入,直到用户关闭应用程序窗口,退出应用程序为止。

例如,用户按主窗口的关闭按钮,或者选择执行系统菜单“关闭”,或者从“文件”菜单选择执行“退出”,都会导致主窗口被关闭。

当用户从“文件”菜单选择执行“退出”时,将发送MFC标准命令消息ID_APP_EXIT。MFC实现了函数CWinApp::OnAppExit()来完成对该命令消息的缺省处理。

void CWinApp::OnAppExit()

{

// same as double-clicking on main window close box

ASSERT(m_pMainWnd != NULL);

m_pMainWnd-SendMessage(WM_CLOSE);

}

可以看出,其实现是向主窗口发送WM_CLOSE消息。主窗口处理完WM_CLOSE消息之后,关闭窗口,发送WM_QUIT消息,退出消息循环(见图5-3),进而退出整个应用程序。

边框窗口对WM_CLOSE的处理

MFC提供了函数CFrameWnd::OnClose来处理各类边框窗口的关闭:不仅包括SDI的边框窗口(从CFrameWnd派生),而且包括MDI的主边框窗口(从CMDIFrameWnd派生)或者文档边框窗口(从CMDIChildWnd派生)的关闭。

该函数的原型如下,流程如图6-1所示:

void CFrameWnd::OnClose()

从图6-1中可以看出,它首先判断是否可以关闭窗口(m_lpfnCloseProc是函数指针类型的成员变量,用于打印预览等情况下),然后,根据具体情况进行处理:

如果是主窗口被关闭,则关闭程序的所有文档,销毁所有窗口,退出程序;

如果不是主窗口被关闭,则是文档边框窗口被关闭,又分两种情况:若该窗口所显示的文档被且仅被该窗口显示,则关闭文档和文档窗口并销毁窗口;若该窗口显示的文档还被其他文档边框窗口所显示,则仅仅关闭和销毁文档窗口。

下面是处理 WM_CLOSE消息中涉及的一些函数。

BOOL CDocument::SaveModified()

该虚拟函数的缺省实现:首先调用IsModifed判断文档是否被修改,没有修改就返回,否则继续。

当询问用户是否保存被修改的文档时,若用户表示“cancel”,返回FALSE;若用户表示“no”,则返回TRUE;若用户表示“yes”,则存盘失败返回FALSE,存盘成功返回TRUE。存盘处理首先要得到被保存文件的名称,然后调用虚拟函数OnSaveDocument完成存盘工作,并使用SetModifidFlag(FALSE)设置文档为没有修改。

BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName)

该函数是虚拟函数,用来保存文件。其实现的功能和OpOpenDocument相反,但处理流程类似,描述如下:

根据lpszPathName打开文件pFile;

使用pFile构造一个用于写入数据的CArchive对象,此对象用来保存数据到文件;

设置鼠标为时间瓶形状;

使用Serialize函数完成序列化写;

完毕,恢复鼠标的形状。

CWinApp::SaveAllModified()

CWinApp::CloseAllDocuments(BOOL bEndSession)

这两个函数都遍历模板管理器列表,并分别对列表中的模板管理器对象逐个调用CDocManager的同名成员函数:

CDocManager::SaveAllModified()

CDocManager::CloseAllDocuments(BOOL bEndSession)

这两个函数都遍历其文档模板列表,并分别对列表中的模板对象逐个调用CDocTemplate的同名成员函数:

CDocTemplate::SaveAllModified()

CDocTemplate::CloseAllDocuments(BOOL bEndSession)

这两个函数都遍历其文档列表,并分别对列表中的文档对象逐个调用CDocuemnt的成员函数:

CDocument::SaveModified()

CDocument::OnCloseDocument()

CDocument::SaveModified()

CDocument::OnCloseDocument()

CDocument::SaveModified前面已作了解释。OnCloseDocument是一个虚拟函数,其流程如图6-2所示。

通过文档对象所对应的视,得到所有显示该文档的边框窗口的指针:在SDI程序关闭窗口时,获取的是主边框窗口;在MDI程序关闭窗口时,获取的是MDI子窗口。

然后,关闭并销毁对应的边框窗口。

如果文档对象的 m_bAutoDelete为真,则销毁文档对象自身。

窗口的销毁过程

DestroyWindow

从图6-1、图6-2可以看出,销毁窗口是通过调用DestroyWindow来完成的。DestroyWindow是CWnd类的一个虚拟函数。CWnd实现了该函数,而CMDIChildWnd覆盖了该函数。

(1)CWnd::DestroyWindow()

主要就是调用::DestroyWindow销毁m_hWnd(必须非空),同时销毁其菜单、定时器,以及完成其他清理工作。

::DestroyWindow使将被销毁的窗口失去激活、失去输入焦点,并发送WM_DESTROY、WM_NCDESTROY消息到该窗口及其各级子窗口。如果被销毁的窗口是子窗口且没有设置WM_NOPARENTNOTFIY风格,则给其父窗口发送WM_PARENTNOFITY消息。

(2)CMDIChildWnd::DestroyWindow()

因为MDI子窗口不能使用::DestroyWindows来销毁,所以CMdiChildWnd覆盖了该函数,CMDIChildWnd主要是调用成员函数MDIDestroy给客户窗口(父窗口)发送消息WM_MDIDESTROY,让客户窗口来销毁自己。

处理WM_DESTROY消息

消息处理函数OnDestroy处理WM_DESTROY消息,CFrameWnd、CMDIChildWnd、CWnd、CView及其派生类(如CEditView等等)、CControlBar等都提供了对该消息的处理函数。这里,主要解释边框、文档边框、视类的消息处理函数OnDestroy。

CWnd::OnDestroy()

调用缺省处理函数Default()。

CFrameWnd::OnDestroy()

首先,销毁工具栏的窗口;然后,设置菜单为缺省菜单;接着,如果要销毁的是主边框窗口,则通知HELP程序本应用程序将退出,没有其他程序使用WINHELP则关闭WINHELP;最后调用CWnd::OnDestroy。

CMDIFrameWnd::OnDestroy()

首先,调整客户窗口的边界类型;然后,调用基类CframeWnd的OnDestroy。这时,MDI子窗口的工具栏窗口列表为空,故没有工具栏窗口可以销毁。

CView::OnDestroy()

首先,判断自身是否是边框窗口的活动视,如果是则调用边框窗口的SetActivateView使自己失去激活;然后,调用基类CWnd的OnDestroy。

处理WM_NCDESTROY消息

窗口的非客户区被销毁时,窗口接收WM_NCDESTROY消息,由OnNcDestroy处理WM_NCDESTROY消息。在MFC中,OnNcDestroy是Windows窗口被销毁时调用的最后一个成员函数。

CWnd、CView的某些派生类提供了对该消息的处理函数,这里只讨论CWnd的实现。

CWnd::OnNcDestroy()

首先判断当前线程的主窗口是否是该窗口,如果是且模块非DLL,则发送WM_QUIT消息,使得程序结束;

然后,判断当前线程的活动窗口是否是该窗口,如果是则设置活动窗口为NULL;

接着,清理Tooltip窗口,调用Default由Windows缺省处理WM_NCDESTROY消息,UNSUBCLASS,把窗口句柄和MFC窗口对象分离(Detach);

最后,调用虚拟函数PostNcDestoy。

PostNcDestoy

CWnd、CFrameWnd、CView、CControlBar等都覆盖了该函数。文档边框窗口和边框窗口都使用CFrameWnd::PostNcDestroy。

CWnd::PostNcDestroy()

MFC缺省实现空

void CFrameWnd::PostNcDestroy()

调用delete this销毁自身这个MFC对象。

void CView::PostNcDestroy()

调用delete this销毁自身这个MFC对象。

析构函数

delete this导致析构函数的调用。需要提到的是CFrameWnd和CView的析构函数。

CFrameWnd::~CFrameWnd()

边框窗口在创建时,把自身加入到模块-线程状态的边框窗口列表m_frameList中。现在,从列表中移走该窗口对象。

必要的话,删除m_phWndDisable数组。

CView::~CView()

在视创建时,把自身加入到文档对象的视列表中。现在,从列表中移走该视对象。

应用程序调用CloseAllDocument关闭文档时。参数为FALSE,它实际上并没有把视从列表中清除,而最后的清除是由析构函数来完成的。

至此,边框窗口关闭的过程讨论完毕。下面,结合具体情况——SDI窗口的关闭、MDI主窗口的关闭、MDI子窗口的关闭——描述对WM_CLOSE消息的处理。

SDI窗口、MDI主、子窗口的关闭

参考图6-1分析SDI窗口、MDI主、子窗口的关闭流程。

SDI窗口的关闭

在这种情况下,主窗口将被关闭。首先,关闭应用程序的文档对象。文档对象的虚拟函数OnCloseDocument调用时销毁了主窗口(Windows窗口和MFC窗口对象),同时也导致视、工具条窗口的销毁。主窗口销毁后,应用程序的主窗口对象为空,故发送WM_QUIT消息结束程序。

MDI主窗口的关闭

首先,关闭应用程序的所有文档对象。文档对象的OnCloseDocument函数关闭文档时,将销毁文档对象对应的文档边框窗口和它的视窗口。这样,所有的MDI子窗口(包括其子窗口视)被销毁,但应用程序的主窗口还在。接着,调用DestroyWindow成员函数销毁主窗口自身,DestroyWindow发现被销毁的是应用程序的主窗口,于是发送WM_QUIT消息结束程序。

MDI子窗口(文档边框窗口)的关闭

在这种情况下,被关闭的不是主窗口。判断与该文档边框窗口对应的文档对象是否还被其他一个或者多个文档边框窗口使用,如果是,则仅仅销毁该文档边框窗口(包括其子窗口视);否则,关闭文档,文档对象的OnCloseDocument将销毁该文档边框窗口(包括其子窗口视)。

上一章 回目录 下一章

MFC 中关于Edit控件问题

控件可以动态创建

具体思路如下:

先在你的对话框类中添加一个CPtrArray对象,如CPtrArray m_ptr;它是一个链表类,用于保存动态创建的Edit控件的地址,以便程序结束时销毁所有动态创建的Edit控件,否则会造成内存泄露。

然后添加动态创建Edit控件的代码,示例如下:

void CMyDlg::OnAddEdit()

{ int n=m_ptr.GetSize();

CEdit* pEdit=NULL;

pEdit=new CEdit;

pEdit-Create(WS_VISIBLE | WS_CHILD,CRect //A(0,0,25,25),this,ID_MYEDIT+n);

pEdit-ShowWindow(SW_SHOW); //B

if(pEdit!=NULL)

m_ptr.Add((void*)pEdit);

}

上面的代码很简单,首先声明一个CEdit指针变量,然后对其进行new运算(这些最基本的应该知道吧),然后用该变量创建一个Edit控件,这里把A行Create的几个参数介绍一下,第一个参数是窗口风格,Edit控件作为对话框的子窗口,所以必须包含WS_VISIBLE 和WS_CHILD两个风格,另外,如果想让Edit控件有水平和竖直滚动条的话,可以添加WS_VSCROLL和WS_HSCROLL两个风格属性,最好还添加一个ES_MULTILINE属性,这样编辑控件支持多行显示; 第二个参数是Edit控件在其父窗口的位置和大小,是一个CRect类对象,第三个参数是其父窗口指针,这里用this,第四个是控件ID,这里需要在消息函数外定义一个宏,如#define ID_MYEDIT 19874;每个Edit控件创建后ID都是不同的(自己分析); 最后将指向新创建的Edit控件的指针添加到m_ptr列表中。

B行为了让Edit控件在创建后立即显示。该函数可以把CRect对象作为参数,然后传递到A行的Create函数里面,这样想把Edit控件创建在哪儿都可以。

最后在对话框的析构函数中释放所有创建的Edit控件的内存,

CMyDlg::~CMyDlg()

{

int n=m_ptr.GetSize();

for(int i=0;in;i++)

{

CEdit* pEdit=(CEdit*)m_ptr.GetAt(i);

pEdit-DestroyWindow();

delete pEdit;

pEdit=NULL;

}

m_ptr.RemoveAll();

}

如果在对话框中直接添加消息函数的话,由于事先不知道到底有几个Edit控件,也不知道每个Edit控件的ID是多少,响应消息时很容易出错。 要响应双击消息的话我建议你自己从CEdit派生一个CMyEdit子类,然后在子类中具体实现,有一点麻烦,但是只要你派生好了一个子类,以后编程时可以直接使用,非常方便,而且不易出错。不过代码有点长,这里说不清楚。有谁想了解具体如何实现可以把你的邮箱发给我,我写好后给你发过去。

具体的细节可以在百度或百度百科上搜索,或参考MSDN

顺便提供一个MSDN下载地址:

有两个CD,速度应该很快。

有什么VC++问题可以问我,大家一起讨论讨论

完整说明如下:

根据你的要求写了一个类似的程序

首先从CEdit类派生一个子类CMyEdit,在文件MyEdit.h和MyEdit.cpp中,该类只重载了鼠标单击和双击的消息函数,在双击消息函数中,首先让编辑框获得输入焦点(这一句可以不要),然后向它的父窗口发送NM_MYDBLCLK消息,并且把发送消息的编辑框的窗口指针传递给父窗口用于识别消息到底是谁发送的,NM_MYDBLCLK的定义在MyEdit.h"的开头,其实它就是一个消息ID,即一个整数。

然后再说说Dlg类,在对话框类的头文件中添加包含语句:#include "MyEdit.h" .在对话框类中添加一个CPtrArray对象,如CPtrArray m_ptr;它是一个链表类,用于保存动态创建的Edit控件的地址,以便程序结束时销毁所有动态创建的Edit控件,否则会造成内存泄露。

然后添加动态创建Edit控件的代码,示例如下:

void CEditTestDlg::AddEdit(CRect rc)

{

int n=m_ptr.GetSize();

CMyEdit* pEdit=NULL;

pEdit=new CMyEdit;

ASSERT(pEdit-Create(WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE,rc,this,ID_MYEDIT+n));

pEdit-ShowWindow(SW_SHOW);

m_ptr.Add((void*)pEdit);

}

再添加一个按钮并添加该按钮的响应消息函数,在该函数中调用AddEdit函数添加Edit控件

void CEditTestDlg::OnButton1()

{

// TODO: Add your control notification handler code here

CRect rc(0,0,340,120);

AddEdit(rc);

}

此时单击该按钮就能看见创建的Edit控件了,为了不造成内存泄露,还要添加对话框的析构函数如下:

CEditTestDlg::~CEditTestDlg()

{

int n=m_ptr.GetSize();

for(int i=0;in;i++)

{

CMyEdit* pEdit=(CMyEdit*)m_ptr.GetAt(i);

pEdit-DestroyWindow();

delete pEdit;

pEdit=NULL;

}

m_ptr.RemoveAll();

}

为了响应双击Edit消息,在对话框类中作如下修改:

1、在对话框类的头文件中添加消息函数声明: afx_msg void OnEditDblClk(WPARAM wParam, LPARAM lParam);

2、在对话框类的cpp文件中添加该消息函数的消息映射 ON_MESSAGE(NM_MYDBLCLK, OnEditDblClk)

3、添加双击消息函数的实现代码入下:

void CEditTestDlg::OnEditDblClk(WPARAM wParam, LPARAM lParam)

{

CMyEdit* pEdit=(CMyEdit*)lParam;

if(pEdit!=NULL)

{

AfxMessageBox("双击了Edit控件!");

}

pEdit-SetWindowText("双击了Edit控件!");

}

这里只是一个实例,双击Edit控件后到底要做什么,你自己可以修改。

大概就是这样,其实其他控件你也可以这样做,例如按钮控件等等,这样就可以做出自己别具一格的控件

有什么问题可以再问我

MFC标签控件

1、在对话框中添加一个标签页控件,并为此控件关联一个CTabCtrl类变量m_tabctrl.

2、创建若干个对话框资源作为标签页控件的标签。

     修改两个属性:

     Border:    none   // 边界为空,这样它就没了标题栏

     Style:      Child   // 这个模板就可以当作另一个窗口的子窗口了在对话框的初始化函数

3,在对话框的初始化函数OnInitDialog中, 添加初始化标签页控件的代码

     3.1)  // 添加标签页,并设定标签名

     m_tabctrl.InsertItem(0, _T("XXX"));

     m_tabctrl.InsertItem(1, _T("XXX"));

     m_tabctrl.InsertItem(2, _T("XXX"));

     m_tabctrl.InsertItem(3, _T("XXX"));

     3.2)  // new若干个对话框对象,为并其添加之前定义的对话框模板,设定其父窗口为m_tabctrl 

      // new CDialog 对象   

     m_pDlgArray[0] = new CBookInfo;   

     m_pDlgArray[1] = new CReaderInfo;   

     m_pDlgArray[2] = new CBorrowInfo;   

     m_pDlgArray[3] = new CManagerInfo;

 

     3.3)  // 为CDialog对象添加对话框模板   

     m_pDlgArray[0]-Create(IDD_BOOK_INFO, m_tabctrl);  

     m_pDlgArray[1]-Create(IDD_READER_INFO, m_tabctrl);   

     m_pDlgArray[2]-Create(IDD_BORROW_INFO, m_tabctrl);   

     m_pDlgArray[3]-Create(IDD_MANAGER_INFO, m_tabctrl);

 

    3.4)  // 设置对话框在标签控件中的位置   

    CRect rc;   

    m_tabctrl.GetClientRect(rc);

    rc.top  += 20;  

    rc.left  += 5;   

    rc.bottom -= 5;   

    rc.right -= 5;

    m_pDlgArray[0]-MoveWindow(rc);   

    m_pDlgArray[1]-MoveWindow(rc);   

    m_pDlgArray[2]-MoveWindow(rc);   

    m_pDlgArray[3]-MoveWindow(rc);

 

    3.5)  // 设置缺省标签页   

    m_pDlgArray[m_nCurSel]-ShowWindow(SW_SHOW);   

    m_Tab.SetCurSel(m_nCurSel);

4.为标签控件添加TCN_SELECHANGE消息的响应函数

void CLibraryMSDlg::OnTcnSelchangeTab(NMHDR *PNMHDR, LRESULT *pResult)

{  

    int nNewSel = m_tabctrl.GetCurSel();

    if (m_nCurSel != nNewSel)  

   {  

         m_pDlgArray[m_nCurSel]-ShowWindow(SW_HIDE);   

         m_pDlgArray[nNewSel]-ShowWindow(SW_SHOW);

         m_nCurSel = nNewSel;  

    }   

    return;

}

mfc标签控件代码下载的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mfc控件大全、mfc标签控件代码下载的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/20626.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载