孙鑫C++完整笔记

合集下载

孙鑫视频VC++深入详解学习笔记

孙鑫视频VC++深入详解学习笔记

VC++深入详解学习笔记Lesson1: Windows程序运行原理及程序编写流程窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与Lessonecl调用规范的比较,初学者常犯错误及注意事项。

1.Windows API与Win32 SDK操作系统提供了各种方便开发Windows应用程序的编程接口,所的函数都在Window s。

h头文件中声明。

Win32 SDK(Software Development Kit): 即Windows 32位平台下的软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具。

2.窗口与句柄窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口。

窗口分为客户区和非客户区。

在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的,要对某个窗口进行操作,首先就要得到这个窗口的句柄。

其它各种资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内在,并返回标识这些资源的标识号,即句柄。

-->光标句柄(HCURSOR),图标句柄(HICON)。

3.消息与消息队列Windows程序设计是一种基于消息的事件驱动方式的程序设计模式。

消息:在Windows中由结构体MSG来表示,typedef struct tagMSG{HWND hwnd;//消息所属的窗口句柄UINT message;//消息本身标识符,由一数值表示,系统对消息定//义为WM_XXX宏(WM为Windows Message缩写)WPARAM wParam; //随消息的不同附加信息也不同LPARAM lParam; //消息的附加参数DWORD time; //消息投递的时间POINT pt; //鼠标当前位置}消息队列:每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序一的窗口的消息,消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。

孙鑫VC学习笔记第8课

孙鑫VC学习笔记第8课
5.状态栏编程
a.Indicator[]数组中有状态栏的信息
如果要增加,可以在String Table中加入一个IDS_Timer,然后将其加入到[]中。
b.在时间栏显示时间,代码略,比较简单
6.进度栏
a.增加成员变量,CProgressCtrl m_progress
b.OnCreate中 m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL,
第二种ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
e.将菜单增加复选标记。在OnUpdateUI中加入代码
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
然后将其初始化
c.然后在定时器中实现
3.工具栏的编程
a.加入分隔符的方法,向右拖动即可;
b.删除按纽的方法,拖出即可。
4.创建一个新的工具栏的方法
a.插入一个工具栏,画出其图形。
b.在头文件中,定义CToolBar m_newToolBar
c.在MainFrm.cpp的OnCreate()中调用
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
OnCreate()中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,

孙鑫MFC最全完整笔记

孙鑫MFC最全完整笔记

第一课1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函数的声明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等许多类及其方法的声明。

2.Project->Setting->Debug可以加入命令行参数。

3.在SDK中要加入"windows.h"和stdio.h。

因为LoadCursor,MessageBox等函数的声明在这个文件中。

4.创建一个完整的窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示窗口5.函数名可以代表函数代码的首地址,即可作为函数指针。

6.要查看VC数据类型,可以在MSDN中输入“BOOL”然后选择“DATA TYPE”。

7.atof将字符串转化为float,atoi将字符串转化为int型。

8.所有从CWnd类派生的类都有m_hWnd句柄。

9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。

所以全局变量的声明位于所有大括号之外。

但是用new声明的变量和用static声明的变量除外。

10.SDK示范程序,见下面。

11.sprintf格式化字符,其头文件为stdio.h,在MFC中格式化字符用CString.Format12.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。

同样,BeginPaint()与EndPaint()。

13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。

14.什么时候用NULL,什么时候用0.答,对指针赋值时用NULL,对变量赋值时用0.15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向NULL即可。

p=NULL;16.SDK代码流程:#include "windows.h"//包含头文件LoadCursor,TextOut等函数#include "stdio.h"//包含sprintf,printf等函数LRESULT CALLBACK MyProc(...);//声明回调函数int WINAPI WinMain(){WNDCLASS wndcls;//设计窗口类wndcls.hcursor=LoadCursor();//初始化....RegisterClass(&wndcls);//注册窗口类hwnd=CreateWindow(...);//创建窗口ShowWindow(..);//显示窗口UpdateWindow(..);MSG msg;//定义消息结构体while(GetMessage(...))//消息循环{...}return 0;}LRESULT CALLBACK MyProc(...)//实现回调函数{switch(uMsg){case WM_CHAR:break;...}}第2课1.定义结构体和类时别忘记在最后加入";"号!例如Class Point{int x;int y;};2.#include <xxx.h>与#include "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!3.类的定义中,如果未指明成员类型,则缺省为private.而结构体中则缺省为public.4.引用:引用经常用在函数的传参上。

孙鑫VC++讲座笔记

孙鑫VC++讲座笔记

孙鑫VC++讲座笔记-(1)Windows程序内部运行机制1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。

当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。

2,消息结构:typedef struct tagMSG { // msgHWND hwnd; //接收消息的窗口句柄。

和哪个窗口相关联。

UINT message; //消息标识。

消息本身是什么。

WPARAM wParam; //消息的附加信息。

具体取决于消息本身。

LPARAM lParam;DWORD time; //消息投递时间。

POINT pt; //消息投递时,光标在屏幕上的位置。

} MSG;3,消息队列:每个应用程序OS都为它建立一个消息队列,消息队列是个先进先出的缓冲区,其中每个元素都是一个消息,OS将生成的每个消息按先后顺序放进消息队列中,应用程序总是取走当前消息队列中的第一条消息,应用程序取走消息后便知道用户的操作和程序的状态,然后对其处理即消息响应,消息响应通过编码实现。

4,使用VC编程除了良好的C基础外还需要掌握两方面:一,消息本身。

不同消息所代表的用户操作和应用程序的状态。

二,对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。

5,Window程序入口:int WINAPI WinMain(HINSTANCE hInstance, // 当前事例句柄。

HINSTANCE hPrevInstance, // 先前事例句柄。

LPSTR lpCmdLine, // 命令行指针int nCmdShow // (窗口)显示的状态);说明:WinMain函数是Windows程序入口点函数,由OS调用,当OS启动应用程序的时候,winmain函数的参数由OS传递的。

6,创建一个完整的窗口需要经过下面四个操作步骤:一,设计一个窗口类;如:WNDCLASS wndcls;二,注册窗口类;如:RegisterClass(&wndcls);三,创建窗口;如:CreateWindow(),CreateWindowEX();四,显示及更新窗口。

孙鑫VC教程笔记

孙鑫VC教程笔记

第一课Windows程序内部运行原理1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函数的声明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等许多类及其方法的声明。

2.Project->Setting->Debug可以加入命令行参数。

3.在SDK中要加入"windows.h"和stdio.h。

因为LoadCursor,MessageBox等函数的声明在这个文件中。

4.创建一个完整的窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示窗口5.函数名可以代表函数代码的首地址,即可作为函数指针。

6.要查看VC数据类型,可以在MSDN中输入“BOOL”然后选择“DATA TYPE”。

7.atof将字符串转化为float,atoi将字符串转化为int型。

8.所有从CWnd类派生的类都有m_hWnd句柄。

9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。

所以全局变量的声明位于所有大括号之外。

但是用new声明的变量和用static声明的变量除外。

10.SDK示范程序,见下面。

11.sprintf格式化字符,其头文件为stdio.h,在MFC中格式化字符用CString.Format12.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。

同样,BeginPaint()与EndPaint()。

13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。

14.什么时候用NULL,什么时候用0.答,对指针赋值时用NULL,对变量赋值时用0.15.15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向NULL即可。

p=NULL;16.SDK代码流程:#include "windows.h"//包含头文件LoadCursor,TextOut等函数#include "stdio.h"//包含sprintf,printf等函数LRESULT CALLBACK MyProc(...);//声明回调函数int WINAPI WinMain(){WNDCLASS wndcls;//设计窗口类wndcls.hcursor=LoadCursor();//初始化....RegisterClass(&wndcls);//注册窗口类hwnd=CreateWindow(...);//创建窗口ShowWindow(..);//显示窗口UpdateWindow(..);MSG msg;//定义消息结构体while(GetMessage(...))//消息循环{...}return 0;}LRESULT CALLBACK MyProc(...)//实现回调函数{switch(uMsg){case WM_CHAR:break;...}}第二课掌握C++1.定义结构体和类时别忘记在最后加入";"号!例如Class Point{int x;int y;};2.#include <xxx.h>与#include "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!3.类的定义中,如果未指明成员类型,则缺省为private.而结构体中则缺省为public.4.引用:引用经常用在函数的传参上。

孙鑫VC学习笔记第9课

孙鑫VC学习笔记第9课
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
OnCreate()中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
2.创建一个不断变化的图标。用定时器和SetClassLong完成
a.准备三个图标文件,放在RES文件夹,Insert->Resource-三个图标,
b.在CMainFrame中增加图标句柄数组,m_hIcons[3]
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
}
最后在OnCreate中调用 PostMessage(UM_PROGRESS);//不能用SendMessage()
然后将其初始化
c.然后在定时器中实现
3.工具栏的编程
a.加入分隔符的方法,向右拖动即可;
b.删除按纽的方法,拖出即可。
4.创建一个新的工具栏的方法
a.插入一个工具栏,画出其图形。
b.在头文件中,定义CToolBar m_newToolBar
c.在MainFrm.cpp的OnCreate()中调用
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);

VC++深入详解学习笔记(非常全面)

VC++深入详解学习笔记(非常全面)

孙鑫孙鑫VC++ 视频笔记列表(全)简介第一课Windows 程序内部运行机制第二课MFC 程序框架的剖析第三课MFC 消息映射机制和DC 的获取第四课简单字处理软件第五课菜单编程第六课对话框编程 1第七课对话框编程 2第八课MFC 中各类指针的获取第九课应用程序外观修改第十课图形绘制与通用对话框第十一课图形保存和重绘第十二课文件操作第十三课文档和串行化第十四课网络编程第十五课多线程和简单聊天室制作第十六课线程同步与异步套接字编程第十七课进程间通信第十八课ActiveX 控件第十九课动态链接库第二十课Hook 钩子函数第0章简介Lesson1:Windows 程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++ 的若干小技巧,stdcall 与cdecl 调用规范的比较,初学者常犯错误及注意事项。

Lesson2:C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this 成员变量,类型转换的内幕,虚拟函数与多态性,引用和指针变量的区别与共同处。

VC 工程的编译原理与过程,将工程中不同的类拆分到不同的文件中,每一个类由一个.h 和.cpp 文件共同完成,头文件重复定义问题的解决,培养了学员良好的编程习惯,也为以后分析MFC AppWizard 生成的工程奠定了良好基础。

Lesson3:讲述MFC AppWizard 的原理与MFC 程序框架的剖析。

AppWizard 是一个源代码生成工具,是计算机辅助程序设计工具,WinMain 在MFC 程序中是如何从源程序中被隐藏的,theApp 全局变量是如何被分配的,MFC 框架中的几个类的作用与相互关系,MFC 框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow 和OnCreate 两个函数的着重分析,Windows 窗口与C++中的CWnd 类的关系。

孙鑫的教学笔记

孙鑫的教学笔记

老孙的教学笔记(转)第一课1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函数的声明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等许多类及其方法的声明。

2.Project->Setting->Debug可以加入命令行参数。

3.在SDK中要加入"windows.h"和stdio.h。

因为LoadCursor,MessageBox等函数的声明在这个文件中。

4.创建一个完整的窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示窗口5.函数名可以代表函数代码的首地址,即可作为函数指针。

6.要查看VC数据类型,可以在MSDN中输入“BOOL”然后选择“DATA TYPE”。

7.atof将字符串转化为float,atoi将字符串转化为int型。

8.所有从CWnd类派生的类都有m_hWnd句柄。

9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。

所以全局变量的声明位于所有大括号之外。

但是用new声明的变量和用static声明的变量除外。

10.SDK示范程序,见下面。

11.sprintf格式化字符,其头文件为stdio.h,在MFC中格式化字符用CString.Format12.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。

同样,BeginPaint()与EndPaint()。

13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。

14.什么时候用NULL,什么时候用0.答,对指针赋值时用NULL,对变量赋值时用0.15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向NULL即可。

p=NULL;16.SDK代码流程:#i nclude "windows.h"//包含头文件LoadCursor,TextOut等函数#i nclude "stdio.h"//包含sprintf,printf等函数LRESULT CALLBACK MyProc(...);//声明回调函数int WINAPI WinMain(){WNDCLASS wndcls;//设计窗口类wndcls.hcursor=LoadCursor();//初始化....RegisterClass(&wndcls);//注册窗口类hwnd=CreateWindow(...);//创建窗口ShowWindow(..);//显示窗口UpdateWindow(..);MSG msg;//定义消息结构体while(GetMessage(...))//消息循环{...}return 0;}LRESULT CALLBACK MyProc(...)//实现回调函数{switch(uMsg){case WM_CHAR:break;...}}第2课1.定义结构体和类时别忘记在最后加入";"号!例如Class Point{int x;int y;};2.#i nclude <xxx.h>与#i nclude "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!3.类的定义中,如果未指明成员类型,则缺省为private.而结构体中则缺省为public.4.引用:引用经常用在函数的传参上。

孙鑫VC++讲座笔记-(6)菜单编程_

孙鑫VC++讲座笔记-(6)菜单编程_

1,弹出菜单(Pop-up)是不能用来作命令响应的。

1,弹出菜单(Pop-up)是不能用来作命令响应的。

2,MFC中菜单项消息如果利用ClassWizard来对菜单项消息分别在上述四个类中进行响应,则菜单消息传递顺序:View类--Doc类--CMainFrame类--App类。

菜单消息一旦在其中一个类中响应则不再在其它类中查找响应函数。

具体:当点击一个菜单项的时候,最先接受到菜单项消息的是CMainFrame框架类,CMainFra me框架类将会把菜单项消息交给它的子窗口View类,由View类首先进行处理;如果View 类检测到没对该菜单项消息做响应,则View类把菜单项消息交由文档类Doc类进行处理;如果Doc类检测到Doc类中也没对该菜单项消息做响应,则Doc类又把该菜单项消息交还给View类,由View类再交还给CMainFrame类处理。

如果CMainFrame类查看到CMainFrame 类中也没对该消息做响应,则最终交给App类进行处理。

3,消息的分类:标准消息,命令消息,通告消息。

[标准消息]:除WM_COMMAND之外,所有以WM_开头的消息。

[命令消息]:来自菜单、加速键或工具栏按钮的消息。

这类消息都以WM_COMMAND呈现。

在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的w Param参数识别。

[通告消息]:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。

这类消息也是以WM_COMMAND形式呈现。

说明:1)从CWnd派生的类,都可以接收到[标准消息]。

2)从CCmdTarget派生的类,都可以接收到[命令消息]和[通告消息]。

4,一个菜单拦可以有若干个子菜单,一个子菜单又可以有若干个菜单项等。

对菜单栏的子菜单由左至右建立从0开始的索引。

对特定子菜单的菜单项由上至下建立了从0开始的索引。

孙鑫笔记1

孙鑫笔记1
#define CALLBACK __stdcall
//__stdcall 标准调用预定,是PASCAL 调用约定,象DELPHI使用的就是标准调用约定
#define WINAPIV __cdecl
// __cdecl 是C 语言形式的调用约定。
主要区别:函数参数传递顺序 和 对堆栈的清除上。
孙鑫VC++视频学习笔记之1: Windows程序内部运行机制2007年04月26日 星期四 下午 10:19这一章比较零散,笔记也很零散
一、windows是事件驱动方式的程序设计
windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
说明:两种函数调用约定(__stdcall 和 __cdecl):
2, 注册窗口类。如:RegisterClass(&wndcls)。
3, 创建窗口。如:CreateWindow(),CreateWindowEX();
4, 显示及更新窗口。如:ShowWindow(),UpdateWindow();
其他值得注意的地方
1, 消息结构
问题:除了那些可变参数的函数调用外,其余的一般都是__stdcall约定。但 C/C++编译默然的是__cdecl约定。所以如果在VC等环境中调用__stdcall约定的函数,必须要在函数声明的时加上 __stdcall 修饰符,以便对这个函数的调用是使用__stdcall约定(如使用DELPHI编写的DLL时候)。

孙鑫VC教学视频学习笔记1-8

孙鑫VC教学视频学习笔记1-8

2:路径层(Path)的概念!
3: 我试图写一个 MyNotePad 的小应用程序,已完成的任务有:设置自定义的图标,窗口背景,光标.在窗口 显示插入符,并让插入符随鼠标的点击而显示在相应的位置,用 TextOut 完成串的输入,显示,并保存于一个 CString 对象中,可是我发现显示文本的背景色(默认是白色)与自定义的窗口背景色不一致,我先是用如下 的代码: hdc.SetBkColor(hdc.GetBkColor)); 来设置文本背景色,可是背景色仍然是默认的白色,我不停地想是不是 SetBkcolor()不可以用,但当时真是 笨,明明用 GetBkColor()取到的就是文本的背景色,你再设置回去,那不就相当于什么都没做嘛!当时脑子 中充斥的想法是以为 GetBkColor()取到的是窗口的背景色呢!呵呵,笨!另外,hdc.SetTextColor ()可以设 置文本的颜色.但还有一个问题:下面是我处理退格键的代码: void CMyNotePadView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if(0x0d==nChar) { // m_ptOrigin } else if(0x08==nChar) { CClientDC hdc(this); hdc.SetBkColor(RGB(208,221,238)); hdc.SetTextColor(RGB(208,221,238)); hdc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine); m_strLine=m_strLine.Left(m_strLine.GetLength()-1); } else { m_strLine+=nChar; } ::InvalidateRect(m_hWnd,NULL,FALSE); CView::OnChar(nChar, nRepCnt, nFlags); } 为了应付窗口切换时的重绘,我把输出工作放在了 OnDraw()函数中了,别的都是正常的,可当退格的时候

孙鑫笔记2

孙鑫笔记2

4, PreCreateWindow()是个虚函数,如果子类有则调用子类的。
5, CreateWindowEx()函数参数与CREATESTRUCT结构体成员完全一致,CreateWindowEx()函数与CREATESTRUCT结构体参数的对应关系,使我们在创建窗口之前通过可PreCreateWindow(cs)修改cs结构体成员来修改所要的窗口外观。
对于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注册与创建、显示等要反复调用多次,一次对应一个窗口
(1) 注册窗口类
AfxEndDeferRegisterClass
(2) 创建窗口
CMainFrame::PreCreateWindow()//反复调用一次是给我们修改窗口属性的机会
一、C语言程序执行步骤
在C语言中,大约的步骤如下:
1, 全局变量内存分配 要是初始化)
打开一个MFC APPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:
1) CXXApp中的全局变量定义
1) 设计一个窗口类
2) 注册窗口类
3) 创建窗口
4) 显示及更新窗口
5) 消息循环
补充2:其他需要注意的几点
1, 每一个MFC程序,有且只有一个从WinApp类派生的类(应用程序类),也只有一个从应用程序类所事例化的对象,表示应用程序本身。在WIN32程序当中,表示应用程序是通过WINMAIN入口函数来表示的(通过一个应用程序的一个事例号这一个标识来表示的)。在基于MFC应用程序中,是通过产生一个应用程序对象,用它来唯一的表示了应用程序。
6,注意两个函数。

孙鑫VC学习笔记第14课

孙鑫VC学习笔记第14课
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); sendto(sockClient,"Hello",strlen("Hello")+1,0,
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);//关闭套接字。等待另一个用户请求
}
}客户端代码如下:
#include <Winsock2.h>
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to ",
inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客户端进行通信(send/recv)。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

MFC(继续画图,孙鑫C第十讲笔记整理)

MFC(继续画图,孙鑫C第十讲笔记整理)

MFC(继续画图,孙鑫C第十讲笔记整理)1.画图:a.创建四个菜单,为其添加消息响应;b.在View中添加m_DrawType,保存绘画类型;c.增加成员变量,m_PtOrigin,当按下鼠标左键时,保存此点;d.在OnLButtonUp中画点,线,矩形,椭圆,别忘记设置成透明画刷2.为其添加一个设置对话框(线型和线宽)a.创建对话框,为其创建一个新类关联它;b.为其中的线宽关联成员变量;c.在View中增加一个菜单,响应新的对话框;d.添加线型选项设置,将其Group属性选中,并为单选按纽关联成员变量。

在view中增加一个线型变量m_nLineStyle3.添加一个颜色对话框a.实例化一个CColorDialogb.调用DoModal方法4.添加字体对话框,将选择的字体在View中显示出来。

a.实例化一个对象;b.为View添加一个字体成员变量,得到用户选择的字体。

c.调用Invadate()发出重绘消息;d.再次注意一个对象只能创建一次,故要再次创建,必须将原告的删除!5.为设置对话框增加示例功能。

a.当控件内容改变时,发出En_change消息。

而Radio按纽则为Clicked。

需先UpdateData()。

另外还需要ScreenToClient(&rect)6.改变对话框的背景色和控件颜色。

每个控件被绘制时都发出WM_CTlColor消息,7.如何改变OK按纽的字体和背景?OK按纽a.创建一个新类,CT estBtn,基类为CButtonb.在类中增加虚函数,DrawItem,添加代码。

c.将OK按纽关联成员变量。

类型为CT estBtn,注意将OK按纽的OwnerDraw特性选中。

Cancel按纽用新类来改变。

a.加入新文件。

b.为Cancel关联一个成员变量,类型为CSXBtn;c.调用CSXBtn的方法。

Cancel2按纽a.方法同上。

8.在窗口中贴图,4个步骤1、创建位图CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);2、创建兼容DCCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);3、将位图选到兼容DC中dcCompatible.SelectObject(&bitmap);4、将兼容DC中的位图贴到当前DC中。

孙鑫VC学习笔记第3课

孙鑫VC学习笔记第3课
}
而在BOOL CTestApp::InitInstance()中的代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
在CMainFrame::OnCreate()中定义一个CButton的对象btn;然后调用btn.Create("维新",WS_DISABLED |WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
CRect(0,0,300,100),/*GetParent(),*/this,123);
注意点:
(1).此处btn不能是局部变量,否则它的生命周期太短,将不能显示。
(2).在create函数的第二个参数中加入WS_VISIBLE 参数才行。否则必须调用ShowWindow
也可以在view的OnCreate消息响应函数中加入
(3).CButton类的定义头文件在afxwin.h中,而stdafx.h包含了afxwin.h,所以可以直接使用。因为MFC中的每一个类中都有#include "stdafx.h"的声明。�
第3课
1.在main或WinMain之前,全局变量已经被分配内存并初始化了。
2.在MFC中在WinMain之前有个theApp全局变量先被构造并被初始化,而由于子类构造函数执行前,其父类的构造函数先被执行,所以CTestApp的父类CWinAPP的构造函数先执行。产生了theApp对象后,在WinMain()中的指针*pThread和*pApp就有了内容。

孙鑫VC视频教程笔记

孙鑫VC视频教程笔记

本文由hewentao2003贡献 doc1。

VC 视频教程笔记! 第一课 1.MFC 生成的 C++源文件中都有 StdAfx.h, 此文件包含了常用的 AFX 函数的声明, 其中有 afxwin.h,此文件包含了 CRECT,CPoint,CWnd 等许多类及其方法的声明。

 2.Project->Setting->Debug 可以加入命令行参数。

 3.在 SDK 中要加入"windows.h"和 stdio.h。

因为 LoadCursor,MessageBox 等函 数的声明在这个文件中。

 4.创建一个完整的窗口的四个步骤 SDK,1 设计窗口类,2 注册窗口类,3 创建窗 口,4 显示窗口 5.函数名可以代表函数代码的首地址,即可作为函数指针。

 6.要查看 VC 数据类型,可以在 MSDN 中输入“BOOL”然后选择“DATA TYPE”。

 7.atof 将字符串转化为 float,atoi 将字符串转化为 int 型。

 8.所有从 CWnd 类派生的类都有 m_hWnd 句柄。

 9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。

 所以全局变量的声明位于所有大括号之外。

但是用 new 声明的变量和用 static 声明的变量除外。

 10.SDK 示范程序,见下面。

 11.sprintf 格式化字符,其头文件为 stdio.h,在 MFC 中格式化字符用 CString. Format 12.GetDC()与 ReleaseDC()要成对使用,否则会内存泄漏。

同样,BeginPaint() 与 EndPaint()。

 13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类 型转换。

 14.什么时候用 NULL,什么时候用 0.答,对指针赋值时用 NULL,对变量赋值时 用 0. 15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针! 如何避免野指针?答:将此指针指向 NULL 即可。

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

4.如何在单文档文件中显示一个 CButton 的对象?
在 CMainFrame::OnCreate()中 定 义一个 CButton 的对 象 btn;然 后调用 btn.Create("维 新
",WS_DISABLED |WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
第3课
1.在 main 或 WinMain 之前,全局变量已经被分配内存并初始化了。 2.在 MFC 中在 WinMain 之前有个 theApp 全局变量先被构造并被初始化,而由于子类构造 函数执行前,其父类的构造函数先被执行,所以 CTestApp 的父类 CWinAPP 的构造函数先 执行。产生了 theApp 对象后,在 WinMain()中的指针*pThread 和*pApp 就有了内容。 3.MFC 大致流程: CTestApp theApp;//构造全局对象 WinMain() { AfxWinMain();//调用下面的函数 } AfxWinMain() {
...
}
return 0;
} LRESULT CALLBACK MyProc(...)//实现回调函数 {
switch(uMsg) { case WM_CHAR: break; ... } }
第2课
1.定义结构体和类时别忘记在最后加入";"号!例如 Class Point{int x;int y;}; 2.#include <xxx.h>与#include "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录! 3.类的定义中,如果未指明成员类型,则缺省为 private.而结构体中则缺省为 public. 4.引用:引用经常用在函数的传参上。另外数值交换函数也经常用引用。例 change(int &x,int &y){int temp;temp=x;x=y;y=x}调用时即可以用 int a=3;int b=4;change(a,b); 一般不用指针来作为参数进行数值交换。因为会引起歧义。 5.通常将类的定义放.h 文件,而将其实现放在 cpp 文件中,别忘记了在 cpp 文件中#include "xxx.h" 6.如何防止类的重复定义? 用#inndef Point_H_H #define Point_H_H
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),
// main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
完成了将这三个类关联起来的工作。
pThread->Initinstance();//初始化工作和注册窗口类,窗口显示和更新
pThread->Run();//消息循环
}
而在 BOOL CTestApp::InitInstance()中的代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
CRect(0,0,300,100),/*GetParent(),*/this,123);
注意点:
(1).此处 btn 不能是局部变量,否则它的生命周期太短,将不能显示。
(2).在 create 函数的第二个参数中加入 WS_VISIBLE 参数才行。 的 OnCreate 消息响应函数中加入
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() 最后是要有函数实现的代码。 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TOD Add your message handler code here and/or call default m_ptOrigin=m_ptOld=point; m_bDraw=TRUE; CView::OnLButtonDown(nFlags, point); } 3.画线:定义一个成员变量保存 mouseDown 的点 m_Point
(3).CButton 类的定义头文件在 afxwin.h 中,而 stdafx.h 包含了 afxwin.h,所以可以直接
使用。因为 MFC 中的每一个类中都有#include "stdafx.h"的声明。
第4课
1.在单文档中 view 挡在 MainFrame 的前面。此时如果编写针对 MainFrame 的 mouseClick 事 件,将不会有反应。 2.消息响应会在 3 处修改代码,1 处是在头文件中, //{{AFX_MSG(CDrawView) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() 另一处是 cpp 文件的 begin MessageMap 和 End MessageMap 之间, BEGIN_MESSAGE_MAP(CDrawView, CView) //{{AFX_MSG_MAP(CDrawView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush); //CBRUSH::FromHandle 是静态成员函数,所以可以用下面的方法调用。 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush *pOldBrush=dc.SelectObject(pBrush); dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush); m_bDraw=FALSE;
class Point{}; #endif 来防止 7.源文件 cpp 文件单独编译成 obj 文件。最后由链接器将与将要使用到的 C++标准库类链接 成 exe 文件,头文件不参加编译。所以在 cpp 文件中别忘记了加入#include "xxx.h" 8.函数的覆盖,在子类中重写父类的函数,此时采用早期绑定的方法。如果加入了 virtual, 则将采用迟绑定的技术,在运行时根据对象的类型确定调用哪一个函数。此迟绑定技术是 MFC 的类的继承的精髓。 9.强制类型转换。如果 CFish 从 CAnimal 派生而来。则可以将鱼的对象转换为 CAnimal 的对 象,而反之则不行。从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。再如 int 可以强制转换成 char 型。而反之则出错。
{ WNDCLASS wndcls;//设计窗口类 wndcls.hcursor=LoadCursor();//初始化 .... RegisterClass(&wndcls);//注册窗口类 hwnd=CreateWindow(...);//创建窗口 ShowWindow(..);//显示窗口 UpdateWindow(..); MSG msg;//定义消息结构体 while(GetMessage(...))//消息循环 {
第一课
1.MFC 生成的 C++源文件中都有 StdAfx.h,此文件包含了常用的 AFX 函数的声明,其中有 afxwin.h,此文件包含了 CRECT,CPoint,CWnd 等许多类及其方法的声明。 2.Project->Setting->Debug 可以加入命令行参数。 3.在 SDK 中要加入"windows.h"和 stdio.h。因为 LoadCursor,MessageBox 等函数的声明在这个 文件中。 4.创建一个完整的窗口的四个步骤 SDK,1 设计窗口类,2 注册窗口类,3 创建窗口,4 显示 窗口 5.函数名可以代表函数代码的首地址,即可作为函数指针。 6.要查看 VC 数据类型,可以在 MSDN 中输入“BOOL”然后选择“DATA TYPE”。 7.atof 将字符串转化为 float,atoi 将字符串转化为 int 型。 8.所有从 CWnd 类派生的类都有 m_hWnd 句柄。 9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。所以全局变 量的声明位于所有大括号之外。但是用 new 声明的变量和用 static 声明的变量除外。 10.SDK 示范程序,见下面。 11.sprintf 格式化字符,其头文件为 stdio.h,在 MFC 中格式化字符用 CString.Format 12.GetDC()与 ReleaseDC()要成对使用,否则会内存泄漏。同样,BeginPaint()与 EndPaint()。 13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。 14.什么时候用 NULL,什么时候用 0.答,对指针赋值时用 NULL,对变量赋值时用 0. 15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免 野指针?答:将此指针指向 NULL 即可。p=NULL; 16.SDK 代码流程: #include "windows.h"//包含头文件 LoadCursor,TextOut 等函数 #include "stdio.h"//包含 sprintf,printf 等函数 LRESULT CALLBACK MyProc(...);//声明回调函数 int WINAPI WinMain()
相关文档
最新文档