MFC(二) 窗口创建机制编故事(上)

来源:互联网 发布:网络研修教学反思 编辑:程序博客网 时间:2024/05/19 09:10


继续,MFC的第二个机制:窗口创建机制~

讲到窗口创建,不得不再提到Win32的窗口创建。

 

Win32里,老师会跟你讲:窗口的创建就像是毕业后自己动手建立属于自己的公司~

当然,一切都要自己来:

注册窗口类: 工商局注册,填写同样的表(结构体)

            名称,表单号......

注意,填好表一定要交到柜台,让工作人员把信息输入到电脑,记录你的申请号~

创建窗口: 租用写字楼,装修

            地址、装修风格(WS_OVERLAPPEDWINDOW),

            位置及大小(100100500500),等

显示窗口:广告,告知业内公司的存在,将公司推向市场

消息循环:软件公司正常运行

GetMessage : 销售人员拉单子

TranslateMessage : 需求分析师(架构师)

DispatchMessage:调度,工作委派

 

而我更喜欢另一个版本:在游戏里创建一个佣兵团

注册窗口类:去佣兵中心,填写表格,注册佣兵团

            团名,团长,副团,联系人.....

创建窗口: 把佣兵的广告牌 造出来

            大小,风格,顶灯,分区,菜单......

显示窗口: 通电,广告牌亮起来

更新窗口: 略

消息循环: 佣兵团正常运营

GetMessage: 看佣兵工会的任务委托,联络人在工会等任务上门

DispatchMessage:接任务,交给团内相应人员去完成

 

OnXxx() :根据不同的消息 做不同的任务

 

回顾一下Win32的窗口创建之后,我们来了解一下MFC的窗口创建~

(其实学习编程,选择一个为主,但需要涉猎很多其他的知识,最不好的就是学这个看不起学那个的。 例如有的人喜欢用MFC,有的就喜欢用QT,其实两者都要学学。当然,学得不好,相互干扰,但学得好了,那就是交相辉映,互相促进的。 )

 

简单的说,WIN32像自己造房子或自己装修,什么都得自己来,而MFC就像代理公司,可以帮你做掉很多工作。

 

还是简单的讲,WIN32的窗口创建就像是在公司里申请笔记本电脑,你先得填申请表

WNDCLASSEX wce

然后,领导层层审批,最后审批通过了,财务会让你去设备科配置,

HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,g_hInstance,NULL);

 

然后你还要去软件科安装软件,紧接着是就是无尽的任务,收邮件,回邮件,处理问题......

 

好了,我们来看MFC的窗口创建机制:

上一节我们说到黑衣人到特别行动组委托了一个任务,

好吧,要创建一个杀手组织。

老板有钱,但不熟悉业务,需要有代理公司帮助才能创建成功。

这一节我们直接进入框架窗口类(我们自己写的代码)然后比上次更细致的关注窗口创建的问题,打开VS,新建WIN32项目(注意是WIN32),可以是空项目

1. 配置3步(ALT+F7进入属性):

1) MFC的使用--在静态库中使用MFC

2)字符集--未设置

3) C/C++->预编译头-----不使用

2. 自己写如下代码:

#include<afxwin.h>

class CMyFrameWnd : public CFrameWnd

{

};

class CMyWinApp : public CWinApp

{

public:

virtual BOOL InitInstance();

};

CMyWinApp theApp;

BOOL CMyWinApp::InitInstance()

{

CMyFrameWnd *pFrame = new CMyFrameWnd();

pFrame->Create(NULL,"MFCCreate");             //打断点

m_pMainWnd = pFrame;

pFrame->ShowWindow(SW_SHOW);

pFrame->UpdateWindow();

return TRUE;

}

运行显示窗口~ YEAR~

在第2句上打上断点,按F5调试~

再按F11进入Create()函数

回到执行小组,在初始化工作完成后,发现客户在任务中有特殊的一些要求:只是简单的说了句要创建一个组织,除了名字是他取的外,其他都完全没有考虑。

好吧,行动小组,上吧!

 

 

“老王, 先把客户的要求放到我们默认的表格中,发送给创建1

客户提供的只是窗口名称一项

CreateEx(dwExStylelpszClassNamelpszWindowNamedwStyle,

rect.leftrect.toprect.right - rect.leftrect.bottom - rect.top,pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))

创建1组:有与办事局表格信息对应的表格(CREATESTRUCT cs),把老王提交的信息先填在创建1组的表格中(客户提的组织名已填写)(而类名--办事局会在注册成功后才会给你一个编号)。

所以在这里要注意:

注册窗口类目前还是NULL

 

创建1组:为确保一次申请成功(你去有关部门办事,经常会告诉你少这个少那个,白跑一趟),创建1组将表格送到模拟办事局进行预检!

BOOL CFrameWnd::PreCreateWindow(CREATESTRUCTcs)

{

if (cs.lpszClass == NULL) //咱还没有注册成功,没有编号

{

VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));

cs.lpszClass = _afxWndFrameOrView;  // COLOR_WINDOW background

}

 

模拟办事局:经验丰富的工作人员验证(VERIFY)了注册材料后,马上将材料传到了国家办事局那边常驻的行动组的工作人员那里。

AfxEndDeferRegisterClass(LONG fToRegister)

办事局驻留工作人员: 登记(指针),并从传送门获取状态信息(全局),并从材料中确定了注册的方式:

AFX_MODULE_STATEpModuleState = AfxGetModuleState();

fToRegister = AFX_WNDFRAMEORVIEW_REG = 8

相当于Win32WS_OVERLAPPED;//有标题栏,边框,客户区(层叠)???

于是进行了带ICON的注册

 

好不容易,找了好多关系,终于注册成功。

回到PreCreateWindow()函数中,把注册后得到的编号(类名)再记录到特别行动组创建1组的文档中,以便于将来的客户服务~

 

 

下面,AfxHookWindowCreate(this) 开始登场!

话说注册完成了,系统分配了空间,建造局会很快依照要求进行建造。

“头儿, 建造局的事我们管不了!”小张报告说;

“我知道,不过我们早就在建造局埋了内线,只要建造工作一线束,内线会先控制住局面,把第一手消息传给我们的~”执行组长淡定的回答。

我们来看如何埋内线(钩子Hook)(钩子在Window编程中是强大的,利用钩子可以做一些很过分的事)

 

累了,明天继续。。。。。。 2015-10-15 22:17:22

0 0
原创粉丝点击