mfc窗口创建过程
- 格式:docx
- 大小:36.52 KB
- 文档页数:1
MFC浮动窗⼝使⽤⽅法和注意事项使⽤VS2008+SP1创建悬浮窗⼝的步骤:1. 创建悬浮窗⼝类每⼀个悬浮窗⼝都是⼀个CDockablePane的派⽣类的对象, 因此要为每⼀个悬浮窗⼝创建⼀个新类1.1 添加类通过菜单Project->Add Class...或者在类视图中⼯程名字处右键选择Add->Class...添加类选择MFC Class, 点Add按钮进⼊下⼀步Class name处写⼊新类的名字, 这⾥⽤CDock, 选择Base class为CDockablePane按Finish按钮, 添加类完成.1.2 添加消息处理函数⼀般⾄少要处理两个消息, ⼀个是WM_CREATE, ⼀个是WM_SIZE, 具体步骤为:(1) 头⽂件中添加函数声明(函数名及参数不可写错)protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnSize(UINT nType, int cx, int cy);(2) cpp⽂件中添加消息映射BEGIN_MESSAGE_MAP(CDock, CDockablePane)ON_WM_CREATE()ON_WM_SIZE()END_MESSAGE_MAP()这⾥BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏都是⾃动⽣成的, 只需要添加中间两⾏代码即可(3) 添加函数实现部分int CDock::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDockablePane::OnCreate(lpCreateStruct) == -1)return -1;// 在这⼉创建控件return 0;}void CDock::OnSize(UINT nType, int cx, int cy){CDockablePane::OnSize(nType, cx, cy);// 这⼉添加代码}1.3 添加控件现在创建的CDock类中由于没有任何控件, 因此如果现在创建该类的对象并显⽰, 该区域中由于全是垃圾数据, 故可能该窗⼝显⽰时为花屏. 如果程序运⾏期间出现类似花屏的问题, ⼤概会有⼏种可能性: 1. 没有创建控件 2. 已创建控件, 但控件位置不对或未覆盖整个的dockablePane 3. 控件虽然占据整个区域, 但不能⾃动刷新这⾥以添加⼀个listBox为例:(1) 在类的头⽂件中添加控件对象, 代码为:protected:CListBox _listBox;(2) 在OnCreate()中添加创建控件窗⼝的代码:这⾥必须要注意, 需要先调⽤基类的函数OnCreate()int CDock1::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDockablePane::OnCreate(lpCreateStruct) == -1)return -1;// 在这⼉创建控件// nID为该控件的ID, 可以⾃⾏设置, 如果对ID不感兴趣, 也可以选择传递0让系统做处理if (!_listBox.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, nID)){TRACE0("创建listbox失败");return -1;}return 0;}(3) 在OnSize中设置各个控件的位置这⾥要注意的是, 需要将控件布满整个窗⼝. 这⾥只有⼀个listBox, 故可以直接⽤listBox覆盖窗⼝.同理, 必须要先调⽤基类函数CDockablePane::OnSize(nType, cx, cy)void CDock::OnSize(UINT nType, int cx, int cy){CDockablePane::OnSize(nType, cx, cy);// 这⼉添加代码if (GetSafeHwnd() == NULL){return;}if (_listBox.GetSafeHwnd() != NULL){CRect rectClient;GetClientRect(rectClient);_listBox.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);}}2. 在程序中添加悬浮窗⼝对象上⾯⼀步只是给⼯程添加了⼀个悬浮窗⼝类, 但并没⽣成该类的实例. 这⾥创建该实例(在CMainFrame类中)2.1 在主框架类声明中添加对象, 代码为:protected:CDock m_wndDock;2.2 创建dockablePane的窗⼝, 在主框架的OnCreate()函数中(注: 这⾥我建议在OnCreate函数中⾃动⽣成代码EnableAutoHidePanes(CBRS_ALIGN_ANY)的后⾯添加)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...EnableAutoHidePanes(CBRS_ALIGN_ANY);// 利⽤这⾥的CBRS_RIGHT来设置最初的窗⼝停靠的位置, 可以的取值是// CBRS_NOALIGN, CBRS_LEFT, CBRS_TOP, CBRS_RIGHT, CBRS_BOTTOMDWORD style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT |CBRS_FLOAT_MULTI;if (!wndDock1.Create(// 该dock窗⼝的标题(如果可以有的话...)_T("Dock1"),// 该dock窗⼝的parent, 设置为thisthis,// 窗⼝的⼤⼩, 注意是"悬浮"的情况下的⼤⼩, 处于dock状态时⼤⼩与该值⽆关CRect(0, 0, 200, 200),// 该dock窗⼝是否有标题, 如果为FALSE, 则第⼀个字符串参数显⽰不出来TRUE,// 该dock窗⼝的ID值. 注意: 如果希望dock窗⼝的状态可以保存在注册表中(这样下次启动程序时仍保持该状态), 则该值必须的唯⼀的nID,//style)){return FALSE;}...}2.3去掉CDockablePane的Close按钮?⽅法⼀:在继承CDockablePane的类中重写CanBeClosed()⽅法:virtual BOOL CanBeClosed() const; ... BOOL COutputWnd::CanBeClosed() const { return FALSE;}⽅法⼆:if (!m_wndView.Create(strFileView, this, CRect(0, 0, 250, 200), TRUE, ID_VIEW_VIEW,WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_HIDE_INPLACE | WS_CAPTION, AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE))在Create的时候后⾯加上这样的参数设置AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE 就不会有那个关闭按钮了2.4显⽰隐藏CDockablePanem_wndFileView.ShowPane(TRUE,FALSE,TRUE);//显⽰m_wndFileView.ShowPane(FALSE,FALSE,TRUE);//隐藏2.5 给悬浮窗⼝添加icon, 暂时省略.3. 设置窗⼝悬浮⽅式, 令窗⼝悬浮3.1 设置窗⼝悬浮位置这部分代码也应该在MainFrame类的OnCreate函数中, ⽽且紧跟创建悬浮窗⼝的后⾯.设置悬浮位置只需要调⽤CDockablePane::EnableDocking即可m_wndDock.EnableDocking(CBRS_ALIGN_ANY);其中, 参数可以是CBRS_ALIGN_TOP, CBRS_ALIGN_RIGHT, CBRS_ALIGN_BOTTOM, CBRS_ALIGN_ANY3.2 令窗⼝悬浮欲使⼀个CDockablePane对象悬浮, 只需要调⽤框架类的DockPane函数即可:DockPane(&m_wndDock);但是若有另外⼀个悬浮窗⼝的对象需要和m_wndDock在⼀起显⽰, 构成⼀个组(就像VS的资源视⼒和类视图), 那么第⼆个悬浮窗⼝需要使⽤CDockablePane类的AttchToTabWnd函数, 代码如下:DockPane(&m_wndDock);CDockablePane *pTabbedBar = NULL;m_wndDock2.AttachToTabWnd(&m_wndDock, DM_SHOW, FALSE, &pTabbedBar);CDockablePane 使⽤这个是转载的int m_nshowCurrent;m_nshowCurrent=theApp.GetProfileInt(_T("Workspace//Pane-377"),_T("IsFloating"),0); //在构造函数中⾸先派⽣两个⼦类,源码就不⽤写出来了,占篇幅,在MainFrm⾥申明如:CCurrentDockablePane m_wndCurrentDockablePane;CHistoryDockablePane m_wndHistoryDockablePane;CDockablePane* m_pTabbedBar;然后在OnCreate()⾥⾯:CString strHistoryDockablePane;CString strCurrentView;strCurrentView.LoadString(IDS_Current_VIEW);strHistoryDockablePane.LoadString(IDS_History_VIEW);if (!m_wndHistoryDockablePane.Create(strHistoryDockablePane, this, CRect(0, 0, 200, 200),TRUE, ID_VIEW_HistoryDockablePane, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)){TRACE0("Failed to create Class View window/n");return FALSE; // failed to create}if (!m_wndCurrentDockablePane.Create(strCurrentView, this, CRect(0, 0, 200, 200),TRUE, ID_VIEW_CurrentView, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT|CBRS_FLOAT_MULTI)){TRACE0("Failed to create File View window/n");return FALSE; // failed to create}再给她们添加图标:HICON hHistoryDockablePaneIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(),MAKEINTRESOURCE(bHiColorIcons ? IDI_history : IDI_history), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON), 0);m_wndHistoryDockablePane.SetIcon(hHistoryDockablePaneIcon, FALSE);HICON hCurrentViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(),MAKEINTRESOURCE(bHiColorIcons ? IDI_Currrently : IDI_Currrently), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON), 0);m_wndCurrentDockablePane.SetIcon(hCurrentViewIcon, FALSE);m_wndHistoryDockablePane.EnableDocking(CBRS_ALIGN_ANY);m_wndCurrentDockablePane.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndHistoryDockablePane);DockPane(&m_wndCurrentDockablePane);m_pTabbedBar = NULL;m_wndCurrentDockablePane.AttachToTabWnd(&m_wndHistoryDockablePane, DM_SHOW, FALSE, &m_pTabbedBar);相关显⽰代码就这样的了.后来⽼⼤说关闭需要修改⼯具栏⾥的显⽰状态,即去掉对勾.在⼯具栏⾥控制他们的显⽰和隐藏简单啊,就是⽤m_wndCurrentDockablePane.ShowPane(TRUE,FALSE,TRUE);可是关闭再去修改⼯具栏想了半天,以为要重载CDockablePane的Close()消息,⼜尝试了他的很多消息,都不对.跟踪进去才知道是调⽤MainFrm来关闭的.⾥⾯有pMainfrm.onCloseDockingPane(this);好了,我就重载这个⽅法.BOOL CMainFrame::OnCloseDockingPane( CDockablePane* pWnd ){CWnd * pfWnd = pWnd->GetFocus();if (*pfWnd == m_wndCurrentDockablePane){m_nshowCurrent = 0;}else if(*pfWnd == m_wndHistoryDockablePane){m_nshowHistory = 0;}return TRUE;}这样⼯具栏⾥⾯的信息就更新了.呵呵,⾼兴的太早了,才做了⼀半,当两个⾯板拆开,即处于浮动状态时关闭根本就不调⽤这⾥.⼜郁闷了半天,还是⽼⼤⽜逼,说那种情况是OnCloseMiniFrame,于是有如下重载:BOOL CMainFrame::OnCloseMiniFrame( CPaneFrameWnd* pWnd ){CWnd *ptWnd = pWnd->GetWindow( GW_CHILD );if (*ptWnd ==m_wndCurrentDockablePane){m_nshowCurrent = 0;}else if (*ptWnd == m_wndHistoryDockablePane){m_nshowHistory = 0;}return TRUE;}//写注册表,在析构函数中theApp.WriteProfileInt(_T("Workspace//Pane-377"),_T("IsFloating"),m_nshowCurrent);。
MFChierarchy chart(类库列表)MFC与Win321 win32:函数,使用API一步一步搭建应用程序。
(常使用FileView操作)2 MFC编程:实现仍然调用API函数,但是是用类封装API函数,使用向导自动生成应用程序框架。
(常使用ClassView操作)2.1需要掌握的技能2.1.1断点调试2.1.2堆栈调用的查看MFC课程内容1 MFC:MFC的六大机制,文档式架构,常用的MFC类,(10--12)。
2 COM(组件对象模型):COM的原理和应用(6)。
3 ADO/Socket:MFC访问数据库以及一些简单的网络编程。
MFC应用程序编程1 MFC的历史:92(VC1)98(VC6)……………………….2 MFC库基础:2.1 MFC库,微软基础类库。
封装了Windows应用程序编程的各种API以及相关机制的C++类库3 类库的相关头文件件★afx-application framework(应用程序框架x)3.1<stdafx.h>-不是类库头文件,是项目的头文件,称为VC下编译的预编译头文件,用来提高编译速度的。
(*.pch)(头文件是不参加编译的但是他参与生成*.pch)3.2<afxwin.h>-几乎包含了各种常用的MFC有文件3.3 <afxext.h>-提供扩展窗口类的支持(创建工具栏,状态栏等………)MFC应用程序的类型1 支持MFC的控制台应用程序(控制台的第四个选项)1.1 多了一个CWinApp(应用程序类,封装类应用程序启动过沉重所涉及到得相关信息)的全局对象(必须有,而且只能有一个)1.2主函数中多了一个AfxWinInit函数,初始化MFC库中的相关信息2 MFC库程序2.1 MFC支持的静态库2.2 MFC支持的动态库2.2.1 MFC规则库(shared MFC DLL)-可以被各种应用程序调用(非MFC程序,没有MFC类也可以调用)★还是有一个CWinApp派生的CMFC_DLLApp类对象2.2.2 MFC扩展库(using shared MFC DLL)-只能被MFC库所编写的应用程序所调用(对原有的MFC类扩展)★DllMain主函数只能被MFC程序调用3 MFC应用程序-----(注意看父类,子类名字可能不一样)3.1单文档视图应用程序★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CMainFrame(父类是:CFrameWnd)(应用程序主框架窗口类-生成应用程序的主框架-负责各个对象的协调工作)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CSingleDocApp(父类是CWinApp)-(使用前面的3个类来创建对象)3.2多文档视图架构★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CMDIChildWnd(子框架窗口类,父类)★CMDIFrameWnd(主框架窗口类,父类)我们看到的子窗体其实是★CView和★CMDIChildWnd叠加的3.3基于对话框的应用程序★CWinApp 应用程序类★CDialog(对话框窗口类)★★m_pMainWnd保存主窗口地址DoModal 显示对话框MFC相关类的说明1继承自CObject1.1 CObject类:绝大多数MFC类的父类,提供了MFC库的一些机制1 new/delete操作符,定义了与构造函数相关的内存分配函数2 assert和dump调试,堆调试的支持★3 运行时类信息-属于哪个类,还有类的层次结构★4 动态创建★5 序列化1.2 CWinThread: 线程类。
visual2017专业版MFC编程环境搭建及第⼀个MFC程序的创建1、MFC介绍及环境搭建MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是⼀个庞⼤的⽂件库,它由指向⽂件和源⽂件组成。
⾸先,打开visual2017,进⾏如下操作: 此时,会发现新建项⽬中⽆法找到创建MFC⼯程 这是因为没有配置MFC开发环境,关闭visual studio打开visual studio installer 选择修改,可以打开如下窗⼝ 勾选后,点击修改,此时就进⼊了安装界⾯,这⾥需要等待15分钟左右2、利⽤向导⽣成MFC应⽤程序 修改完成后,点击启动,新建项⽬可以看到MFC已经添加到了visual studio了 点进MFC后,选择⽂件路径,创建项⽬名⽂件名后点击确定 既可以进⼊MFC应⽤程序的类型配置界⾯应⽤程序类型:单⽂件:为应⽤程序创建⼀个单⽂档界⾯(SDI)结构。
在此类应⽤程序中,⽂档的框架窗只能容纳⼀个⽂档。
多⽂件:为应⽤程序创建⼀个多⽂档界⾯(MDI)结构。
在此类应⽤程序中,⽂档的框架窗可以容纳多个⽂档。
选项卡式⽂档:将每个⽂档放置到单独的选项卡上。
基于对话框:为应⽤程序创建⼀个基于对话框的结构。
使⽤HTML对话框:只适⽤与对话框应⽤程序。
从CDHtmlDialogClass(⽽不是CDialogClass)派⽣对话框类。
多个顶级⽂档:为应⽤程序创建⼀个多顶级结构。
在此类应⽤程序中,当单击【⽂件】菜单上的【新建】时。
应⽤程序会创建⼀个其⽗窗⼝隐式为桌⾯的窗⼝。
新的⽂档框架会显⽰在任务栏中,并且不局限于应⽤程序窗⼝的⼯作区。
然后单击【⽣成】->【⽣成解决⽅案】单击【调试】->【开始执⾏】运⾏完成后打开项⽬所在⽂件夹->Debug⽂件夹,可以看到⽣成的.exe⽂件双击.exe⽂件可以看到运⾏结果。
3、项⽬的⽂件组织1、解决⽅案和项⽬⽂件 通过调试后,解决⽅案的⽂件夹下包含:.sdf⽂件、.sln⽂件、.suo⽂件和.ipch⽂件夹。
如何使⽤visualstudio2019创建简单的MFC窗⼝(使⽤C++)本⽂介绍了如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)```cpp使⽤visual studio 2019 创建过程请参考Bili的上⼀篇⽂章⬇⬇→!使⽤visual studio 2019 创建简单的MFC窗⼝「使⽤底层的C语⾔」#include<windows.h> //底层实现窗⼝的头⽂件//6.处理窗⼝过程//CALLBACK 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈LRESULT CALLBACK WindowProc(HWND hand, //消息所属窗⼝句柄UINT uMsg, //具体消息名称 WM_XXXX消息名WPARAM wParam, //键盘附加消息LPARAM lParam) { //⿏标附加消息switch (uMsg){case WM_CLOSE://所有以XXXXWindow为结尾的⽅法,都不会进⼊到消息队列中,⽽是直接执⾏DestroyWindow(hand);//发送另⼀个消息WM_DESTROYbreak;case WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN://⿏标左键按下{int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);char buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos);MessageBox(hand, buf, TEXT("按下⿏标左键"), MB_OK);break;}case WM_KEYDOWN: //键盘{MessageBox(hand, TEXT("键盘"), TEXT("按下键盘"), MB_OK);break;}case WM_PAINT: //画图{PAINTSTRUCT ps; //画图结构体HDC hdc = BeginPaint(hand, &ps);TextOut(hdc, 100, 100,TEXT("hello"), strlen("hello"));EndPaint(hand, &ps);break;}default:break;}//返回值⽤默认处理⽅式return DefWindowProc(hand, uMsg, wParam, lParam);}/*程序⼊⼝函数_In_ HINSTANCE hInstance,//应⽤程序实例句柄_In_opt_ HINSTANCE hPrevInstance,//上⼀个应⽤程序句柄,在WIN32环境下⼀般为NULL,不起作⽤了_In_ LPSTR lpCmdLine,//char * argv[]_In_ int nShowCmd//显⽰命令最⼤化、最⼩化、正常WINAPI 代表_stdcall 参数的传递顺序:从右到左依次⼊栈,并且函数返回前清空堆栈*/int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {/*1.设计窗⼝2.注册窗⼝3.创建窗⼝4.显⽰和更新5.通过循环取消息6.处理消息(窗⼝过程)*///1.设计窗⼝WNDCLASS wc;wc.cbClsExtra = 0; //类的额外的内存wc.cbWndExtra = 0; //窗⼝额外的内存wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,如果第⼀个参数为null,代表使⽤系统提供的光标wc.hIcon = LoadIcon(NULL, IDI_ERROR); //图标,如果第⼀个参数为null,代表使⽤系统提供的图标wc.hInstance = hInstance; //应⽤程序的实例句柄,传⼊winmain的形参即可wc.lpfnWndProc = WindowProc; //回调函数窗⼝过程wc.lpszClassName = TEXT("WIN"); //指定窗⼝名称wc.lpszMenuName = NULL; //菜单名称wc.style = 0; //显⽰风格,0代表默认//2.注册窗⼝RegisterClass(&wc);//3.创建窗⼝/*lpszClassName,//类名lpWindowName, //标题名dwStyle, //风格 WC_OVERLAPPEDWINDOWx, //坐标 CW_USERDEFAULTy, //坐标nWidth, //宽nHeight, //⾼hWndParent, //⽗窗⼝ nullhMenu, //菜单 nullhInstance, //实例句柄lpParam //附加值⿏标附加值*/HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //4.显⽰和更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);/*HWND hwnd; //主窗⼝句柄UINT message; //具体消息名称WPARAM wParam; //附加消息键盘消息LPARAM lParam; //附加消息⿏标消息DWORD time; //消息产⽣时间POINT pt;*/ //附加消息⿏标消息 x,y//5.通过循环取消息MSG msg;/*_Out_ LPMSG lpMsg, //消息_In_opt_ HWND hWnd, //捕获窗⼝填null表⽰捕获所有窗⼝_In_ UINT wMsgFilterMin, //最⼤和最⼩的过滤消息⼀般填0_In_ UINT wMsgFilterMax);*/while (GetMessage(&msg, NULL, 0, 0)){/*if (GetMessage(&msg, NULL, 0, 0) == FALSE) {break;}*///翻译消息TranslateMessage(&msg);//不是false//分发消息DispatchMessage(&msg);}return 0;}划重点:项⽬->属性->常规->⾼级->将MFC的使⽤设置为在“共享dll中使⽤mfc”头⽂件mfc.h#include <afxwin.h>//mfc头⽂件class MyApp:public CWinApp{public:virtual BOOL InitInstance();};class MyFrame :public CFrameWnd {//窗⼝框架类public:MyFrame();//声明宏提⽰消息映射机制DECLARE_MESSAGE_MAP();afx_msg void OnLButtonDown(UINT,CPoint);afx_msg void OnChar(UINT,UINT,UINT);afx_msg void OnPaint();};源⽂件mfc.cpp#include “mfc.h”MyApp app;BOOL MyApp::InitInstance() {//创建窗⼝MyFrame* frame = new MyFrame;//显⽰和更新frame->ShowWindow(SW_SHOWNORMAL);frame->UpdateWindow();m_pMainWnd = frame;//保存指向应⽤程序的主窗⼝的指针return TRUE;//返回正常初始化}//分界宏BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)ON_WM_LBUTTONDOWN()//⿏标左键按下ON_WM_CHAR()ON_WM_PAINT()END_MESSAGE_MAP()MyFrame::MyFrame(){Create(NULL,TEXT(“windows”));}void MyFrame::OnLButtonDown(UINT, CPoint point){//TCHAR buf[1024];//wsprintf(buf, TEXT(“x = %d,y = %d”), point.x, point.y);//MessageBox(buf);CString str;str.Format(TEXT(“x = %d,y = %d”),point.x,point.y);MessageBox(str);}void MyFrame::OnChar(UINT key, UINT, UINT){CString str;str.Format(TEXT(“按下了%c键”),key);MessageBox(str);}void MyFrame::OnPaint(){CPaintDC dc(this);dc.TextOutW(100,100,TEXT(“为了部落”));dc.Ellipse(10,10,100,100);}到此这篇关于如何使⽤visual studio2019创建简单的MFC窗⼝(使⽤C++)的⽂章就介绍到这了,更多相关vs2019创建MFC窗⼝内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
登录对话框我们利用MFC编写一个简单的登录对话框。
主窗体是单文档界面。
程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。
1、开打VC++6.0。
点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。
2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。
3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。
如果没有问题,我们继续。
点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。
4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。
输入用户名:。
然后回车同样在下面的第二个静态文本框的属性标题改为:输入密码:。
然后回车。
6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。
同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。
然后弹出选择建立Create a new class,点击OK。
这是为这个对话框创建一个新的类。
在Name中,为该对话框类取个名字:CDlg_login。
下面的Base class以及Dialog ID不要随便改动。
然后点击OK。
这样新的类CDlg_login就与本对话框建立起了联系。
8、点击OK后,我们并没有退出建立类向导。
点击member variables。
9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。
其他地方不要改动。
MFC创建窗口一般要经历以下四个操作步骤:(1) 定义窗口类主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,WNDCLASS的定义如下:typedef struct _WNDCLASS {UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;} WNDCLASS;(2) 注册窗口类窗口类经过第一步后,需要调用RegisterClass函数进行注册,注册成功后就可以创建此类型的窗口。
函数原型如下:ATOM RegisterClass(CONST WNDCLASS *lpWndClass // address of structure with class// data);(3) 创建窗口类实例注册完窗口类过后,就可以创建窗口类的实例了,创建窗口类的实例了,函数原型如下:HWND CreateWindow(LPCTSTR lpClassName, // pointer to registered class nameLPCTSTR lpWindowName, // pointer to window nameDWORD dwStyle, // window styleint x, // horizontal position of windowint y, // vertical position of windowint nWidth, // window widthint nHeight, // window heightHWND hWndParent, // handle to parent or owner windowHMENU hMenu, // handle to menu or child-window identifierHANDLE hInstance, // handle to application instanceLPVOID lpParam // pointer to window-creation data);(4) 显示及更新窗口当然创建窗口过后就可以调用ShowWindow()来显示窗口了。
mfc窗口创建过程
MFC窗口的创建过程包括以下几个步骤:
1. 定义窗口类:首先需要定义一个派生自CWnd类的窗口类,该类是窗口的实例。
可以在应用程序的头文件中声明该类,并在源文件中实现其成员函数。
2. 注册窗口类:在应用程序的初始化阶段,需要调用AfxRegisterClass函数来注册窗口类,该函数会将窗口类的信息添加到注册表中。
3. 创建窗口:在初始化阶段,还需要创建窗口实例。
可以通过调用Create函数来创建一个新的窗口。
在调用Create函数之前,需要设置一些窗口的属性,如标题、大小、样式等。
4. 响应消息:窗口创建后,会进入一个消息循环。
在消息循环中,窗口会不断接收和处理消息。
可以通过覆盖窗口类的OnXXX函数来响应不同的消息,如OnPaint函数来处理窗口绘制消息。
5. 显示窗口:当窗口创建并响应消息后,需要调用ShowWindow 函数来显示窗口。
可以通过传入SW_SHOW参数来显示窗口。
以上就是MFC窗口的创建过程,通过这些步骤可以创建和管理窗口的实例,并实现窗口的功能。