孙鑫C++视频教程总结(内功=算法+数据结构+编译原理+操作系统原理+软件工程+英文)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统原理算法总结”。
一:Windows程序运行原理及程序编写流程(创建窗口。回调函数
方法1
int WINAPI WinMain(//主函数
HINSTANCE hInstance,// handle to current instance HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine,// command line
int nCmdShow
// show state)
WNDCLASS wndcls;//创建一个窗口对象
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.lpszClaName=“Weixin2003”;// 窗口名//类的名字
wndcls.lpszMenuName=NULL;//菜单名
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的类型
RegisterCla(&wndcls);//注册窗口
HWND hwnd;
hwnd=CreateWindow(“Weixin2003”,“
北
京”,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//定义窗口句柄并创建窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口
UpdateWindow(hwnd);//更新窗口
MSG msg;//定义消息对象
/*做消息循环*/while(GetMeage(&msg, //接收消息的窗口句柄。//从消息队列中取出一条消息 NULL, //消息标识。0,0))//做消息循环
{
TranslateMeage(&msg);//进行消息(如键盘消息)转换
DispatchMeage(&msg);/分派消息到窗口的回调函数处理,}
return 0;}
//回调函数原形为LRESULT CALLBACK WindowProc();
LRESULT CALLBACK WinSunProc(//对消息的响应函数(回调函数)
HWND hwnd,// handle to window
UINT uMsg,// meage identifier
WPARAM wParam, // first meage parameter LPARAM lParam
// second meage parameter){
switch(uMsg){
case WM_CHAR:break;
case WM_LBUTTONDOWN:
MeageBox(hwnd,“mouse clicked”,“weixin”,0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,“计算机编程语言培训”,strlen(“计算机编程语言培训”));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,“维新培训”,strlen(“维新培训”));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MeageBox(hwnd,“是否真的结束?”,“weixin”,MB_YESNO))
{DestroyWindow(hwnd);}
break;
case WM_DESTROY:
PostQuitMeage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
总结:创建一个完整的窗口需要经过下面四个操作步骤: 一,设计一个窗口类;如:WNDCLASS wndcls;二,注册窗口类;
如:RegisterCla(&wndcls);
三,创建窗口;
如:CreateWindow(),CreateWindowEX();四,显示及更新窗口。如:ShowWindow(),UpdateWindow();二:VC++掌握的基础
①使用VC编程除了良好的C基础外还需要掌握两方面: ②消息本身。不同消息所代表的用户操作和应用程序的状态。
③对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。
二.1消息的分类:标准消息,命令消息,通告消息。
[标准消息]:除WM_COMMAND之外,所有以WM_开头的消息。
[命令消息]:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。
通过标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
[通告消息]:由控件产生的消息,如按钮的单击。
1)从CWnd派生的类,可以接收到[标准消息] [命令消息]和[通告消息]。2)从CCmdTarget派生的类,只能可以接收到[命令消息]和[通告消息]。
三:两种函数调用约定(__stdcall 和 __cdecl)
#define CALLBACK
__stdcall
//__stdcall 标准调用预定,是PASCAL 调用约定,象DELPHI使用的就是标准调用约定
#define WINAPIV
__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中的运用为① HDC hdc=::GetDc(m_hWnd);::ReleaseDC(m_hWnd,hdc);获得全局DC。
② CDC *pDC=GetDC();ReleaseDC(pDC);
③ CClientDC dc(this);(自动调用GetDc(),ReleaseDC()); ④ CWindowDC dc(this);(自动调用GetDc(),ReleaseDC());
五:MFC程序框架的剖析
①寻找WinMain
人口:路径:visual c++安装目录下的:vc98|MFC|SRC|APPMODUL.CPP:
寻找CWinApp构造函数:MFC|SRC|APPCORE.CPP: ②MFC程序
框
架
主
路
线
:
CTEApp
theApp-> CWinApp::CWinApp()->_tWinMain(){//进入程->AfxEndDeferRegisterCla(LONG fToRegister)-> PreCreateWindow(创建、显示和更新窗口)pThread->Run(消息循环)-> PumpMeage(//取消息并处理)
类的运行顺序为:C*APP->CmainFram->C*View->C*Doc
六:消息映射的三步骤:
①在头文件中声明消息响应函数原型。如:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
②在源文件中进行消息映射。如:ON_WM_LBUTTONDOWN()③源文件中进行消息响应函数的定义。如:void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){}
七:使用画笔、画刷、字体的步骤:(包括设计绘图模式SetROP2()
①CPen pen(PS_DOT,1,RGB(0,255,0));//构造画笔对象② CClientDC dc(this);③ CPen *pOldPen=dc.SelectObject(&pen);//将画笔选入DC后就可以作画了④dc.SelectObject(pOldPen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//构造透明画刷对象
FromHandle()将对象句柄转换为对象指针GetStockObject()取得一个以预定义的画笔、画刷、字体的句柄.类为Cpen Cbrush CFont
设计绘图模式: dc.SetROP2(R2_BLACK);(查MSDN).八:创建插入符:CDC类(文字等的输出类)
CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);// 获取当前字体信息的度量
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);ShowCaret();// void CreateCaret(CBitmap* pBitmap);//创建位图插入符
//static void PASCAL SetCaretPos(POINT point);//设计插入符号的位置
九:创建路径层:
BOOL BeginPath();//在这作图定义路径层剪切区域BOOL EndPath();
BOOL SelectClipPath(int nMode);//调用这个函数来使当前路径层剪切区域与新剪切区域进行互操作。
应用:当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath(int nMode)函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。
十:设置定时器
①SetTimer(1,100,NULL);//放置定时1器并发送WM_TIMER消息
②作WM_TIMER消息响应并对Void OnTimer(UINT nIDEvent)编写代码。
十一:CMenu类
CMenu 类重要函数:CMenu*GetMenu得到窗口菜单栏对象指针。
CMenu::GetSubMenu获得指向弹出菜单对象指针
// SetMenu(CMenu* pMenu)设置新菜单或移除菜单 DrawMenuBar()//重绘菜单
//其它菜单的功能设计用MSDN查函数
十二:创建自定义菜单
①CMenu menu;//
定
义
为
局
部
对
象②menu.LoadMenu(IDR_MAINFRAME);③SetMenu(&menu);
④menu.Detach();// 这里menu对象作为一个局部对象。使用Detach()从menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁。也可将menu;定义为全局对象。
十三:对弹出式菜单项的命令更新
①给菜单项添加UPDATE_COMMAND_UI消息响应②在响应函数中调用CcmdUI类的成员函数。十四:向系统添加(右键弹出式)菜单(上下文菜单)
1系统添加法:
① Project->Add to Project->Components and Controls->Visual C++ conpenets->pop-upMenue->Insert->选择类(不能选CmainFram)其中系统增加的内容:A一个菜单资源;B,在派生View类中增加了OnContextMenu()函数
2系统添加法:①用资源管理器添加一个菜单资源②在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务 代码如下:CMenu menu;
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二:在头文件中写消息函数原型三在代码文件中添加消息映射和添加消息响应函数(注意手动添加要放在ClaWizard的规定的外面)
十五:集合类:
COBArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray
十六:在CMainFrame中截获对菜单命令的处理
由于CWnd::OnCommand 是个虚函数,可以在框架类中重写OnCommand函数,从而可以截获菜单消息使它不再往下(VIEW类)路由。例:
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam){ int MenuCmdId=LOWORD(wParam);//取命令ID CMenu2View *pView=(CMenu2View*)GetActiveView();//获取当前VIEW类指针
if(MenuCmdId>=IDM_PHONE1 && MenuCmdIdm_strArray.GetSize())//消息范围判断
{CClientDC dc(pView);
dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));return TRUE;//函数返回,避免调用CFrameWnd::OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理}
return CFrameWnd::OnCommand(wParam, lParam);
//调用基类OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理}
十七:对话框类CDialog
1.重要函数与成员变量
一:每个窗口类创建的对象的同时都拥有一个窗口句柄m_hWnd的成员变量。二:GetDlgItem(IDC)== 关联一个变量; 通过控件ID 获得控件对象指针 三:GetWindowText(CString& rString)/ /获得窗口、安键文本(char类型)四:int atoi(const char *string);itoa()// 把一个字符串与INT 类型的数值转为 五
:
GetDlgItemText(IDC_EDIT1,ch1,10)==GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);在一个窗口控件中直接读取文本到字符数组中
六:INT GetDlgItemInt()//获得控件文本,并转换成数值类型 七: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消息完成消息任务: ::SendMeage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
m_edit1.SendMeage(WM_GETTEXT,10,(LPARAM)ch1);六:直接给ID控件发送消息:
SendDlgItemMeage(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);//设
//获得窗口大小十九:设计焦点事件(Tab Stop)
先对改变焦点事件做消息响应(如对回车ID_OK的响应)后
① GetFocus()->GetNextWindow()->SetFocus();//对最后一个不能判断。
②GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();/对最后一个不能判断。
③GetNextDlgTabItem(GetFocus())->SetFocus();//最好
回车事件为窗口缺损消息由ONOK()响应,可通过对控件属性设计为缺损做消息响应以接收这个消息。廿:查看/改变对话框控件排列的秩序
在对话框资源界面中:Layout->Tab Order->改顺序。
廿一:逃跑按钮的巧妙实现
①创建多个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);负索引号值。
②对适当事件作消息响应通过引号。
int index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();取得索
((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);通过索引号将值存入字符串中。③对适当事件作消息响应通过新的CString类型变量记录这个字符串。
④使用选择值时作消息响应,通过CString类型变量以str+=“程序员”等方式直接使用。⑤使用完后在使用类的构造函数中对数组初始化
廿六:列表框操作方法:ClistBox类
①对所有复选按钮都关联一个CString类型的变量.并做OnInitDialog()虚函数消息响应通过AddString()初始化选项值。
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(“北京”);
②对适当事件作消息响应通过新的CString类型变量记录关联变量的选择值。
③使用选择值时作消息响应,通过CString类型变量以str+=“程序员”等方式直接使用。④使用完后在使用类的构造函数中对数组初始化。
廿七:解决添加类成功后ClaWizard找不到其.h//.cpp文件
①在本工程目录下删除.CLW 文件;.CLW 为管理类信息的文件。②在工程中View->ClaWizard->是(输入这个文件名.CLW)
廿八:修改MFC AppWizard向导生成的框架程序窗口的大小和标题:在CMainFrame类中
在CMainFrame类中一法:在PreCreateWindow()中(窗口创建前)查MSDN的Frame-window styles
cs.cx=300;cs.lpszName=“http://www.daodoc.com”;
二法:在CMainFrame类的OnCreate()中:(窗口创建后)调用SetWindowLong()
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);廿九:修改MFC AppWizard向导生成的框架程序窗口的图标:在CMainFrame类中
PreCreateWindow()一:中同窗口的创建相同:WNDCLASS wndcls;->设计->注册->修改
二cs.lpszCla=AfxRegisterWndCla(CS_HREDRAW CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));OnCreate()中三
OnCreate()中
加载系统图标:SetClaLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
四:加载自定义图标: m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
SetClaLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);
三十:修改MFC AppWizard向导生成的框架程序窗口的背景、光标:在CView类中
PreCreateWindow()中一法:cs.lpszCla=AfxRegisterWndCla(CS_HREDRAW | CS_VREDRAW, LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);OnCreate()
中
二
法
:SetClaLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));SetClaLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
背景
光标
卅一获得当前应用程序实例句柄的方法:
一:AfxGetInstanceHandle()二:theApp.m_hInstance三:AfxGetApp()->m_hInstance,卅一:.工具栏按钮编程和手动添加工具栏
CToolBar类 对菜单进行消息响应,对常用菜单在Resource的ToolBar中设计工具栏按钮,将其ID设计于菜单栏ID相同
手动添加工具栏查看MSDN的CToolBar类。也可查看CMainFrame::OnCreate()函数。
卅二:向应用程序导入图标资源:
将图标资源copy到本工程的.res目录下,insert->rousert->import导入图标资源
卅三:对菜单进行消息响应使自定义工具栏显示和隐藏:m_newToolBar为工具栏类对象。
1法:if(m_newToolBar.IsWindowVisible()){m_newToolBar.ShowWindow(SW_HIDE);} else{m_newToolBar.ShowWindow(SW_SHOW);}
RecalcLayout();
DockControlBar(&m_newToolBar);// 工具栏停靠函数 2法:ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
卅四:对状态栏的状态指示器编程(编写时钟显示)CstatusBar类
①在String Table资源中加入ID资源并在CmainFrame的头文件中建立一个CstatusBar类对象。
②在CmainFrame类.cpp的static UINT indicators[]结构第一个ID后添加这个ID.就可显示这个String。
③在OnCreate()通过Cstring对象格式化记录要输出的内容。这里是时间.CTime t=CTime::GetCurrentTime();CString str=t.Format(“%H:%M:%S”);④ 通过
CSize sz=dc.GetTextExtent(str);取得屏幕输出要的宽度。
Int index=m_wndStatusBar.CommandToIndex(IDS_TIMER)//通过ID取得索引号并通过索引号设计窗格宽度 类对象.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);⑤类对象.SetPaneText(1,str);输出内容。
⑥在OnPaint()中重写代码,当窗口重绘时再只显示。
卅五:对状态栏的指示行的编程 ①在响应的类中作消息响应。并编代码。②通过Cstring对象格式化记录要输出的内容如
CString str;
str.Format(“x=%d,y=%d”,point.x,point.y);③显示(有四种方法)一:((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);m_wndStatusBar为CstatusBar类对象
二:((CMainFrame*)GetParent())->SetMeageText(str);
三:((CMainFrame*)GetParent())->GetMeageBar()->SetWindowText(str);四str);
AFX_IDW_STATUS_BAR为系统准备的状态栏ID号;
:GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(卅六:进度栏的编写:CprogreCtr类
①在头文件中建立一个CprogreCtrr类对象。并在OnCreate()中通过对象创建一个进度栏。②
卅七:发送自定义消息:
①在头文件中定义消息宏:#define UM_PROGRESS
WM_USER+1 ②作消息映射③在要响应消息处通过SendMeage(UM_PROGRESS)或PostMeage(UM_PROGRESS)发送消息调用函数做要做的任务。SendMeage(UM_PROGRESS)发送消息马上调用函数
ostMeage(UM_PROGRESS)发送消息到消息队列中,并继续运行进程。
卅八:为应用程序添加启动画面
①1系统添加法:① Project->Add to Project->Components and Controls->Visual C++ conpenets->Splash Screen->Insert->选择类(不能选CmainFram)
②在Ontimer()中对显示时间做设计。如果手动添加可参看这个方法。
卅九:使用标准颜色对话框,标准字体对话框(CcolorDialog类,CfontDialog类)
颜色对话框:①做消息响应并建立控件对象,CColorDialog dlg;②创建颜色对话框并通过对象的数据成员m_cc指向的结构取的选择的颜色dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;//设计标记if(IDOK==dlg.DoModal()){
COLORREF m_clr=dlg.m_cc.rgbResult;}通过rgbResult的记录输出客户的选择。就可以在画笔、画刷、字体设计颜色。
字体对话框(雷同):①做消息响应并建立控件对象,CFontDialog dlg;②创建字体对话框并通过对象的数据成员m_cf指向的结构变量lpLogFont的字体值初始化自定义字体CFont m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);就可为DC加载字体③为联系创建字体,要对m_font资源做判断,如果存在就释放资源在创建。
if(m_font.m_hObject)m_font.DeleteObject();查MSDN的类和它们的成员变量看事例。
四十:改变对话框的背景色,控件字体色、背景色(Cbutton除外)。
①做WM_CTLCOLOR消息响应,并创建一个CBRUSH对象,return这个对象来改变对话框的背景色 ②通过pWnd->GetDlgCtrlID()==ID—做判断,/用
pDC
调用SetTextColor(RGB(255,0,0));
SetBkMode(TRANSPARENT);SetBkColor(RGB(0,0,255));改变控件字体色、背景色,背景模式。
泗一:改变CButton控件字体色、背景色
①在工程中加入一个以CButton为基类的新类。并重载虚函数DrawItem();②在函数体中加入MSDN中CButton类的DrawItem()的示例代码。(改变背景色要自写代码)。
③在CButton控件中关联这个新类的变量,同时将控件属性Styles->Ower Draw选择上就可以改变字体色。改变背景色代码:有别人写的CSXBtn类和CButtonST类,以备:加载到工程中。
用CSXBtn类雷同上,CButtonST类如下:
①加载CButtonST到工程中,在CButton控件中关联这个新类的变量,重载:OnInitDialog()调用下面的函数
BOOL CSettingDlg::OnInitDialog()
{CDialog::OnInitDialog();m_btnST.SetActiveBgColor(RGB(0,0,255));m_btnST.SetActiveFgColor(RGB(255,0,0));}
泗二:在窗口中显示一幅位图。四步:
1、准备一副位图,响应WM_ERASEBKGND消息。
2、创建位图 bitmap.GetBitmap(&bmp);}
3、创建兼容DC CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);
4、将位图选到兼容DC中
dcCompatible.SelectObject(&bitmap);在GetClientRect(&rect)取的客户矩形。
5、将兼容DC中的位图贴到当前DC中。pDC->BitBlt(rect.left,rect.top,rect.Width(), {或pDC->StretchBlt();} rect.Height(),&dcCompatible,0,0,SRCCOPY);
6、return TRUE;后也可在OnDraw()中又重绘。CBitmap
bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
{BITMAP
bmp;泗三:图形的保存和重绘
一法::
①在工程中添加一普通类,添加多个成员变量以保存图形的各要素,并添加带这几个参数的构造函数来初始化对象
②在绘图的View中建立CptrArray(或别的集合类)对象,在绘图函数中建立这个普通类的对象,没次绘图都记录这些数据并用
Add()添加到集合类对象中以保存图形。③在OnDraw()中用GetSize()取数组个数做循环,嵌套switch用GetAt(i)取图形类型重绘图形。for(int i=0;im_nDrawType)case X:}
二法:利用兼容DC实现图形的保存和重绘
①在View类中建一个CDC m_dc对象,在绘图响应函数中通过它建立一个兼容DC对象,并建一个兼容位图对象记录要保存的图片,将兼容位图选入兼容DC中,if(!CDC m_dcCompatible.m_hDC){ m_dcCompatible.CreateCompatibleDC(&dc);CRect rect;GetClientRect(&rect);CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);/*将原始设备颜色和象素拷贝到兼容DC中*/m_dcCompatible.SelectObject(pBrush);} ②可以用兼容DC在绘图函数中作图。③在重绘函数
OnDraw()中通过兼容DC将记录的兼容位图拷贝到矩形空间。CRect rect;GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);三法:CmetaFileDC 类: 查MSDN的介绍有步骤。
泗四:文件的操作,增加“打开、保存”文件对话框,注册表的读写
文件的操作:Cfile类 “打开、保存”文件对话框:CfileDialog类和m_ofn成员函数OPENFILENAME结构。
注册表的读写:查MSDN的Registry Functions
泗五:使用CArchive类对文件串行化(查MSDNCArchive类)①创建一个文件对象用于保存数据,同时创建一个CArchive ar 对象。
②通过ar>>将要输入的数据保存到文件中。同样也可通过ar
泗六:修改文挡标题的方法:
①法:在C*Doc类的OnNewDocument()中调用SetTitle()。注:在文挡、视图、框架创建是调用OnNewDocument(),所以可以添加代码设计它们。
②法:在资源String Table的IDR_MAINFRAME的第一二个n间修改字符。注:IDR_MAINFRAME包含的内容:主窗口名、文挡名、文挡类等。(查MSDN的CDOCTemplate::GetDOCString())
泗七:新类的串行化和文挡对图形的串行化处理过程:永久保存图形绘制图形:
第一步:实现新类对串行化的支持:(查MSDNCArchive类对CObject的串行化)①建立一个记录图形各要素的新类,并以CObject为基类。
②在新类中覆盖void Serialize(CArchive& ar)虚函数,并通过CArchive& ar对象实现存取。
③在新类头文件中加
DECLARE_SERIAL(新类名)的宏。
④在新类实现文件中加IMPLEMENT_SERIAL(新类名, CObject, 1)的宏。⑤在新类中重载一个不带参数的构造函数。(有初始化要素的构造函数)后这个类就支持串行化了。串行化完成。
⑥在新类中添加void Draw(CDC *pDC)函数实现对图形的重绘。第二步:绘制图形并永久保存图形:①在
《操作系统原理》算法总结一、进程(作业)调度算法 先来先服务调度算法(FCFS):每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进......
编译原理知识点总结编译原理是大学计算机专业的必修科目,也是计算机的基础知识,学好编译原理,有助于更好的进行编程的操作,下面是编译原理知识点总结,一起来看看吧!编译原理知识点......
刀豆文库小编为你整合推荐8篇编译原理知识点总结,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
刀豆文库小编为你整合推荐8篇编译原理期末总结复习,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
编译原理期末总结复习篇一:一、简答题1.什么是编译程序?答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序 。将高级程序设计语言程序翻译成逻辑上等价......