您的位置:首页 > 其它

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

2015-10-19 20:56 288 查看

继续,MFC的第二个机制:窗口创建机制~
讲到窗口创建,不得不再提到Win32的窗口创建。
 
在Win32里,老师会跟你讲:窗口的创建就像是毕业后自己动手建立属于自己的公司~
当然,一切都要自己来:
注册窗口类: 去工商局注册,填写同样的表(结构体)
            名称,表单号......
注意,填好表一定要交到柜台,让工作人员把信息输入到电脑,记录你的申请号~
创建窗口: 租用写字楼,装修
            地址、装修风格(WS_OVERLAPPEDWINDOW),
            位置及大小(100,100,500,500),等
显示窗口:广告,告知业内公司的存在,将公司推向市场
消息循环:软件公司正常运行
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(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))
创建1组:有与办事局表格信息对应的表格(CREATESTRUCT cs),把老王提交的信息先填在创建1组的表格中(客户提的组织名已填写)(而类名--办事局会在注册成功后才会给你一个编号)。
所以在这里要注意:
注册窗口类目前还是NULL
 
创建1组:为确保一次申请成功(你去有关部门办事,经常会告诉你少这个少那个,白跑一趟),创建1组将表格送到模拟办事局进行预检!
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL) //咱还没有注册成功,没有编号
{
VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
cs.lpszClass = _afxWndFrameOrView;  // COLOR_WINDOW background
}
 
模拟办事局:经验丰富的工作人员验证(VERIFY)了注册材料后,马上将材料传到了国家办事局那边常驻的行动组的工作人员那里。
AfxEndDeferRegisterClass(LONG fToRegister)
办事局驻留工作人员: 登记(指针),并从传送门获取状态信息(全局),并从材料中确定了注册的方式:
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
fToRegister = AFX_WNDFRAMEORVIEW_REG = 8
相当于Win32中WS_OVERLAPPED;
//有标题栏,边框,客户区(层叠)???
于是进行了带ICON的注册
 
好不容易,找了好多关系,终于注册成功。
回到PreCreateWindow()函数中,把注册后得到的编号(类名)再记录到特别行动组创建1组的文档中,以便于将来的客户服务~
 
 
下面,
AfxHookWindowCreate(this); 开始登场!
话说注册完成了,系统分配了空间,建造局会很快依照要求进行建造。
“头儿, 建造局的事我们管不了!”小张报告说;
“我知道,不过我们早就在建造局埋了内线,只要建造工作一线束,内线会先控制住局面,把第一手消息传给我们的~”执行组长淡定的回答。
我们来看如何埋内线(钩子Hook)(钩子在Window编程中是强大的,利用钩子可以做一些很过分的事)
 
累了,明天继续。。。。。。 2015-10-15 22:17:22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC 窗口创建