最简单MFC

合集下载

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。

在此基础上,我们可以利用MFC来实现简单的网络聊天程序。

首先,我们需要创建一个MFC应用程序项目。

使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。

然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。

接下来,我们需要使用Socket编程来实现网络通信功能。

MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。

在对话框类中添加成员变量m_socket,类型为CSocket。

在OnInitDialog函数中,我们需要创建Socket,并进行连接。

可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。

例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。

然后,我们需要添加事件处理函数来处理发送和接收消息。

当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。

可以使用CString类来处理字符串数据。

当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。

为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。

当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。

在程序结束时,我们需要断开连接并销毁Socket对象。

在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。

除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。

这些可以根据实际需求进行扩展。

总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。

MFC编程基础

MFC编程基础

9
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project Empty project 在共享 DLL 中使用 MFC
10
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project,Empty project,在共享 DLL 中使用 MFC
2 最简单的MFC应用程序
2 最简单的MFC应用程序
13
2 最简单的MFC应用程序


WinMain()函数,由MFC库后台自动提供; CWinApp类:



对基于MFC的程序重要,其对象包括启动、初始化、运行 和关闭应用程序所需的一切代码。 需要由CWinApp派生出工程自己的应用程序类 虚函数InitInstance(),需要重写,包含创建和显示应用程序 窗口的代码,由WinMain()函数调用; 该类继承的其它成员不变。


2014-5-17
26
消息映射例 class CSketcherApp : public CWinAppEx { public: 为了使用消息映射宏,还需要在类声明 的结尾用DECLARE_MESSAGE_MAP宏, CSketcherApp(); 该宏对类实现源文件中所定义的消息映 // 重写 射进行初始化。 public: virtual BOOL InitInstance(); virtual int ExitInstance(); // 实现 UINT m_nAppLook; virtual void PreLoadState(); 用于区分消息处 virtual void LoadCustomState(); 理函数和类中 virtual void SaveCustomState();

如何使用visualstudio2019创建简单的MFC窗口(使用C++)

如何使用visualstudio2019创建简单的MFC窗口(使用C++)

如何使⽤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的一个简单计算器

基于MFC的一个简单计算器

基于MFC的⼀个简单计算器写⼀个简单的计算器并不是什么很难的事,主要⽬的是要通过这个程序来学习和分析其中的核⼼算法。

这个简易计算器的核⼼部分就是对输⼊的表达式的正确性判断与求值,其中包括对表达式的解析、中缀表达式转后缀表达式、后缀表达式求值等等⼏个⽅⾯。

⼀、封装核⼼代码《》和《》这两篇⽂章已经对核⼼算法部分进⾏了讲解,并附有源码。

在此基础上制作⼀个简单计算器,我们要做的仅仅是封装核⼼代码并加⼊MFC⼯程中。

下⾯是我封装的⼀个 Expression 类:Expression.h#pragma once#include <iostream>#include <sstream>#include <string>#include <vector>#include <stack>#include <utility>using namespace std;class Expression{public:Expression(string str);bool test(); // 外部接⼝,判断表达式是否合法double calculate(); // 外部接⼝,计算表达式的值private:vector<pair<string, int>> word;string expr; // 算术表达式int idx; // word下标int sym; // 单词种别编码int err; // 错误int word_analysis(vector<pair<string, int>>& , const string);void Next();void E();void T();void F();bool Right; // 保存表达式test结果private:int prior(int); // 获取运算符的优先级bool isOperator(int); // 通过种别编码判定是否是运算符vector<pair<string,int>> getPostfix(const vector<pair<string,int>>&); // 中缀转后缀void popTwoNumbers(stack<double>&, double&, double&); // 从栈中连续弹出两个操作数double stringToDouble(const string&); // 把string转换为doubledouble expCalculate(const vector<pair<string, int>>&); // 计算后缀表达式的值};Expression.cpp#include "Expression.h"// 构造函数Expression::Expression( string str ):expr(str),idx(0),err(0),Right(true){}// 外部接⼝bool Expression::test(){return Right;}int err_num = word_analysis(word, expr);if (-1 == err_num){Right = false;}else{// 词法正确,进⾏语法分析Next();E();if (sym == 0 && err == 0) // 注意要判断两个条件Right = true;elseRight = false;}return Right;}// 外部接⼝double Expression::calculate(){if (test()){return expCalculate(getPostfix(word));}else{exit(0);}}/*--------------------------------词法分析----------------------------*/int Expression::word_analysis(vector<pair<string, int>>& word, const string expr) {for(int i=0; i<expr.length(); ++i){// 如果是 + - x ÷ ( )if(expr[i] == '(' || expr[i] == ')' || expr[i] == '+'|| expr[i] == '-' || expr[i] == '*' || expr[i] == '/'){string tmp;tmp.push_back(expr[i]);switch (expr[i]){case '+':word.push_back(make_pair(tmp, 1));break;case '-':word.push_back(make_pair(tmp, 2));break;case '*':word.push_back(make_pair(tmp, 3));break;case '/':word.push_back(make_pair(tmp, 4));break;case '(':word.push_back(make_pair(tmp, 6));break;case ')':word.push_back(make_pair(tmp, 7));break;}}// 如果是数字开头else if(expr[i]>='0' && expr[i]<='9'){string tmp;while(expr[i]>='0' && expr[i]<='9'){tmp.push_back(expr[i]);++i;}if(expr[i] == '.'){++i;if(expr[i]>='0' && expr[i]<='9'){tmp.push_back('.');tmp.push_back(expr[i]);++i;}}else{return -1; // .后⾯不是数字,词法错误}}word.push_back(make_pair(tmp, 5));--i;}// 如果以.开头else{return -1; // 以.开头,词法错误}}return 0;}/*--------------------------------语法分析----------------------------*/ // 读下⼀单词的种别编码void Expression::Next(){if(idx < word.size())sym = word[idx++].second;elsesym = 0;}// E → T { +T | -T }void Expression::E(){T();while(sym == 1 || sym == 2){Next();T();}}// T → F { *F | /F }void Expression::T(){F();while(sym == 3 || sym == 4){Next();F();}}// F → (E) | dvoid Expression::F(){if (sym == 5){Next();}else if(sym == 6){Next();E();if (sym == 7){Next();}else{err = -1;}}else{err = -1;}}/*--------------------------------求值部分----------------------------*/ int Expression::prior(int sym){case 1:case 2:return 1;case 3:case 4:return 2;default:return 0;}}bool Expression::isOperator(int sym){switch (sym){case 1:case 2:case 3:case 4:return true;default:return false;}}vector<pair<string,int>> Expression::getPostfix( const vector<pair<string,int>>& expr){vector<pair<string, int>> output; // 输出stack<pair<string, int>> s; // 操作符栈for(int i=0; i<expr.size(); ++i){pair<string, int> p = expr[i];if(isOperator(p.second)){while(!s.empty() && isOperator(s.top().second) && prior(s.top().second)>=prior(p.second)) {output.push_back(s.top());s.pop();}s.push(p);}else if(p.second == 6){s.push(p);}else if(p.second == 7){while(s.top().second != 6){output.push_back(s.top());s.pop();}s.pop();}else{output.push_back(p);}}while (!s.empty()){output.push_back(s.top());s.pop();}return output;}void Expression::popTwoNumbers( stack<double>& s, double& first, double& second ){first = s.top();s.pop();second = s.top();s.pop();}double Expression::stringToDouble( const string& str ){double d;stringstream ss;ss << str;ss >> d;return d;double Expression::expCalculate( const vector<pair<string,int>>& postfix ){double first,second;stack<double> s;for(int i=0; i<postfix.size(); ++i){pair<string,int> p = postfix[i];switch (p.second){case 1:popTwoNumbers(s, first, second);s.push(second+first);break;case 2:popTwoNumbers(s, first, second);s.push(second-first);break;case 3:popTwoNumbers(s, first, second);s.push(second*first);break;case 4:popTwoNumbers(s, first, second);s.push(second/first);break;default:s.push(stringToDouble(p.first));break;}}double result = s.top();s.pop();return result;}使⽤⽅法(测试):int main(){Expression e("(1.5+2.5)*2+0.53");if(e.test()) // 判断表达式是否合法cout << e.calculate() << endl;return 0;}⼆、加⼊MFC⼯程OK,核⼼代码(表达式的合法性判断与求值)已经封装到 Expression 类中,下⾯要做的就是新建⼀个 MFC ⼯程,并把 Expression 类加⼊⼯程⾥,并实现按钮的功能就⾏了。

MFC简单的登录对话框

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单文档例子

mfc单文档例子

mfc单文档例子以下是一个简单的MFC单文档(SDI)应用程序的示例:1. 首先,创建一个新的MFC应用程序项目。

在Visual Studio中,选择“文件”菜单,然后选择“新建”->“项目”。

在“新建项目”对话框中,选择“MFC应用程序”,然后输入项目名称和位置,并单击“确定”。

2. 在“MFC应用程序向导”中,选择“单文档”作为应用程序类型,并单击“完成”按钮。

3. 在生成的代码中,找到`CMainFrame`类。

这是应用程序的主窗口类。

4. 在`CMainFrame`类的`OnCreateClient`函数中,添加以下代码:```cppvoid CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext pContext){// 创建视图窗口m_(_T("My View"), WS_CHILD WS_VISIBLE WS_BORDERWS_HSCROLL WS_VSCROLL, CRect(0, 0, 800, 600), this,ID_VIEW_WIN);}```5. 在`CMainFrame`类的`OnCreate`函数中,添加以下代码:```cppBOOL CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;// 创建工具栏和状态栏CToolBarCtrl tb;CRect rect(0, 0, 800, 24);(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPERCBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPER CBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(this);m_(0, ID_VIEW_STATUSBAR, SBPS_STRETCH, 0);m_(1, ID_VIEW_STATUSBAR2, SBPS_STRETCH, 0);m_(2, ID_VIEW_STATUSBAR3, SBPS_STRETCH, 0);m_(0, SBPS_NORMAL);m_(1, SBPS_NORMAL);m_(2, SBPS_NORMAL);m_(0, _T("Ready"));m_(1, _T("Ready"));m_(2, _T("Ready"));return TRUE;}```6. 编译并运行应用程序。

MFC中简单的文本显示

MFC中简单的文本显示

简单的文本显示在屏幕上显示文本最简单的、最快捷的方法莫过于使用设备环境中的成员函数TextOut()。

该函数要求传递参数x坐标和y坐标来确定起始的文本输出位置,另外还需要一个CString型的参数来保存待显示的文本。

与TextOut()类似的实现文本显示的功能函数还有好几个。

TabbedTextOut()函数能够实现制表字符。

PollyTextOut()函数可以通过一次函数调用来显示一个字符串数组。

ExtTextOut()函数允许你指定一些附加的参数来决定文本以何种样式显示。

设置文本对齐方式通过函数SetTextAlign(),你可以将文本设定围绕某一个指定点以不同的对齐方式对齐。

该设备环境的成员函数使用一系列的标志来确定文本的对齐方式,以及显示文本之后光标如何更新。

矩形中文本的剪裁函数ExtTextOut()是TextOut()跟复杂、也更高级的形式。

可以通过传递一个“ETO_CLIPPED”的标志让他来实现文本的剪裁。

和TextOut()函数一样,ExtTextOut()需要x坐标和y坐标作为头两个参数。

你可以传递两个标志值,作为的三个参数,如ETO_CLIPPED 表示剪裁。

你还可以将ETO_CLIPPED标志和ETO_OPAQUE标志组合起来,这时即使已经设置为透明模式,你也可以使用不透明的文本。

如果你想既不想剪裁,也不需要显示不透明文本,你可以用0作为第三个参数。

第四个参数需要一个CRect类型的对象,如果在第三个参数中你设置了剪裁标志,函数将用这个矩形来剪裁文本。

第五个参数是待显示的文本(保存在一个CString类型的对象中)。

最后,你可以传一个空的字符数组作为第六个参数,这个参数也可以是一个空指针(NULL)。

用CreateFont()函数创建字体CreateFont()函数的参数BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bltalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecison, BYTE nClipPrecison, BYTE nQuality, BYTE nPitchAndFamity, LPCSTR lpszFacename );设置字体的高度和宽度CreateFont()函数的前两个参数决定了字体的高度和宽度。

Visual C++ MFC 简易教程

Visual C++ MFC 简易教程

Visual C++ MFC 简明教程原著:Marshall Brain 编译:张圣华第一部分:MFC导论V isual C++ 不仅仅是一个编译器。

它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。

为了能充分利用这些特性,你必须理解C++ 程序设计语言。

掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。

该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。

这种层次结构适用于所有版本的Windows 并彼此兼容。

你用MFC 所建立的代码是完全可移植的。

该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。

在本节中,你将会输入、编译和运行一个简单的MFC程序。

下一节中将向你详细解释这些代码。

第三部分讨论了MFC控制和如何定制它们。

第四部分将介绍消息映射,你将会处理MFC的事件。

什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。

首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。

Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。

要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。

传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。

这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。

下一步,是要实现代码。

为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。

使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。

该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。

对于Windows NT, API 被称为“Win32 API”,以区别于其用于Windows 3.1的16位API。

MFC入门教程

MFC入门教程

MFC入门教程目录+-- 第一章 VC入门|------ 1.1 如何学好VC|------ 1.2 理解Windows消息机制|------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍|------ 1.5 MFC中常用类,宏,函数介绍+-- 第二章图形输出|------ 2.1 和GUI有关的各种对象|------ 2.2 在窗口中输出文字|------ 2.3 使用点,刷子,笔进行绘图|------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式|------ 2.6 多边形和剪贴区域+-- 第三章文档视结构|------ 3.1 文档视图框架窗口间的关系和消息传送规律|------ 3.2 接收用户输入|------ 3.3 使用菜单|------ 3.4 文档,视,框架之间相互作用|------ 3.5 利用序列化进行文件读写|------ 3.6 MFC中所提供的各种视类介绍+-- 第四章窗口控件|------ 4.1 Button|------ 4.2 Static Box|------ 4.3 Edit Box|------ 4.4 Scroll Bar|------ 4.5 List Box/Check List Box|------ 4.6 Combo Box/Combo Box Ex|------ 4.7 Tree Ctrl|------ 4.8 List Ctrl|------ 4.9 Tab Ctrl|------ 4.A Tool Bar|------ 4.B Status Bar|------ 4.C Dialog Bar|------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window|------ 4.F 关于WM_NOTIFY的使用方法+-- 第五章对话框|------ 5.1 使用资源编辑器编辑对话框|------ 5.2 创建有模式对话框|------ 5.3 创建无模式对话框|------ 5.4 在对话框中进行消息映射|------ 5.5 在对话框中进行数据交换和数据检查|------ 5.6 使用属性对话框|------ 5.7 使用通用对话框|------ 5.8 建立以对话框为基础的应用|------ 5.9 使用对话框作为子窗口+-- 第六章网络通信开发|------ 6.1 WinSock介绍|------ 6.2 利用WinSock进行无连接的通信+------ 6.3 利用WinSock建立有连接的通信《Visual C++开发指南》闻怡洋/文第一章 VC入门1.1 如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。

MFC教程

MFC教程

01章用向导创建文档窗口MFC教程是小雅最怕写的内容,除了水平问题之外,还有一点就是,MFC将许多程序封装起来,使众多程序员在编程时,即使编出了程序,也不知究竟为什么这样就可以了。

这一现象使小雅想到当今的Java程序员,许多人在开发外包项目时,因为整个FrameWork已经建成,自己只是担当其中一部分功能,出了BUG之后,找原因非常困难。

在SDK教程中,小雅将各种功能进行详细解说,而MFC教程中,只是用例子来讲解MFC的原理,学会原理之后,就会感到MFC比SDK编程省了许多事。

小雅在SDK教程中,为了讲明API功能,用的方法都是C语言的方法,而MFC用的全是C++的内容,因此,学习MFC必须对C++有较深的了解,不会C语言、C++语言而能够学会MFC的人只能是吹牛。

小雅的“C语言教程”和“C++语言教程”都是按照标准C/C++来写的,在Unix、Linux、Windows都适用,这是很重要的基础。

SDK教程主要是让初学者明白WindowsAPI的功能,以及程序的实现方法,基本上是“C语言+ API”,而MFC基本上是“C++ + API”。

SDK编程和MFC是可以相互转化,相互调用的,因为MFC 封装了绝大部分API,但不是所有的API函数。

注意:SDK并不是只能用C语言来写,用C++一样编程,小雅在作教程时为了把内容说清楚,同时兼顾不会C++的人员才使用C语言。

对于初学者,小雅建议在C/C++的基础上用MFC来编程,一是省去了很多编程,二是用上了C++的面向对象编程的思想。

当今要找一个C++的项目来一边做一边学是很困难的。

小雅自己也一直想找一个C++的工作而未能如愿。

通过学习MFC 再反过来加强一下学的不是很深的C++,不是很好的一个方法吗?不过,MFC和SDK与C/C++不同点在消息事件处理方面,初学者要学会这一内容。

关于“”有“托管”和“非托管”二种编程方式,小雅的SDK教程和MFC教程全部是“非托管”编程,也就是传统编程。

mfc项目开发实例85个

mfc项目开发实例85个

mfc项目开发实例85个全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Classes)是一种面向Windows操作系统开发的图形用户界面应用程序框架,它是微软公司推出的一种软件开发工具,为开发人员提供了一系列类和函数,用于快速、简便地创建Windows应用程序。

在本文中,我们将介绍一些MFC项目开发的实例,希望对MFC开发者有所启发和帮助。

一、MFC项目开发实例之文件操作1. 创建一个MFC项目,实现文件的读取和写入功能。

可以通过CFile类来实现文件的打开、读取、写入和关闭操作。

2. 创建一个MFC项目,实现文件夹的遍历和文件的拷贝功能。

可以使用CFileFind类来查找文件和文件夹,使用CopyFile函数来实现文件的拷贝。

6. 创建一个MFC项目,实现数据库连接和查询功能。

可以使用CDatabase类和CRecordset类来连接数据库和执行SQL查询。

11. 创建一个MFC项目,实现多文档视图窗口的创建和切换功能。

可以通过CMDIChildWnd类和CDocument类来创建多文档视图窗口。

12. 创建一个MFC项目,实现对话框的创建和控件的添加功能。

可以通过CDialog类和CWnd类来创建对话框,使用CButton类、CEdit类和CListCtrl类等控件来添加在对话框中。

13. 创建一个MFC项目,实现菜单和工具栏的添加和事件处理功能。

可以通过CMenu类和CToolBar类来添加菜单和工具栏,使用消息映射来处理菜单和工具栏事件。

14. 创建一个MFC项目,实现状态栏和进度条的显示和更新功能。

可以通过CStatusBar类和CProgressCtrl类来创建状态栏和进度条,使用SetPaneText和SetPos函数来更新状态栏和进度条。

15. 创建一个MFC项目,实现动画和图像显示功能。

可以使用CImageList类和CAnimateCtrl类来实现动画和图像的显示。

简易计算器MFC程序

简易计算器MFC程序

1、编写一个对话框应用程序,添加三按钮,三文本编辑框,实现加、减、乘、除简单运算,并实现编辑框的文本复制、粘贴、清空;程序代码:实验4View.cppvoid C实验4View::OnModelDialog(){CMyDlg dlg;dlg.DoModal();}void C实验4View::OnModellessDialog(){CMyDlg *pDlg=new CMyDlg;pDlg->Create(IDD_DIALOG1,this);pDlg->ShowWindow(SW_SHOW);}MyDlg.hpublic:CEdit m_edit1;CEdit m_edit2;CEdit m_edit3;CEdit m_edit4;CEdit m_edit5;afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedSubtact();afx_msg void OnBnClickedMultiply();afx_msg void OnBnClickedDivide();afx_msg void OnBnClickedClearwrite();afx_msg void OnBnClickedClearsave();afx_msg void OnBnClickedCopy();afx_msg void OnBnClickedPaste();afx_msg void OnEnSetfocusEdit4();afx_msg void OnEnSetfocusEdit5();};MyDlg.cppint nEDITtemp;//全局变量BEGIN_MESSAGE_MAP(CMyDlg, CDialog)ON_BN_CLICKED(IDM_ADD, &CMyDlg::OnBnClickedAdd)ON_BN_CLICKED(IDM_SUBTACT, &CMyDlg::OnBnClickedSubtact)ON_BN_CLICKED(IDM_MULTIPLY, &CMyDlg::OnBnClickedMultiply)ON_BN_CLICKED(IDM_DIVIDE, &CMyDlg::OnBnClickedDivide)ON_BN_CLICKED(IDM_CLEARWRITE, &CMyDlg::OnBnClickedClearwrite) ON_BN_CLICKED(IDM_CLEARSAVE, &CMyDlg::OnBnClickedClearsave) ON_BN_CLICKED(IDM_COPY, &CMyDlg::OnBnClickedCopy)ON_BN_CLICKED(IIDM_PASTE, &CMyDlg::OnBnClickedPaste)ON_EN_SETFOCUS(IDC_EDIT4, &CMyDlg::OnEnSetfocusEdit4)ON_EN_SETFOCUS(IDC_EDIT5, &CMyDlg::OnEnSetfocusEdit5)END_MESSAGE_MAP()// CMyDlg 消息处理程序void CMyDlg::OnBnClickedAdd()//加法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;int i=0;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 =_tstof(ch1);num2 =_tstof(ch2);num3 = num1 + num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedSubtact()//减法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 - num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedMultiply()//乘法// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 * num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedDivide()//除法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 / num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedClearwrite()//初始化编辑框数据{// TODO: 在此添加控件通知处理程序代码m_edit1.SetSel(0,-1);m_edit1.Clear();m_edit2.SetSel(0,-1);m_edit2.Clear();m_edit3.SetSel(0,-1);m_edit3.Clear();}void CMyDlg::OnBnClickedClearsave()//初始化保存框数据{// TODO: 在此添加控件通知处理程序代码m_edit4.SetSel(0,-1);m_edit4.Clear();m_edit5.SetSel(0,-1);m_edit5.Clear();}void CMyDlg::OnBnClickedCopy()//复制// TODO: 在此添加控件通知处理程序代码m_edit3.SetSel(0,-1);m_edit3.Copy();}void CMyDlg::OnBnClickedPaste()//粘贴{// TODO: 在此添加控件通知处理程序代码if (nEDITtemp==1)m_edit4.Paste();else if(nEDITtemp==2)m_edit5.Paste();}void CMyDlg::OnEnSetfocusEdit4()//判断光标是否在SAVEREASULT1指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=1;}void CMyDlg::OnEnSetfocusEdit5()//判断光标是否在SAVEREASULT2指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=2;}运行结果:。

MFC实现简单的网络聊天室

MFC实现简单的网络聊天室

MFC实现简单的网络聊天室
一、客户端界面是由MFC AppWizard(exe)生成的基于对话框的程序,由登陆、注册、主窗口、聊天窗口、系统设置窗口组成。

二、实现了基本的注册、登陆、私聊、信息群发、字体、颜色设置、聊天记录保存功能、聊天记录保存路径设置功能、查看及删除历史聊天记录功能、查看好友信息功能。

由于测试条件有限,信息群发功能未经测试。

私聊功能通过了服务器端实现的模拟测试。

在实现过程中参考了孙鑫老师的C++视频及网上相关资料。

以下是运行截屏图片,聊以自勉。

虽然做的很粗糙,但自己是一个windows程序初学者,以前一直做嵌入式linux底层开发,因此看到自己的“成果”还是满有成功感的。

面向对象程序设计与mfc编程案例教程

面向对象程序设计与mfc编程案例教程

面向对象程序设计与mfc编程案例教程面向对象程序设计与MFC编程是软件开发中常用的两种技术,通过这两种技术可以更好地进行软件的设计和开发。

下面是一些以面向对象程序设计与MFC编程为题的案例教程,帮助读者更好地理解和应用这两种技术。

1. 图书管理系统案例:通过面向对象程序设计的思想,设计一个图书管理系统。

系统包括图书的增删改查功能,读者的借阅还书功能,管理员的权限管理功能等。

通过MFC编程实现系统的界面和交互。

2. 酒店管理系统案例:利用面向对象程序设计的思想,设计一个酒店管理系统。

系统包括客房的预订、入住、退房功能,员工的工资管理、排班管理功能等。

通过MFC编程实现系统的界面和交互。

3. 学生成绩管理系统案例:采用面向对象程序设计的思想,设计一个学生的成绩管理系统。

系统包括学生信息的录入、成绩的录入和查询功能,以及成绩统计和分析功能。

通过MFC编程实现系统的界面和交互。

4. 邮件客户端案例:利用面向对象程序设计的思想,设计一个简单的邮件客户端。

系统包括收发邮件的功能,邮件的查看和回复功能,以及邮件的分类和搜索功能。

通过MFC编程实现系统的界面和交互。

5. 聊天室案例:采用面向对象程序设计的思想,设计一个简单的聊天室。

系统包括用户的注册和登录功能,用户之间的消息发送和接收功能,以及实时在线用户列表等功能。

通过MFC编程实现系统的界面和交互。

6. 计算器案例:以面向对象程序设计的思想,设计一个简单的计算器。

系统包括基本的加减乘除功能,以及括号和优先级运算的支持。

通过MFC编程实现系统的界面和交互。

7. 文件管理器案例:采用面向对象程序设计的思想,设计一个简单的文件管理器。

系统包括文件的浏览和搜索功能,文件的复制和移动功能,以及文件的重命名和删除功能。

通过MFC编程实现系统的界面和交互。

8. 游戏开发案例:以面向对象程序设计的思想,设计一个简单的游戏。

系统包括游戏角色的移动和攻击功能,游戏关卡的切换和胜利条件的判断功能,以及计分和排行榜功能。

第11章 简单MFC应用程序开发

第11章 简单MFC应用程序开发

11.1.1 单文档与多文档界面
• SDI应用程序只支持打开一个文档,如Windows中的记事本 SDI应用程序只支持打开一个文档, Windows中的记事本 应用程序只支持打开一个文档 SDI应用程序的一个典型例子 MDI应用程序每次可以读 应用程序的一个典型例子。 是SDI应用程序的一个典型例子。MDI应用程序每次可以读 写多个文件或文档,可以同时有多个子窗口, 写多个文件或文档,可以同时有多个子窗口,对多个文档进 行操作, Word程序 程序。 行操作,如Word程序。
//注册应用程序的文档模板。文档模板将用作文档、框架窗口和视图之间的连接 注册应用程序的文档模板。文档模板将用作文档、 注册应用程序的文档模板 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( //创建单文档模板类对象 创建单文档模板类对象 IDR_MAINFRAME, //应用程序中各种资源 应用程序中各种资源ID 应用程序中各种资源 RUNTIME_CLASS(CTestDoc),//CTestDoc是应用程序中的文档类 是应用程序中的文档类 RUNTIME_CLASS(CMainFrame),//CMainFrame是应用程序的框架窗口类 是应用程序的框架窗口类 RUNTIME_CLASS(CTestView));//CTestView是应用程序的视图类 是应用程序的视图类
2009年1月
重庆理工大学计算机科学与技术系
共14页第7页CBiblioteka iew类 11.2.3 CView类
• CView类从CWnd派生出来,它提供的一般成员函数和虚拟成员函数参见 CView类从CWnd派生出来, 类从CWnd派生出来 教材P 11- 和教材P 11教材P235表11-3和教材P235表11-4; • 一个视图类可以通过GetDocument()函数得到和它关联的文档的指针, 一个视图类可以通过GetDocument()函数得到和它关联的文档的指针, GetDocument()函数得到和它关联的文档的指针 进一步可以得到文档中保存的数据; 进一步可以得到文档中保存的数据; • 当一个文档对象的数据发生变化时,该文档对象可以通过调用成员函数 当一个文档对象的数据发生变化时, UpdateAllViews()来刷新所有的视图 来刷新所有的视图; UpdateAllViews()来刷新所有的视图; • CView类中最常用的是OnDraw()函数,该函数在屏幕发生变化或因为焦 CView类中最常用的是OnDraw()函数 类中最常用的是OnDraw()函数, 点的变化需要重绘时调用,没有该函数, 点的变化需要重绘时调用,没有该函数,就不可能在程序切换时保证屏 幕的正确显示;OnDraw和WM_PAINT消息不同 消息不同: 幕的正确显示;OnDraw和WM_PAINT消息不同:

C++_MFC快速超简单入门.

C++_MFC快速超简单入门.

C++ MFC快速超简单入门学习注意:红色字体为重要的信息,必须理解并记住。

在学习MFC之前,你必须对C++的“类和对象有一定的认识和理解,因为MFC就是C++完全的面向对象设计,它里面封装了好多类,我们只要调用就OK,就像C语言调用库函数一样,直接使用,这就是C++第一特性:封装性,第二性就是继承与派生,这个在MFC中体现得淋淋至间(字打错了)。

如果不懂,我再来解释一下,例:有一个商品类,class GOODS 商品属性有名字,价格它可作为一个基类,我可以派上出苹果类,class Apple :public GOODS . 苹果属性出了继承了商品的属性名字,价格之外,还可派生出,颜色,等属性,继承与派生就是一个是另一个的子集,但是这个子集不仅包括父集的特征,还具有一些新的特性,懂了吧,这样。

MFC其中重要的类是:CDialog 对话框类,CEdit,(编辑框类)CButton,(按钮类)CRadio(单选钮类),这些都是作为基类,由我们自己定义的类去派生它们。

好了,现在先了解一下什么是MFC吧,请看当前目录下的MFC入门知识的幻灯片1—20张,或大概的浏览一下当前目录下的其它连个word文件,后面的幻灯片我觉得没必要看了,因为是快速吗,节约时间,(首先看不懂没关系,)但但看完之后,必须掌握如下知识:1.MFC是作什么用的?与以前我们写的C,C++语言有什么不同。

以及它的一些优点,不同,以前的是控制台的界面不好看,不友好,操作不方便,黑框框的一片。

MFC反之。

优点:可用极少的代码实现强大的功能,2.关于MFC的一些术语,概念啊3.你要知道MFC的对话框是由控件组成的,具有哪些控件(例按钮:Button, 单选钮:radio,Edit)例:要知道MFC的编程的原则,也就是宗旨理念吧,“消息映射,事件驱动“,这句话要记住并理解,很重要,真的。

那到底是什么意思呢?现实举例:一个人具备一种“感知“的能力,(也可称消息吧),当用火接近这个人时(发生的事件),就会(驱动)这个人做出反应,远离”火“,用MFC举例:一个按钮有什么消息啊,我可以单击它,所以它具备单击的消息:第一个就是左键单击的消息,第二个就是双击的消息,见名思议就OK了。

MFC-最简单的MFC程序

MFC-最简单的MFC程序

MFC-最简单的MFC程序尽管刚接触MFC不久,但其开发模式已初有感受,抛开复杂的应⽤不谈,想想我们通常怎样来写⼀个简单的MFC程序。

也许浮现在你脑海⾥的是程序向导,类向导,资源编辑器,以及代码。

看起来确实是这样,但有程序代码,此时你⼤概会灵光⼀现,说MFC程序=向导+资源+代码没有可能更简化⼀些呢,⽐如把向导去掉。

想想是可以的,向导不过是简化MFC开发的⼀种⼿段,虽然没有类向导⽇⼦会很难过,但也使你有机会看看纯⼿⼯打造的MFC是怎么样的,这对于了解MFC的执⾏流程⾮常有帮助。

我试图从⼀个最简单的MFC程序开始,慢慢丰富它,使它最终成为⼀个有点⽤处的程序。

这个过程中我会尽⼒抵挡住使⽤类向导的诱惑,只使⽤资源以及程序代码。

当然可能需要好⼏篇⽂章的篇幅,因为这个程序是我计划好的,⽤来学习MFC的每⼀个技术点的实验品。

现在,它的另⼀个⽬的是证明:MFC程序=资源+代码。

⼀个最简单的MFC程序你⼀定有这样的经验,⽤MFC的程序向导⽣成的MFC代码满是宏,注释,条件定义,这些对于程序的健壮性很有必要,不过对于初学者却是可怕的怪兽。

其实MFC程序可以写得⾮常简单,只⽤⼀个头⽂件和⼀个源⽂件就可以了,⽤程序向导新建⼀个程序,选择Win32 Application类型的程序,我的⼯程名是:MiniDraw;在下⼀步选择“⼀个空⼯程”并完成掉它。

⽣成的⼯程仅仅是⼀个⼯作区,没有任何源⽂件,⼿⼯给它添加⼀个头⽂件和⼀个源⽂件,分别是:DrawApp.h; DrawApp.cpp。

这是它们的代码:DrawApp.h:#ifndef LINZHENQUN_DRAWAPP_H_#define LINZHENQUN_DRAWAPP_H_class CDrawApp: public CWinApp{public:CDrawApp();BOOL InitInstance();};#endif //LINZHENQUN_DRAWAPP_H_DrawApp.cpp:#include <afxwin.h>#include "DrawApp.h"CDrawApp DrawApp;CDrawApp::CDrawApp(){}BOOL CDrawApp::InitInstance(){return FALSE;}不管你信不信,这就是⼀个最简单的MFC程序,尽管它什么事情也做不了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
App a;
你只需将以上代码拷贝下来,在VC++6.0编译器,建一个Window32工程,使用MFC链接库编译即可
具体步骤:打开VC++6.0,点击主菜单File(文件)-〉New(新建) 弹出一个对话框,我们选择
win32 Application(win32应用程序),再工程文本框给她起一个名字MyMFC,点击确定。在确认
的代码拷入,编译链接。你会发现有3个错误。
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
到现在我们还只是在内存中,创建了一个窗体,没有显示出来,那么
obj->ShowWindow(SW_SHOWMAXIMIZED);
通过这一句,用指针调用类的成员函数,在CFrameWnd中,还封装了ShowWindow这个API函数,用法和API函数一样。
在return TRUE;这句之后该函数结束。
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
BOOL App::ExitInstance()
{
MessageBox(0,"My Window","ExitInstance",MB_OK|MB_ICONHAND);
sample *obj;
obj=new sample;
这两个是在InitInstance()这个成员函数声明的,也就是说,这个函数结束了,这个指针变量必然要析构,而这个指针是代表窗体框架的,这个指针释放了,那么,窗体也跟着消失了,所以,我们要把这个地址留下来,就给了m_pMainWnd这个指针了,他是在线程类中的,有线程他就在,程序结束了,没线程了,他也消失了,窗体框架也就结束了。
Static Library,点击确定,再编译,运行,那么有这样一个窗体出现。下面是该程序的解释。
在以上的程序中,只使用了两个类CFrameWnd 和CWinApp,我们先看第一个类:
class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
#include <afxwin.h>
class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
他从类CWinThread里来,他的定义为 CWnd* m_pMainWnd;
他凭什么直接用?class CWinApp : public CWinThread 因为MFC中的CWinApp类继承于CWinThread子类中用父类的成员变量,儿子用老爸的钱,当然可以拉,所以他可以直接用
他有什么用,我们看
return TRUE;
}
在这个函数,首先法一个消息框出来,使用MessageBox函数,然后声明一个sample类的指针obj,第三行,为该obj分配内存,即实例化,类的实例化要调用构造函数的初始化,程序的控制点到达sample类的sample函数,
sample()
{
Create(NULL,"MFC Window");
信息的对话框里点确定。这样我们就建了一个win32 应用程序这样一个类型的工程。下面我们在
这个工程里建一个C++文件。点击菜单File(文件)-〉New(新建) 弹出一个对话框,选择
C++ source文件(C++源文件),再文件文本框里给他起个名字MyMFC,点击确定,这是我们将上面
MessageBox("My MFC Window","CFrame constructor&#ple继承了CFrameWnd类,CFrame类是MFC类库中的一个类,用它来代表窗体框架,我们先用sample类继承它,在构造函数调用了Create这个函数,在Create这个函数时调用的CFrameWnd类中的函数,使MFC写好的函数,CFrameWnd中封装了CreateWindow这个API函数为它的成员函数Create(),他们的参数都是像似的。但你会问,CreateWindow有11个参数,而这里的Create函数只用了两个参数,应为这里的Create有两个参数为必选参数,后面的参数有默认值
程序进入了运行状态,在关闭程序的时候,会调用
ExitInstance()这个函数,该函数仅仅输出一个消息框就结束了。那么这个简单的MFC程序就讲到这里了。
由MSDN的定义可以看出
BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL );
后面的参数都带有一个等号和一个默认的值。
我们再看在看第二个类,继承CWinApp类的App类。
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
在这个类中仅仅重写了两个函数,一个InitInstance(),一个ExitInstance(),这个类是控制整个应用程序的,所以称为CWinApp类,是不可或缺的一个类。而且要运行程序,要将该类实例化。实例化会自动调用构造函数,并调用InitInstance()这个函数(调用该函数是MFC写好的),因为该函数是一个虚函数,所以我们实例化继承CWinApp类的App类时,会自动调用App::InitInstance()(如果不明白,请复习c++的虚函数),这样就开始了一个应用程序实例的进程。来到的App::InitInstance()函数
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
这里才创建窗体,并且有一个消息框出现,然后程序的控制点回到 App::InitInstance()的m_pMainWnd=obj;位置
这一块是个难点,刚开始学的时候,我不明白m_pMainWnd,你从哪里来,来了干什么。
Debug/MyMFC.exe : fatal error LNK1120: 2 unresolved externals
那么,这是因为没有使用MFC类库。我们现在导入。点击菜单(project)工程-〉setting设置,弹
出一个对话框,有一个下拉列表框,里面是Not Using MFC,我们把她改为Using MFC in a
}
};
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
相关文档
最新文档