1. mfc如何添加自定义类
cview类是负责每个软件系统向显示器输出各种信息流以及控制处理的类,但是它不负责物理层的输出操作,因为windows是一个具有与设备无关性的操作系统,cview类同过相应一系列传送给他的一些列消息,通过自已的一系列函数与之相映射,然后将消息传送给专门用来描述输出设备的CDC对象来完成显示信息的。。。 具体的封装函数太多了介绍几个重要的,具体的可以去查msdn。 关联文档对象 视图需要表示文档数据,所以文档对象与视图对象必须建立关联。这样,当文档数据发生变化时,它可以及时通知视图;当视图需要显示不同的文档数据时,它可以从文档对象中提取。 在文档/视图框架程序中,文档对象总是在视图之前建立,而在视图的WM_CREATE消息处理函数中,建立了它与文档对象的关联。代码如下: Int CView::OnCreate (LPCREATESTRUCT lpcs) { if (CWnd::OnCreate(lpcs) == -1) return -1; // m_pDocuemnt视图成员,用于存储相应文档对象的指针,此时为空 ASSERT(m_pDocument == NULL); CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams; // pContext->m_pCurrentDoc是已经建立的文档对象的指针 if (pContext != NULL && pContext->m_pCurrentDoc != NULL) { // 将当前视图加入文档对象的视图列表中,因为一个文档可关联多个视图 pContext->m_pCurrentDoc->AddView(this); /* 在文档的AddView()函数中,已经将当前文档对象指针赋给m_pDocument视图成员。这样,在视图建立之初,二者就建立了关联。*/ ASSERT(m_pDocument != NULL); } else { TRACE(“Warning: Creating a pane with no CDocument.\n”); } return 0; // ok } 同时,视图类定义了成员函数GetDocument(),返回文档对象的指针。代码如下: CDocument* CView::GetDocument() const { ASSERT(this != NULL); return m_pDocument; } 视图总是在文档对象之前销毁,在视图的析构函数中,与文档对象解除关联。代码如下: CView::~CView() { if (m_pDocument != NULL) m_pDocument->RemoveView(this); } 编辑本段视图的绘制 窗口的绘制工作总是在WM_PAINT消息处理中进行的,当窗口需要绘制时,它会收到系统发来的WM_PAINT消息。在绘制过程中,首先要准备显示设备句柄,最后要释放句柄。众所周知,在视图窗口中绘制,无需重载WM_PAINT消息处理函数OnPaint(),因为有一个更加友好的绘制新口:OnDraw()。该函数的实参是一个已经准备好的显示设备,最后无需释放。其实,这一切还是WM_PAINT消息处理函数OnPaint()为我们准备的,代码如下: void CView::OnPaint() { // CPaintDC类维护显示设备 CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); } OnPrepareDC()是一个虚拟函数,它总是在OnDraw()之前执行,可以重载它,设置绘图模式。因为OnDraw()每次执行,都使用不同的CPaintDC对象,所以本次绘图模式的状态不能保留到下一次。 OnDraw()在视图基类CView中定义为纯虚函数。例如: virtual void OnDraw(CDC* pDC) = 0; 所以CView是抽象基类,不能实例化,而派生类必须重载OnDraw()。 编辑本段虚函数 OnUpdate 当文档数据发生变化时,文档对象调用CDocument::UpdateAllView()通知所有视图,作为响应,视图的OnUpdate()成员被调用。所以,重载的OnUpdate()应该能够根据需要,将文档数据的变化反映在视图中。CView::OnUpdate()只是简单地使客户区无效,导致客户区重画。例如: void CView::OnUpdate(CView* pSender, LPARAM, CObject*) { ASSERT(pSender != this); UNUSED(pSender); // unused in release builds Invalidate(TRUE); } 编辑本段虚函数 OnInitialUpdate() 在初始创建、调用OnCreate()之后,或者在File/New、File/Open命令后被框架调用。基类CView::OnInitialUpdate()只是简单地调用OnUpdate(),可以重载它完成初始化工作。但注意,它可能被多次调用。 void CView::OnInitialUpdate() { OnUpdate(NULL, 0, NULL); } 编辑本段虚函数 CalcWindowRect 每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变化,需要重新排列客户区时,调用该函数,根据视图客户区尺寸计算视图窗口的尺寸。 我们知道,排列主窗口客户区是由CFrameWnd::RecalcLayout()完成的。显然,视图的CalcWindowRect()函数也是由它触发调用的。主窗口的客户区尺寸减掉所有控制占用的部分,剩下的区域分给视图,这部分区域作为实参传入CalcWindowRect()。在CalcWindowRect()函数内,需要计算视图窗口的尺寸。代码如下: void CView::CalcWindowRect(LPRECT lpClientRect, UNIT nAdjustType) { // lpClientRect此时是整个视图客户区的尺寸 // 需要为滚动条增加尺寸吗 if (nAdjustType != 0) { // 调用API,根据窗口风格计算窗口尺寸 ::AdjustWindowRectEx(lpClientRect, 0, FALSE, GetExStyle()); DWORD dwStyle = GetStyle(); if (dwStyle & WS_VSCROLL) { // 为垂直滚动条增加尺寸 int nAdjust = afxData.csVScroll; if (dwStyle & WS_BORDER) nAdjust -= CX_BORDER; lpClientRect->right += nAdjust; } if (dwStyle & WS_HSCROLL) { // 为水平滚动条增加尺寸 int nAdjust = afxData.cyHScroll; if (dwStyle & WS_BORDER) nAdjust -= CY_BORDER; lpClientRect->bottom += nAdjust; } return; } // 无需为滚动条增加尺寸,调用基类成员完成计算 CWnd::CalcWindowRect(lpClientRect, nAdjustType); } 编辑本段虚函数PostNcDestroy 在视图窗口关闭时最后调用的成员函数,它与CFrameWnd::PostNcDestroy完成相同的功能,即删除视图对象。代码如下: void CView::PostNcDestroy() { delete this; } 这样,可以不必关心视图的释放工作,即使它在堆中构造。 编辑本段虚函数OnCmdMsg 在讨论CFrameWnd::OnCmdMsg()时已经了解过该函数,下面只给出它的代码: BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // 首先查找自身的命令消息映射 if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // 如果视图本身没有处理该命令,将机会留给与其关联的文档对象 if (m_pDocument != NULL) { CPushRoutingView push(this); return m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } return FALSE; } 编辑本段虚函数 OnActivateView 当视图被激活为活动视图,或由活动转为非活动时,调用该函数通知视图。基类的实现只是设置该视图为焦点。代码如下: void CView::OnActivateView(BOOL bActivate, CView* pActivateView, CView*) { UNUSED(pActivateView); // unused in release builds if (bActivate) // 当前状态为活动吗 { ASSERT(pActivateView == this); // 如果其父窗口也是活动的,则设置焦点。(在MDI中,其父框架可能是非活动的) if (IsTopParentActive()) SetFocus(); } }
2. 如何在mfc中定义类
Afx模型是一组MFC的核心头文件,比如:
afxwin.h 定义MFC的核心和标准组件
afxext.h 定义MFC的扩展
afxdisp.h 是MFC自动化支持的类定义头文件
afxdb.h 是MFC的ODBC类封装
stdafx.h包含了afxwin.h,而afxwin.h又包含了afx.h。
关于afx
Microsoft的程序员开始试图将C++和面向对象的编程概念应用于Windows编程中,经编写出一个可以使windows编程工作更加简便的应用程序框架。他们把这个应用程序框架叫做AFX(AFX这个词来源于Application FrameWork,但奇怪的是这个词组中并没有包含"X"这个字母)。直到今天,AFX小组早已不存在了,AFX这个名称也于1994年初不再使用,但在Visual C++和MFC中,AFX的影子却随处可见,很多全局函数、结构和宏的标识符都被加上了AFX的前缀
3. mfc如何添加控件
你用的是VC6.0还是VS05或者08?
6.0的话在非工程区灰色位置右键勾选Controls就行 然后直接拖控件到对话框
05或者08在视图里勾选工具箱 在右侧点击工具箱 接着拖放控件进去
4. mfc添加自定义函数
(1) GetDlgItem获取文本编辑框的指针来获取内容
先使用 GetDlgItem(编辑框的ID)获取编辑框的指针,再指向编辑框的GetWindowTextA函数将获取内容保存至里。
实例:
1.获取编辑框内容
CString context;
GetDlgItem(IDC_EDIT_CTX)->GetWindowTextA(context);
2.将文本显示到编辑框
CStringcontext=_T("Hello!");
GetDlgItem(IDC_EDIT_CTX)->SetWindowTextA(context);
(2)使用 GetDlgItemText A函数获取文本框的内容。
1.获取编辑框内容
CString context;
GetDlgItemTextA(IDC_EDIT_CTX,context);
2.将文本显示到编辑框
CString context=_T("Hello!");
SetDlgItemTextA(IDC_EDIT_CTX,context);
(3)使用UpdateData()刷新数据。
UpdateData(TRUE) -- 刷新控件的值到对应的变量
UpdateData(FALSE) -- 拷贝变量值到控件显示
例如,窗口中用 DDX_Text(pDX, IDC_EDIT1, m_context); 将IDC_EDIT1编辑框控件与m_context变量做了关联,如果修改m_context之后要想对应控件显示更改 ,则需要调用UpdateData(FALSE);反之如果要获取控件中的内容,则调用UpdateData(TRUE); 简单的说,Updatedata(TRUE) == 将控件的值赋值给成员变量;
Updatedata(FALSE) == 将成员变量的值赋值给控件;
例如:定义控件变量:m_context
//取值
UpdateData(TRUE);
CString buf = m_context;
//赋值
m_context ="ok!";
UpdateData(FALSE);
5. mfc自定义资源类型
MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
6. mfc怎么添加类
先添加<fstream.h>头文件,使用CFile类,类函数可以打开txt文件,完成读写操作。 给你个例子吧!
先include <fstream.h>头文件 //打开文件(modeCreate:文件不存在就创建文件,若存在而无modeNoTruncate标志则清空文件) CFile file("text.txt",CFile::modeReadWrite|CFile::modeNoTruncate|CFile::modeCreate); char pbuf[100]; UINT nBytesRead=file.Read(pbuf,100)
; //AfxMessageBox(pbuf); strcpy(pbuf,"hello world!")
; //写入文件(从当前位置) file.Write(pbuf,sizeof(pbuf))
; //AfxMessageBox(pbuf); file.Close(); 祝:成功!
7. mfc自定义控件
可能是卡住建议退出来重新进入修改
8. mfc定义函数
首先你要生成一个CaboutDlg对象,然后调用这个函数, 不懂你为什么在CaboutDlg中定义函数,费解,为什么不在你主对话框的intalizedialog中初始化
9. mfc类只能添加到mfc项目中
点“插入”->“类”。弹出一对话框。类的类型选“Generic Class”,然后填入你的类名,如果你要从基类继承,在下面的表格中填上基类名、继承方式(public、protected或private)。
Ctrl W 打开类向导,在这里可以增加新的类。它会自动添加类的头文件。楼上的方法是在类中自动加成员变量,成员函数,消息响应函数。类的定义放在哪与在哪绘图无关,想要在OnDraw中绘图,是为了在那建立消息响应函数,可以简化代码。
实际上在CView与FrameView上绘图区别不大,只是绘图时用this指针时要注意范围,一个不包含工具栏,一个包含工具栏。
它们的基类都是CWnd,也就是说它们都有处理默认窗口消息的过程函数,如果你用CClientDC的话,两者没什么区别,当然如果用this指针的话会有范围上的区别。
因此在一般都在CView中增加消息响应函数,以简化代码。
如果你不求简化代码的话,可以不在OnDraw中录入代码,自已建一个消息响应函数(如:鼠标左键按下,释放,移动。。。。)。也就是用类向导,或者楼上两位说的方法。
View::OnDraw()函数响应的是WM_PAINT消息,且集成了CDC设备环境,CDC的构造,析构函数因集成,而被简化掉了。减小了代码的录入。
10. mfc添加自定义消息
MFC单文档程序,在资源编辑器中只有一个已有的toolbar资源,你只需要在资源编辑器里面,通过“空位”建立一个按钮图标(通过绘制或者复制)并加工好,然后选中这个工具条按钮,右键属性,给予它一个ID就可以使用了。
ID最好是先建立菜单项的方式给予,这样方便建立提示说明等文字。
工具条按钮,不需要SetButton方法,这个是对话框按钮控件的方式,而不是工具条按钮。
11. mfc如何添加自定义类不能对其变量赋值
1.建立好单文档工程。
2.在view类里(注意不能是mainframe,否则你创建的按钮会被视图遮住,看不见)添加成员变量
cbuttonm_button;
3.创建这个按钮,比如在oncreate里面添加如下代码:
rectrect={0,0,100,100};//指定按钮的位置和大小
m_button.create(_t("我是按钮"),ws_visible,rect,this,id_button);
- 相关评论
- 我要评论
-