孙鑫C++视频教程总结内功算法+数据结构+编译原理+操作系统原理+软件工程+英文.docx
《孙鑫C++视频教程总结内功算法+数据结构+编译原理+操作系统原理+软件工程+英文.docx》由会员分享,可在线阅读,更多相关《孙鑫C++视频教程总结内功算法+数据结构+编译原理+操作系统原理+软件工程+英文.docx(21页珍藏版)》请在冰点文库上搜索。
孙鑫C++视频教程总结内功算法+数据结构+编译原理+操作系统原理+软件工程+英文
一:
Windows程序运行原理及程序编写流程(创建窗口。
回调函数
方法1
intWINAPIWinMain(//主函数
HINSTANCEhInstance,//handletocurrentinstance
HINSTANCEhPrevInstance,//handletopreviousinstance
LPSTRlpCmdLine,//commandline
intnCmdShow//showstate
)
WNDCLASSwndcls;//创建一个窗口对象
wndcls.cbClsExtra=0;//窗口类附加字节,为该类窗口所共享。
通常0。
wndcls.cbWndExtra=0;//窗口附加字节。
通常设为0。
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//背景
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);/光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//位图(图标)
wndcls.hInstance=hInstance;//当前应用程序事例句柄。
wndcls.lpfnWndProc=WinSunProc;//窗口过程函数(回调函数)
wndcls.lpszClassName="Weixin2003";//窗口名//类的名字
wndcls.lpszMenuName=NULL;//菜单名
wndcls.style=CS_HREDRAW|CS_VREDRAW;//窗口的类型
RegisterClass(&wndcls);//注册窗口
HWNDhwnd;
hwnd=CreateWindow("Weixin2003","北京",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);//定义窗口句柄并创建窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口
UpdateWindow(hwnd);//更新窗口
MSGmsg;//定义消息对象
/*做消息循环*/while(GetMessage(&msg,//接收消息的窗口句柄。
//从消息队列中取出一条消息
NULL,//消息标识。
0,0))//做消息循环
{
TranslateMessage(&msg);//进行消息(如键盘消息)转换
DispatchMessage(&msg);/分派消息到窗口的回调函数处理,
}
return0;
}
//回调函数原形为LRESULTCALLBACKWindowProc();
LRESULTCALLBACKWinSunProc(//对消息的响应函数(回调函数)
HWNDhwnd,//handletowindowUINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameterLPARAMlParam//secondmessageparameter
){
switch(uMsg){
caseWM_CHAR:
break;
caseWM_LBUTTONDOWN:
MessageBox(hwnd,"mouseclicked","weixin",0);
HDChdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc);
break;
caseWM_PAINT:
HDChDC;
PAINTSTRUCTps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
caseWM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?
","weixin",MB_YESNO))
{DestroyWindow(hwnd);}break;
caseWM_DESTROY:
PostQuitMessage(0);break;
default:
returnDefWindowProc(hwnd,uMsg,wParam,lParam);
}
总结:
创建一个完整的窗口需要经过下面四个操作步骤:
一,设计一个窗口类;如:
WNDCLASSwndcls;
二,注册窗口类;如:
RegisterClass(&wndcls);
三,创建窗口;如:
CreateWindow(),CreateWindowEX();
四,显示及更新窗口。
如:
ShowWindow(),UpdateWindow();
二:
VC++掌握的基础
①使用VC编程除了良好的C基础外还需要掌握两方面:
②消息本身。
不同消息所代表的用户操作和应用程序的状态。
③对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。
二.1消息的分类:
标准消息,命令消息,通告消息。
[标准消息]:
除WM_COMMAND之外,所有以WM_开头的消息。
[命令消息]:
来自菜单、加速键或工具栏按钮的消息。
这类消息都以WM_COMMAND呈现。
通过标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
[通告消息]:
由控件产生的消息,如按钮的单击。
1)从CWnd派生的类,可以接收到[标准消息][命令消息]和[通告消息]。
2)从CCmdTarget派生的类,只能可以接收到[命令消息]和[通告消息]。
三:
两种函数调用约定(__stdcall和__cdecl)
#defineCALLBACK__stdcall
//__stdcall标准调用预定,是PASCAL调用约定,象DELPHI使用的就是标准调用约定
#defineWINAPIV__cdecl
//__cdecl是C语言形式的调用约定。
主要区别:
函数参数传递顺序和对堆栈的清除上。
问题:
除了那些可变参数的函数调用外,其余的一般都是__stdcall约定。
但C/C++编译默然的是__cdecl约定。
所以如果在VC等环境中调用__stdcall约定的函数,必须要在函数声明的时加上__stdcall修饰符,以便对这个函数的调用是使用__stdcall约定(如使用DELPHI编写的DLL时候)。
(VC中可通过这途径修改:
project|settings..|c/c++|...)
四:
关于DC句柄获取(CpaintDC/CclientDC/CwindowDC在创建时默认)
(调用这些函数)a)使用BeginPaint(),EndPaint()对。
注意只能在响应WM_PAINT消息时使用。
b)使用GetDc(),ReleaseDC()对。
注意他们不能在响应WM_PAINT中使用。
MFC中的运用为①HDChdc=:
:
GetDc(m_hWnd);:
:
ReleaseDC(m_hWnd,hdc);获得全局DC。
②CDC*pDC=GetDC();ReleaseDC(pDC);
③CClientDCdc(this);(自动调用GetDc(),ReleaseDC());
④CWindowDCdc(this);(自动调用GetDc(),ReleaseDC());
五:
MFC程序框架的剖析
①寻找WinMain人口:
路径:
visualc++安装目录下的:
vc98|MFC|SRC|APPMODUL.CPP:
寻找CWinApp构造函数:
MFC|SRC|APPCORE.CPP:
②MFC程序框架主路线:
CTEApptheApp->CWinApp:
:
CWinApp()->_tWinMain(){//进入程->AfxEndDeferRegisterClass(LONGfToRegister)->PreCreateWindow(创建、显示和更新窗口)pThread->Run(消息循环)->PumpMessage(//取消息并处理)
类的运行顺序为:
C*APP->CmainFram->C*View->C*Doc
六:
消息映射的三步骤:
①在头文件中声明消息响应函数原型。
如:
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
②在源文件中进行消息映射。
如:
ON_WM_LBUTTONDOWN()
③源文件中进行消息响应函数的定义。
如:
voidCDrawView:
:
OnLButtonDown(UINTnFlags,CPointpoint){}
七:
使用画笔、画刷、字体的步骤:
(包括设计绘图模式SetROP2()
①CPenpen(PS_DOT,1,RGB(0,255,0));//构造画笔对象②CClientDCdc(this);
③CPen*pOldPen=dc.SelectObject(&pen);//将画笔选入DC后就可以作画了④dc.SelectObject(pOldPen);
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//构造透明画刷对象
FromHandle()将对象句柄转换为对象指针GetStockObject()取得一个以预定义的画笔、画刷、字体的句柄.
类为CpenCbrushCFont
设计绘图模式:
dc.SetROP2(R2_BLACK);(查MSDN).
八:
创建插入符:
CDC类(文字等的输出类)
CClientDCdc(this);TEXTMETRICtm;dc.GetTextMetrics(&tm);//获取当前字体信息的度量
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);ShowCaret();
//voidCreateCaret(CBitmap*pBitmap);//创建位图插入符
//staticvoidPASCALSetCaretPos(POINTpoint);//设计插入符号的位置
九:
创建路径层:
BOOLBeginPath();//在这作图定义路径层剪切区域BOOLEndPath();
BOOLSelectClipPath(intnMode);//调用这个函数来使当前路径层剪切区域与新剪切区域进行互操作。
应用:
当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath(intnMode)函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。
十:
设置定时器
①SetTimer(1,100,NULL);//放置定时1器并发送WM_TIMER消息
②作WM_TIMER消息响应并对VoidOnTimer(UINTnIDEvent)编写代码。
十一:
CMenu类
CMenu类重要函数:
CMenu*GetMenu得到窗口菜单栏对象指针。
CMenu:
:
GetSubMenu获得指向弹出菜单对象指针//SetMenu(CMenu*pMenu)设置新菜单或移除菜单
DrawMenuBar()//重绘菜单
//其它菜单的功能设计用MSDN查函数
十二:
创建自定义菜单
①CMenumenu;//定义为局部对象②menu.LoadMenu(IDR_MAINFRAME);③SetMenu(&menu);
④menu.Detach();//这里menu对象作为一个局部对象。
使用Detach()从menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁。
也可将menu;定义为全局对象。
十三:
对弹出式菜单项的命令更新
①给菜单项添加UPDATE_COMMAND_UI消息响应②在响应函数中调用CcmdUI类的成员函数。
十四:
向系统添加(右键弹出式)菜单(上下文菜单)
1系统添加法:
①Project->AddtoProject->ComponentsandControls->VisualC++conpenets->pop-upMenue->Insert->选择类(不能选CmainFram)其中系统增加的内容:
A一个菜单资源;B,在派生View类中增加了OnContextMenu()函数
2系统添加法:
①用资源管理器添加一个菜单资源②在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务代码如下:
CMenumenu;
menu.LoadMenu(IDR_MENU1);CMenu*pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);//将一个坐标点或一个矩形区域坐标转换成屏幕坐标。
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);//在指定位置以指定的方式显示弹出菜单。
也可对菜单项做消息响应。
2动态添加菜单法:
①在CmainFram类的OnCreate()中创建Cmenu对象调用其成员函数添加、插入、删除子菜单、菜单项②手动给动态菜单项添加响应函数一:
在Resource.h中可以添加资源的ID二:
在头文件中写消息函数原型三在代码文件中添加消息映射和添加消息响应函数(注意手动添加要放在ClassWizard的规定的外面)
十五:
集合类:
COBArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray
十六:
在CMainFrame中截获对菜单命令的处理
由于CWnd:
:
OnCommand是个虚函数,可以在框架类中重写OnCommand函数,从而可以截获菜单消息使它不再往下(VIEW类)路由。
例:
BOOLCMainFrame:
:
OnCommand(WPARAMwParam,LPARAMlParam)
{intMenuCmdId=LOWORD(wParam);//取命令ID
CMenu2View*pView=(CMenu2View*)GetActiveView();//获取当前VIEW类指针
if(MenuCmdId>=IDM_PHONE1&&MenuCmdIdm_strArray.GetSize())//消息范围判断
{CClientDCdc(pView);
dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));returnTRUE;//函数返回,避免调用CFrameWnd:
:
OnCommand函数,在CFrameWnd:
:
OnCommand中截获的消息会交由VIEW类处理}
returnCFrameWnd:
:
OnCommand(wParam,lParam);
//调用基类OnCommand函数,在CFrameWnd:
:
OnCommand中截获的消息会交由VIEW类处理}
十七:
对话框类CDialog
1.重要函数与成员变量
一:
每个窗口类创建的对象的同时都拥有一个窗口句柄m_hWnd的成员变量。
二:
GetDlgItem(IDC)==关联一个变量;通过控件ID获得控件对象指针
三:
GetWindowText(CString&rString)//获得窗口、安键文本(char类型)
四:
intatoi(constchar*string);itoa()//把一个字符串与INT类型的数值转为
五:
GetDlgItemText(IDC_EDIT1,ch1,10)==GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
在一个窗口控件中直接读取文本到字符数组中
六:
INTGetDlgItemInt()//获得控件文本,并转换成数值类型
七:
SetFocus()设计窗口、控件的焦点。
GetFocus()
八;if(IDOK==dlg.DoModal())创建对话框后会等待用户作选择,就是DoModal、create的值。
九:
对编辑框Edit控件写入内容后会发送EN_change消息,
2.问控件的六种方法:
一:
GetDlgItem(IDC_EDIT2)->Get(Set)WindowText(ch2,10);
二:
Get(Set)DlgItemText(IDC_EDIT2,ch2)
三:
Get(Set)DlgItemInt(IDC_EDIT2)
四:
每个控件关联一个变量,直接对变量进行操作。
调用UpdateData()对控件取设计值。
或:
变量.GetWindowText(ch1,10);取得数据
五:
通过SDK函数或变量的成员函数发送WM消息完成消息任务:
:
:
SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
六:
直接给ID控件发送消息:
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
十八:
创建扩展窗口(收缩、扩展窗口)
①创建一个图表框通过ID获得其矩形的位置,并通过CRect对象记录其矩形位置。
GetDlgItem(IDC_)->GetWindowRect(&rectSeparator);//获得窗口大小GetWindowRect(&rectLarge);
②创建两个CRect对象通过点的付值记录其矩形位置收缩、扩展时的矩形位置。
③SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);//设置窗口大小与位置
十九:
设计焦点事件(TabStop)
先对改变焦点事件做消息响应(如对回车ID_OK的响应)后
①GetFocus()->GetNextWindow()->SetFocus();//对最后一个不能判断。
②GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();/对最后一个不能判断。
③GetNextDlgTabItem(GetFocus())->SetFocus();//最好
回车事件为窗口缺损消息由ONOK()响应,可通过对控件属性设计为缺损做消息响应以接收这个消息。
廿:
查看/改变对话框控件排列的秩序
在对话框资源界面中:
Layout->TabOrder->改顺序。
廿一:
逃跑按钮的巧妙实现
①创建多个Cbutton控件,并建立基于Cbutton类,类中包含一个本类的成员变量。
②将控件关联成这个类的一个变量,同时使自己的成员变量指向下个控件
③ShowWindow(SW_HIDE);使自己隐藏,通过其成员变量m_pBtn->ShowWindow(SW_SHOW)使对方显示
廿二:
如何制作属性页对话框和向导对话框CpropertySheet类CpropertyPage类
①创建属性页:
insert->Resource->Dailog->选择后三个之一(如IDD_PROPPAGE_LARGE).
②为各页添加控件并为各页创建以CpropertyPage(属性表单页类)为基类的属性表单页类.
③以CPropertySheet为基类创建属性表单类,并在表单类中添加各表单页的对象。
要加头文件。
④在表单类的构造函数中用AddPage(&m_prop1);添加各表页。
⑤在View中做消息响应做显示触发器。
编代码:
⑤.1构造表单对象(设计表单名)
⑤.2调用propSheet.DoModal()或Create()显示页面。
(注:
创建向导对话框在⑤.2前调用SetWizardMode()
⑥设计各页(上一步、下一步等)限制用户在不满足设定的条件时切换到其他属性页和向导页。
:
⑥.1在各页中添加OnSetActive()虚函数⑥.2用表单指针调用SetWizardButtons()来设计。
如:
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);其响应函数为虚函数OnWizardNext/Back/Finish(查看MSDN)return–1不进入下一页。
廿三:
单选按钮操作方法:
①对所有单选按钮的第一个按钮属性设为Group,并为它们关联一个int类型的变量(使用时可按其编号访问)
②选择后(要按下一步或ok键)对按键作消息响应,用UpdateDate()对所选取值。
③对适当事件作消息响应通过一新的int类型的变量取这个关联的变量。
④使用选择值时作消息响应,通过变量作switch()case选择,通过str+="程序员"等方式取值并将选择输出。
⑤使用完后在使用类的构造函数中对数组初始化
廿四:
复选按钮操作方法:
①对所有复选按钮都关联一个Bool类型的变量(使用时可按其编号访问)
②选择后(要按下一步或ok键)对按键作消息响应,用UpdateDate()对所选取值。
(就一个函数)
③对适当事件作消息响应通过Bool类型数组记录每个关联变量的值。
④使用选择值时作消息响应,通过Bool类型数组多次if(m_bLike[0])判断,通过str+="程序员"等方式取值并将选择输出。
⑤使用完后在使用类的构造函数中用memset()对数组初始
廿五:
组合框操作方法:
CcomboBox类
①做OnInitDialog()虚函数消息响应通过AddString()初始化选项值。
并通过((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);负索引号值。
②对适当事件作消息响应通过intindex=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();取得索引号。
((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);通过索引号将值存入字符串中。
③对适当事件作消息响应通过新的CString类型变量记录这个字符串。
④使用选择值时作消息响应,通过CString类型变量以str+="程序员"等方式直接使用。
⑤使用完后在使用类的构造函数中对数组初始化
廿六:
列表框操作方法:
ClistBox类
①对所有复选按钮都关联一个CString类型的变量.并做OnInitDialog()虚函数消息响应通过AddS