-
mfc如何创建窗口
- 时间:2024-11-23 18:20:31
大家好,今天Win10系统之家小编给大家分享「mfc如何创建窗口」的知识,如果能碰巧解决你现在面临的问题,记得收藏本站或分享给你的好友们哟~,现在开始吧!
生意如何小账本专业版-小商户销售和存货记账系列软件最新版本下载
1.怎样使用MFC创建一个窗口类
创建一个完整窗口要经历的步骤:
1)设计一个窗口类;
2)注册窗口类;
3)创建窗口;
4)显示及更新窗口。
第一步:
windows 已经为用户定义了一个完整的窗口类,用户只需要将各个属性填满既可以。窗口类是一个 结构体,其定义如下:
typedef struct _WNDCLASS{
UINT style;//class style
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS;
第二步:
用RegisterClass(&wndclass)来定义的窗口注册。
第三步:创建窗口
1)定义一个句柄,然后用CreateWindow()来为句柄赋值。函数用法参看MSDN。创建窗口必须依据已经声明并且已经注册的窗口类型来创建。
HWND CreateWindow(
LPCTSTR lpClassName,//定义的窗口类名
LPCTSTR lpWindowName,//窗口的名字,将会在标题栏上显示出来的
DWORD dwStyle,//窗口的风格(窗口的外观模式和功能按钮等等)
int x,//窗口初始位置ws_usedefault
int y,//同上
int nWidth,//窗口的宽度,可以用ws_usedefault
int nHeight,//窗口高度,可以用ws_usedefault
HWND hWndParent,//父窗口的句柄,单一窗口则设置为空
HMENU hMenu,//菜单的句柄,如果没有菜单则将这个句柄设置为空
HINSTANCE hInstance,//由系统进行分配标识
LPVOID lpParam//一般设置为空
);
第四步:显示窗口
调用ShowWindow()函数来显示窗口。
ShowWindow(
HWND hWnd,//要显示的窗口的句柄
int nCmdShow//显示窗口的模式,如:最大化最小花显示
)
第五步:更新窗口
在显示窗口的函数调用完毕以后调用UpdateWindow()来对窗体进行更新
UpdateWindow(hwnd);//这个函数没有并不影响消息产生。
//消息循环
MSG msg;//定义了一个消息结构体变量
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/*
GetMessage(
LPMSG lpMsg,
//消息结构提的指针,无需对这个消息结构提的内部成员初始化,
//这个只需将定义的结构体的地址传到这里
HWND hWnd,
//窗口句柄,指明要获得的是那个窗口的消息,如果要获取所有窗口的消息则
//定义为NULL
UINT wMsgFilterMin,
//用来指定要从消息队列里边取得的最小值,
UINT wMsgFilterMax
//用来指定要从消息队列里边取得的最大值,
///////////////////////////////////////////////////////////////////////
//这两个参数用来限制GETMESSAGE 在消息队列里边的取值范围,//
//以去处调一些确定不感兴趣的消息 //
//if要从消息队列中所有的消息中提取的话则两个参数均设定为 //
//零 //
///////////////////////////////////////////////////////////////////////
);//从调用程序线程消息队列中取消息
*/
有了创建窗口的整个流程以后,现在就开始定义窗口过程,用WindowProc()
LRESULT CALLBACK WindowProc(/*函数名字可以更改,但是参数不允许改变*/
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);//参数和消息结构提的前四个参数相同,事实上系统在调用窗口过程函数
//的时候自动将消息结构体的前四个参数传递到窗口过程
2.用MFC怎么创建一个全屏窗口
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“ViewFull Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态。 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面将先讨论点击菜单项“ViewFull Screen”实现全屏显示的方法,再讲述按“Esc”键后如何退出全屏显示状态。 1) 在CMainFrame类中,增加如下三个成员变量。 Class CMainFrame : public CFrameWnd { private: //自己添加的三个成员变量 WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置 BOOL m_bFullScreen; //全屏显示标志 Crect m_FullScreenRect; //表示全屏显示时的窗口位置 protected: CMainFrame(); DECLARE_DYNCREATE(CMainFrame)} 2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Full Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其ID值也设置为ID_FULL_SCREEN。 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的响应函数。响应函数如下: void CMainFrame::OnFullScreen() { GetWindowPlacement(&m_OldWndPlacement); Crect WindowRect; GetWindowRect(&WindowRect); Crect ClientRect; RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect); ClientToScreen(&ClientRect); // 获取屏幕的分辨率 int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN); //将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, //将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区位置间的差值, 就得到全屏显示的窗口位置 m_FullScreenRect.left = WindowRect.left-ClientRect.left; m_FullScreenRect.top = WindowRect.top-ClientRect.top; m_FullScreenRect.right = WindowRect.right-ClientRect.right+nFullWidth; m_FullScreenRect.bottom = WindowRect.bottom-ClientRect.bottom+nFullHeight; m_bFullScreen = TRUE; // 设置全屏显示标志为 TRUE // 进入全屏显示状态 WINDOWPLACEMENT wndpl; wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.flags=0; wndpl.showCmd=SW_SHOWNORMAL; wndpl.rcNormalPosition=m_FullScreenRect; SetWindowPlacement(&wndpl);} 4)重载CMainFrame类的OnGetMinM
3.MFC是如何创建窗口的?
文档/视图应用程序中的类和可视化特性都是由一个文档模板类组织起来进行管理的,单文档使用的文档模板类CSingleDocTemplate类的一个实例在CSDICoinApp::InitInstance函数中生成并使用。
BOOL CSDICoinApp::InitInstance()
{ ……
CSingleDocTemplate* pDocTemplate;
pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CSDICoinDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDICoinView));
AddDocTemplate(pDocTemplate);
CSingleDocTemplate对象被创建,传入4个参数,参数1为资源ID IDR_MAINFRAME,标识了4个独立的资源:应用程序图标、菜单、工具栏、加速键表。剩余3个参数都只指向运行时刻(runtime)的类信息的指针,分别是文档类、框架类、视图类。宏RUMTIME_CLASS用于生成这些指针,AppWizard通过引入宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,包含对动态创建这些类的支持
文档、框架、视图对象本身并不在此时创建,以上只是根据装入资源和分配文档、视图及框架类所必须的信息,来初始化CSingleDocTemplate对象,文档模板就是通常所说的类工厂
文档模板类是类工厂的一个实例,类工厂是一个用来定义如何实例化其他类的一个类,知道如何生成应用程序中指定的类
文档模板本身保存在应用程序类中,通过对AddDocTemplate的调用,在CWinApp类中注册新建立的文档模板对象
CWinApp类保留CSingleDocTemplate的对象,直到将自身销毁,CWinApp类自动清理分配给文档模板的全部内存空间
CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName)
{ if(m_pOnlyDoc!=NULL)
pDocument->SaveModified();
else
{ pDocument=CreateNewDocument();
pFrame=CreateNewFrame(pDocument);
}
pDocument->OnNewDocument();
InitialUpdateFrame(pFrame,pDocument);
}
打开文件则是在定义一个文件后,路径和名称被传递给CSingleDocTemplate类的OpenDocumentFile函数,如果传入空值,创建一个新文档
CWinApp::OnFileNew马上调用CDocManager::OnFileNew函数,在得到一个指向前面创建的CSingleDocTemplate对象的指针,使用这个模板指针,可以调用OpenDocumentFile函数
一个SDI的文档对象仅被创建一次(当OpenDocumentFile第一次被调用时),响应”新建”、”打开”命令时,调用的函数重新初始化打开的文档,以便重用。重新初始化发生在SaveModified中,首先检查文档的更改状态,CDocument类有一个BOOL变量用来标识文档是否被修改过
如果文档被修改过,继续下一步操作之前,会提示用户或保存,或继续但不保存,或取消调用
CreateNewDocument创建文档对象,使用运行时的模板类信息,向当前文档列表加入新文档,框架和视图被CreateNewFrame创建
创建对象后,CFrameWnd::LoadFrame调用,传入模板构造器中指定的资源ID,LoadFrame装入每一个资源(菜单、工具栏、图标、加速键表、字符串),将他们附着在框架窗口中,如果任何一种装载失败,LoadFrame生成一条跟踪信息:CDocTemplate couldn’t create a frame。文档通过OnNewDocument完成初始化
InitialUpdateFrame将新建立的视图激活,向包含视图窗口的框架窗口的子窗口,发送消息WM_INITIALUPDATE
以上都是精华,你要仔细琢磨,
以上就是关于「mfc如何创建窗口」的全部内容,本文讲解到这里啦,希望对大家有所帮助。如果你还想了解更多这方面的信息,记得收藏关注本站~
Win10系统之家文♂章!
上一篇:怎么删除文件管理员权限 下一篇:用英文怎么写地址
相关文章
-
1.怎样使用MFC创建一个窗口类创建一个完整窗口要经历的步骤:1)设计一个窗口类;2)注册窗口类;3)创建窗口;4)显示及更新窗口。第一步:windows已经为用户定义了一个完整的窗口类,用户只需要将各个属性填满既可以。窗口类...
-
1.宽带连接快捷方式怎么创建1、首先打开开始菜单,在开始菜单中打开控制面板,在控制面板中找到网络和internet这个选项,然后单击这个选项,进入网络设置页面。2、在网络和共享中心下面的小链接中,有一个查看网络状态和任...
-
1.如何解决电脑总是弹出交互式服务检测的问题生活中很多人使用电脑,可有些人不知道如何解决电脑总是弹出交互式服务检测的问题,下面快来一起看一看吧。工具/原料演示系统:Windows7系统版本号:build7601方法/步骤1、Win...
-
1.微信公众平台怎么创建及操作步骤微信公众号是可以自己申请注册的。选什么类型看自己需要的功能来选择。1.注册微信公众平台需要在微信公众平台官网进行注册。2.需要的材料有:(1)企业/个体工商户开通服务号或者认证号...