CFrameWnd和CWnd的同名虚函数Create的重写

作者&投稿:烛贱 (若有异议请与网页底部的电邮联系)
c++虚函数调用的一个问题,求大神~

#include #include #include using namespace std;class CWnd{public:CreateEx();virtual BOOL PreCreateWindow();};BOOL CWnd::PreCreateWindow(){coutPreCreateWindow(); //问题所在cout<<typeid(this).name()<<endl;cout<<this<<endl; return TRUE;}int main(int argc, char* argv[]){CFrameWnd test;test.Create();cout<<&test<<endl;return 0;}上面是测试代码,结果为:
CFrameWnd::PreCreateWindow()class CWnd *0012FF440012FF44首先,类是对数据和函数的一个封装,类函数调用类型是thiscall,第一个参数默认的是类对象的首地址。下面两种方式在内存中是等效的:
//类的实现class a{public:int add(int n){return (m_n + n);}int m_n;};//结构体的实现struct a{int m_n;};int add(a* p,int n){return (p->m_n + n);}可以看到,结构体的实现只是相对松散,不利于管理,其原理还是一样的。类就好比是一个结构体+多个函数。调用类的成员函数就好比把类的“结构体”(数据部分)作为第一个参数传入类的成员函数里进行调用。
类的继承,是由编译器来处理的,未重载的用父类的成员函数地址,重载的就用子类的成员函数地址。
虚函数,也是由编译器来处理的,方法是在类的头部添加一个_vfptr的变量,指向vftable(虚函数表),虚函数表是一个数组,保存该类所有的虚函数地址。调用虚函数的时候要通过读取虚函数表中的地址,来调用该函数。比如CFrameWnd test;定义了一个CFrameWnd对象,虚函数表中存的CFrameWnd::PreCreateWindow的地址,所以即使是用父类指针调用还是调用的子类函数。

字符类型的问题!
VS2008默认使用UNICODE编码的,一个字符是两个字节!上面的代码应该修改成这样:
MyWindows()
{
Create(NULL,L"My Application Windows");
MessageBox(L"Windows Created",L"CFrameWnd Constructor");
}
即系在字符串前面加上一个L,L是一个宏!
Create函数需要LPCTSTR类型的参数, LPCTSTR是一个宏,如果定义了UNICODE,则LPCTSTR解释为LPCWSTR,其中的W就是Wide的意思,即系宽,也就是上面说的
一个字符是两个字节。如果没有定义UNICODE,则LPCTSTR解释为LPCSTR。由于VS2008默认使用UNICODE,所以要用宏L来强制类型转换。
建议你先了解一下这方面的知识,否则后面还会遇到问题的!《PROGRAMMING WINDOWNS>这本书的前两章有介绍这方面的知识!

通过classwizard给我生成的是CWnd中的Create

里面还有一个类的选项你没有选,仔细找找看

CFrameWnd不是由CWnd派生的么,差不多!

在classwizard对话框第一个属性页中,有一个选项:Class Name ,你选择CFrameWnd就可以重载了...

我佛慈悲,但贫僧实在不知是何原因,还请道兄见谅。


关于WM_CLOSE 和WM_DESTROY
WndProc将这个消息传给DefWindowProc。DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入...

如何在mfc中使用xttoolkitpro
DockControlBar(&m_wndToolBar);*\/ 5、 如果需要重载CMainFrame::PreTranslateMessage和CMainFrame::OnCmdMsg,修改如下 BOOL CMainFrame::PreTranslateMessage(MSG* pMsg){ \/\/ TODO: Add your specialized code here and\/or call the base class return CXTPMDIFrameWnd::PreTranslateMessage(pMsg);}...

Hello China操作系统的Hello China的应用程序开发接口
下面通过一个代码片断,说明这种相似性:DWORD HCNMain(LPVOID pData){\/\/HANDLE hFrameWnd = (HANDLE)pData; \/\/pData is the handle of screen window,it is all application's parent window.MSG msg;HANDLE hMainFrame = NULL;__WINDOW_MESSAGE wmsg;\/\/Create hello world's window.hMainFrame...

C++怎么获取指定窗口句柄某点像素值
0, 0, 0L); RECT rc = {0,0,200,100};CMainFrame wndFrame;wndFrame.Create(NULL,&rc);wndFrame.CenterWindow();wndFrame.ShowWindow(SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg); }wndFrame.DestroyWindow(); retu...

http:\/\/zhidao.baidu.com\/question\/341013069.html
LRESULT CALLBACK FrameWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){ static HWND hwndclient; CLIENTCREATESTRUCT clientcreate;\/\/创建客户窗口所需的结构体 HWND hwndChild; MDICREATESTRUCT mdicreate;\/\/创建子窗口所需的结构体 switch(message) { case WM_CREATE: \/\/创建客户窗口,MDICLIENT为...

远安县15022435458: 谁告诉我几个MFC的常用类 谢谢 -
枕任尤斯: 常用的MFC类 CRuntimeClass结构 在CRuntimeClass构中定义了类名、对象所占存储空间的大小、类的版本号等成员变量及动态创建对象、派生关系判断等成员函数.每一个从CObject类派生的类都有一个CRuntimeClass结构同它关联,以便完...

远安县15022435458: 谁能讲一下C++中的类“CWnd”? -
枕任尤斯: CWnd类提供了微软基础类库中所有窗口类的基本功能. CWnd对象与Windows的窗口不同,但是两者有紧密联系.CWnd对象是由CWnd的构造函数和析构函数创建或销毁的.另一方面,Windows的窗口是Windows的一种内部数据结构,它是...

远安县15022435458: 一个vc程序的主框架窗口是什么? -
枕任尤斯: 首要了解的是,MFC把程序分为两部分,一部分是继承自CWinApp的Class,用于产生程序本身.另外需要一些继承自CWnd的Class来产生窗体.CWnd的子类有很多,Frame Windows的有CFrameWnd以及他的支持MDI的子类,Dialog Window有CDialog以及它的子类,View的有CView以及它的子类~ 一般来说,我们需要自己写一个继承自上面几种窗体类型的类,来产生窗体~

远安县15022435458: 基于MFC在DLL中继承CWnd类后的调用问题 -
枕任尤斯: 楼上的,你拷贝一大堆,不知道你在说什么...汗 创建含有基于MFC扩展的类的DLL,需要使用 Mfc Extension Dll 动态库 看看你创建DLL工程时候的设置 集中MFCDLL的差别一个是宏定义,一个是入口函数.主要目的是为了保证资源句柄的正确切换,和LIB的链接.修改配置来的麻烦,你重新构建一个DLL工程,然后把先前的文件都加进去即可

远安县15022435458: c++==========getparent与afxgetmainwnd的区别是什么.... -
枕任尤斯: GetParent获得是父窗口指针(一般是CFrameWnd*主窗口指针).但是GetParent获得上级父窗口指针,他不一定是主窗口. GetParent()是获得父窗体的cwnd 而对话框的父窗体不一定mainWnd AfxGetMainWnd获取自身窗口句柄. 如果你...

远安县15022435458: 视类窗口和框架窗口有什么区别?? -
枕任尤斯: CFrameWnd:是应用程序的框架类,负责显示和搜寻用户命令.Cview是应用程序的视图类,负责为文档提供一个或多个视图.

远安县15022435458: 为什么视窗口的父类是框架窗口,CFrameWnd类和CView类不都是派生于CWnd的吗,不是平级吗? -
枕任尤斯: 窗口的父子关系和类的父子关系是两个不同的概念.

远安县15022435458: 如何看MFC程序代码 -
枕任尤斯: 如何看MFC 程序代码 看下面内容之前,建议你学学《深入浅出MFC》,这本书强烈推荐! 现在只是做个了解.不妨做个知识备份! 在MFC 程序中,我们并不经常直接调用Windows API,而是从MFC 类创建对象并调用属于这些对象的成员函数...

远安县15022435458: VC定时器 SetTimer 怎么用阿 -
枕任尤斯: SetTimer函数的用法1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时...

远安县15022435458: mfc中cview类有什么作用? -
枕任尤斯: cview类是负责每个软件系统向显示器输出各种信息流以及控制处理的类,但是它不负责物理层的输出操作,因为windows是一个具有与设备无关性的操作系统,cview类同过相应一系列传送给他的一些列消息,通过自已的一系列函数与之相映射...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网