几个小问题

MrLonely 2006-08-29 08:36:08
1.AppWizard生成的SDI程序的主窗口是什么时候实例化的?
2.Button,Edit这些控件是不是都有自己的窗口函数?
3.在对话框上让一个控件和控件类型的成员变量关联,是不是仅仅是子类化了?如果一个ListBox变量和一ListBox控件关联以后,用UpdateData为什么还能更新数据呢?(我觉得子类化仅仅改变的控件的行为)

这里多谢了~~~
...全文
214 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MrLonely 2006-08-29
  • 打赏
  • 举报
回复
怎么不回答了啊,难道问题太傻了?
MrLonely 2006-08-29
  • 打赏
  • 举报
回复
OnFileNew
这个在CWinApp::OnFileNew已经实现了,
你的类继承下来了

有这个方法,那什么调用这个方法呢,在第一次启动程序的时候
MrLonely 2006-08-29
  • 打赏
  • 举报
回复
难道是做了mybutton.Attach(GetDlgItem(ID_BUTTON1))?
哈哈,还是让我再考虑一下吧,过会儿给分,我还是不大理解,先谢谢二位兄弟了.
believefym 2006-08-29
  • 打赏
  • 举报
回复
OnFileNew
这个在CWinApp::OnFileNew已经实现了,
你的类继承下来了
MrLonely 2006-08-29
  • 打赏
  • 举报
回复
谢谢 SoLike(思危) 兄弟
假设我们是第一次运行单文档程序,那么单文档程序的OnFileNew函数创建了

我想问一下那个OnFileNew函数的代码在哪里,不好意思,我在网吧,没办法查到代码

我以前没注意到,总以为CWinApp会有CFrameWnd *pFrameWnd=new CFrameWnd()这样的代码
结果发现没找到,和MDI还有点不一样
believefym 2006-08-29
  • 打赏
  • 举报
回复
那控件和控件类型(如CMyButton:public CButton)的变量关联以后,系统到底做了什么?我看到DoDateExchange函数好象做了子类化.
---------
你都已经CMyButton了,已经子类化了,楼主还在问什么呢
直接在资源视图里拖控件是不需要子类化的
MrLonely 2006-08-29
  • 打赏
  • 举报
回复
控件跟控件类型变量关联,不需要子类化,试一下不就行了
那控件和控件类型(如CMyButton:public CButton)的变量关联以后,系统到底做了什么?我看到DoDateExchange函数好象做了子类化.
思危 2006-08-29
  • 打赏
  • 举报
回复
1

在单文档程序里,运用程序类的InitInstance函数里总会有这句:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMysdiDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIME_CLASS(CMysdiView));
AddDocTemplate(pDocTemplate);

查看源代码,CDocTemplate里有这几个成员变量:
UINT m_nIDResource;
CRuntimeClass* m_pDocClass;
CRuntimeClass* m_pFrameClass;
CRuntimeClass* m_pViewClass;


CSingleDocTemplate类的构造函数把传给它的四个参数依次放入这几个成员
变量里。即:
UINT m_nIDResource=IDR_MAINFRAME,
CRuntimeClass* m_pDocClass=RUNTIME_CLASS(CMysdiDoc)
CRuntimeClass* m_pFrameClass=RUNTIME_CLASS(CMainFrame)
CRuntimeClass* m_pViewClass=RUNTIME_CLASS(CMysdiView))
就是说,构造出了文档模板后,通过文档模板对象就可以知道文档类,框架
窗口类和视图类的类名,尺寸,还可以访问这三个类的CreateObject()函数。
执行了AddDocTemplate(pDocTemplate)后,运用程序类对象中的成员m_pDoc
manager将指向一个CDocmanager对象,该对象中有个文档模板列表,它是个双向
链表,pDocTemplate将被加入到这个链表中。这个链表的名字和类型是
CPtrList m_templateList;

现在从CWinApp的OnFileNew函数开始追踪一下单文档程序的文档,框架和视
图类对象的创建过程。

1。新文档类对象的创建
假设我们是第一次运行单文档程序,那么单文档程序的OnFileNew函数创建了
程序的主框架窗口,同时也是容纳文档和视图的框架窗口,还创建了文档对象和
视图对象。CWinApp::OnFileNew函数仅仅简单调用 CDocManager::OnFileNew函数
,如果有多个文档模板的话该函数将提示选择一个模板。最后用NULL参数来调用
CSingleDocTemplate类的OpenDocumentFile函数。该函数调用CDocTemplate::Cr
eateNewDocument()函数创建新文档,该函数用下列语句来创建新文档对象:
CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();CDo
cTemplate的成员m_pDocClass上文已经说明过了。
说来说去文档对象的动态创建还是用了new操作符,可以看看CreateObject的
最终实现,它是这样的:{return new 你的文档类的类名;}

2。新的主框架窗口类对象和主框架窗口的创建
接下来CDocTemplate::CreateNewDocument()函数将创建程序主框架窗口,对
单文档程序来说也就是包容文档和视图的框架窗口。这个过程是调用CDocTempla
te::CreateNewDocument()函数来实现的。该函数先填写了一个CreateContext结
构,该结构中的几个成员的意义如下:
CFrameWnd* m_pCurrentFrame:NULL
CDocument* m_pCurrentDoc:指向刚刚创建的新文档类对象的指针
CRuntimeClass* m_pNewViewClass:CDocTemplate类里的成员 m_pViewCla
ss;
CDocTemplate* m_pNewDocTemplate:指向正在使用的这个文档模板对象的
指针


该函数使用这个语句来创建框架窗口类对象:
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();


最后用框架窗口类对象的成员函数LoadFrame()来创建窗口,那个CreateCon
text结构被当作了LoadFrame()函数的最后一个参数。也许,视图窗口的创建就在
这个LoadFrame()函数里按照CreateContext结构的内容来实现。

3。视图类对象和视图窗口的创建
确实如此。当窗口被创建出来还未显示出来之前,会有一个WM_CREATE消息发
给窗口。于是CFrameWnd::OnCreate函数被调用。该函数最终调用了CFrameWnd::
CreateView()函数。CreateView函数调用下面的语句来创建视图类对象:
CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();
pContext是在函数CDocTemplate::CreateNewDocument内部填写的CreateCon
text结构的指针,该结构的成员m_pNewViewClass的意义上文已经说过了。
视图类对象创建好后,接下来这条语句创建了视图窗口:
pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, nID, pContext)

最后,CSingleDocTemplate::OpenDocumentFile函数调用新创建的文档对象
的OnNewDocument函数,这个函数仅仅调用了下面几个函数:
DeleteContents();
m_strPathName.Empty();
SetModifiedFlag(FALSE);
思危 2006-08-29
  • 打赏
  • 举报
回复
2,控件都有系统提供的窗口过程
3, 是
believefym 2006-08-29
  • 打赏
  • 举报
回复
3,控件跟控件类型变量关联,不需要子类化,试一下不就行了,又没有添加类。
控件跟控件变量关联,updatedata怎么可能更新数据,既然弄了个控件类型变量,就调用控件类的成员函数来更新,updatada只是一些基本数据类型跟控件的交互而已

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧