版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、老孙的教学笔记(转) 第一课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.函数
2、名可以代表函数代码的首地址,即可作为函数指针。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()
3、要成对使用,否则会内存泄漏。同样,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"/包含sp
4、rintf,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(.)/实现回调函
5、数switch(uMsg)case WM_CHAR:break;. 第2课1.定义结构体和类时别忘记在最后加入";"号!例如Class Pointint x;int y;2.i nclude <xxx.h>与i nclude "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!3.类的定义中,如果未指明成员类型,则缺省为private.而结构体中则缺省为public.4.引用:引用经常用在函数的传参上。另外数值交换函数也经常用引用。例change(int &x,int &y
6、)int temp;temp=x;x=y;y=x调用时即可以用 int a=3;int b=4;change(a,b);一般不用指针来作为参数进行数值交换。因为会引起歧义。5.通常将类的定义放.h文件,而将其实现放在cpp文件中,别忘记了在cpp文件中i nclude "xxx.h"6.如何防止类的重复定义?用#inndef Point_H_H#define Point_H_Hclass Point;#endif来防止7.源文件cpp文件单独编译成obj文件。最后由链接器将与将要使用到的C+标准库类链接成exe文件,头文件不参加编译。所以在cpp文件中别忘记了加入i ncl
7、ude "xxx.h"8.函数的覆盖,在子类中重写父类的函数,此时采用早期绑定的方法。如果加入了virtual,则将采用迟绑定的技术,在运行时根据对象的类型确定调用哪一个函数。此迟绑定技术是MFC的类的继承的精髓。9.强制类型转换。如果CFish从CAnimal派生而来。则可以将鱼的对象转换为CAnimal的对象,而反之则不行。从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。再如int可以强制转换成char型。而反之则出错。 第3课1.在main或WinMain之前,全局变量已经被分配内存并初始化了。2.在MFC中在WinMain之前有个theApp全局变量
8、先被构造并被初始化,而由于子类构造函数执行前,其父类的构造函数先被执行,所以CTestApp的父类CWinAPP的构造函数先执行。产生了theApp对象后,在WinMain()中的指针*pThread和*pApp就有了内容。3.MFC大致流程:CTestApp theApp;/构造全局对象WinMain()AfxWinMain();/调用下面的函数AfxWinMain()pThread->Initinstance();/初始化工作和注册窗口类,窗口显示和更新pThread->Run();/消息循环而在BOOL CTestApp:InitInstance()中的代码CSingleDo
9、cTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CMainFrame), / main SDI frame window RUNTIME_CLASS(CTestView);AddDocTemplate(pDocTemplate);完成了将这三个类关联起来的工作。4.如何在单文档文件中显示一个C
10、Button的对象?在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函数的第二
11、个参数中加入WS_VISIBLE 参数才行。否则必须调用ShowWindow也可以在view的OnCreate消息响应函数中加入 (3).CButton类的定义头文件在afxwin.h中,而stdafx.h包含了afxwin.h,所以可以直接使用。因为MFC中的每一个类中都有i nclude "stdafx.h"的声明。 第4课1.在单文档中view挡在MainFrame的前面。此时如果编写针对MainFrame的mouseClick事件,将不会有反应。2.消息响应会在3处修改代码,1处是在头文件中,/A
12、FX_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_MSGDECLARE_MESSAGE_MAP()另一处是cpp文件的begin MessageMap和End MessageMap之间,BEGIN_MESSAGE_MAP(CDrawView, CView)/AFX_MSG_MAP(CDra
13、wView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()最后是要有函数实现的代码。void CDrawView:On
14、LButtonDown(UINT nFlags, CPoint point) / TOD Add your message handler code here and/or call defaultm_ptOrigin=m_ptOld=point;m_bDraw=TRUE;CView:OnLButtonDown(nFlags, point);3.画线:定义一个成员变量保存mouseDown的点m_Point 1)API函数方法画线用HDC 2)用CDC类成员函数画线。此时别忘记ReleaseDC 3)用CClientDC 4)用CWindowDC
15、,用它甚至可以整个屏幕区域画线。下面是上面4种方法的代码/*HDC hdc;hdc=:GetDC(m_hWnd);MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);LineTo(hdc,point.x,point.y);:ReleaseDC(m_hWnd,hdc);必须成对使用。*/*CDC *pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);必须成对使用。*/CClientDC dc(this);/*CClientDC dc(GetParent();d
16、c.MoveTo(m_ptOrigin);dc.LineTo(point);此处不需要ReleaseDC,因为CClientDC会自动释放DC*/CWindowDC dc(this);/CWindowDC dc(GetParent();/*CWindowDC dc(GetDesktopWindow();/此时可以在整个屏幕上画线。dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/*CPen pen(PS_DOT,1,RGB(0,255,0);CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);dc
17、.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);*/ 5)用Bitmap填充所画的矩形。CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);/CBRUSH:FromHandle是静态成员函数,所以可以用下面的方法调用。CBrush *pBrush=CBrush:FromHandle(H
18、BRUSH)GetStockObject(NULL_BRUSH);CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point);dc.SelectObject(pOldBrush);m_bDraw=FALSE; 6)用其它颜色画线CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,0,0);CPen *pOldPen=dc.SelectObject(&pen);/选中红色画笔if(m_bDraw=TRUE) dc.SetROP
19、2(R2_BLACK);/设置绘画模式 dc.MoveTo(m_ptOrigin); /dc.LineTo(point); dc.LineTo(m_ptOld); /dc.MoveTo(m_ptOrigin); dc.MoveTo(m_ptOld); dc.LineTo(point); /m_ptOrigin=point; m_ptOld=point;dc.SelectObject(pOldPen);4.MFC中隐式的包含了windows.h。为什么?因为在AFXV_W32.h文件中:/ This
20、is a part of the Microsoft Foundation Classes C+ library./ Copyright (C) 1992-1998 Microsoft Corporation/ All rights reserved.在AFXWIN.h中/ Note: WINDOWS.H already included from AFXV_W32.H5.如何从句柄获得对象的指针?答FromHandle6.类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已
21、然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。7.理解代码区,数据区,堆,栈!请见下面的简介:对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,
22、即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 第5课1.CWnd:CreateSolidCaret创建插入符,ShowCaret()显示插入符。GetTextMetrics(),获得当前字体的一些信息。CWnd:CreateCaret()创建图象插入符bitmap.LoadBitmap(IDB_BITMAP1);/此处的bitmap为成员变量!CreateCaret(&bitmap);ShowCaret();TEXTMETRIC tm;/字体结构体dc.GetTextMetrics(&tm);/m_ptOrigin.y+=tm.tmHeight;/获得字体
23、高度。2.VC中CString:LoadString(ID号),比较方便。3.路径层的概念:有两种方法创建路径层: (1)pDC->BeginPath();pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);pDC->EndPath();pDC->SelectClipPath(RGN_DIFF); (2) CSize sz=pDC->GetTextExtent(str);
24、 CRgn rn; rn.CreateRectRgn(0,50,sz.cx,sz.cy); pDC->SelectClipRgn(&rn,RGN_DIFF);路径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。4.在View上输入文字的步骤。CFont font;/创建字体对象font.CreatePointFont(300,"华文行楷",NUL
25、L);/设置CFont *pOldFont=dc.SelectObject(&font);/将字体选择到DC中TEXTMETRIC tm;/创建字体信息对象dc.GetTextMetrics(&tm);/获得当前字体信息if(0x0d=nChar)/处理回车键 m_strLine.Empty(); m_ptOrigin.y+=tm.tmHeight;else if(0x08=nChar)/处理退格键 COLORREF clr=dc.SetTextColor(dc.GetBkColor(); dc.TextOut(m_ptOrigi
26、n.x,m_ptOrigin.y,m_strLine); m_strLine=m_strLine.Left(m_strLine.GetLength()-1); dc.SetTextColor(clr);else m_strLine+=nChar;CSize sz=dc.GetTextExtent(m_strLine);CPoint pt;/处理光标的位置pt.x=m_ptOrigin.x+sz.cx;pt.y=m_ptOrigin.y;SetCaretPos(pt);dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine
27、);/输出字体dc.SelectObject(pOldFont);/将原先的字体选择回去。5.模拟卡啦OK变色的步骤。 (1)设置定时器 (2)在定时器中加入如下代码/DEL m_nWidth+=5;/此为view的成员变量,初始值为0/DEL /DEL /DEL CClientDC dc(this);/DEL TEXTMETRIC tm;/DEL dc.GetTextMetrics(&tm);/DEL CRect rect;/DEL rect.left=0;/DEL
28、 rect.top=200;/DEL rect.right=m_nWidth;/DEL rect.bottom=rect.top+tm.tmHeight;/此长方形的长度随着定时器的触发,逐渐增大/DEL /DEL dc.SetTextColor(RGB(255,0,0);/DEL CString str;/DEL str.LoadString(IDS_WEIXIN);/DEL dc.DrawText(str,rect,DT_LEFT);此函数的作用是将字符串输出到长方形中,但如果字符串的长度超过长方形的长度,
29、多余的字符将被截断/DEL /DEL rect.top=150;/DEL rect.bottom=rect.top+tm.tmHeight;/DEL dc.DrawText(str,rect,DT_RIGHT);/DEL /DEL CSize sz=dc.GetTextExtent(str);获得字符串的长度/DEL if(m_nWidth>sz.cx)当长方形的长度大于字符串的长度后,将其重新归0/DEL /DEL m_nWidth=0;/DEL dc.SetText
30、Color(RGB(0,255,0);/DEL dc.TextOut(0,200,str);/DEL /DEL /DEL CView:OnTimer(nIDEvent);6.SetTimer也可以用回调函数来操作,但并不方便。以下是步骤 (1) 在View的OnCreate消息响应函数中:SetTimer(1,1000,Timer2Proc); (2) 回调函数的实现:void CALLBACK EXPORT Timer2Proc( HWND hWnd,
31、; / handle of CWnd that called SetTimer UINT nMsg, / WM_TIMER UINT nIDEvent, / timer identification DWORD dwTime / system time)/ MessageBox(CMainFrame *)AfxGetMainWnd()->m_hWnd),"ddfaf
32、","weixin",0);CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;/获得MainFrame的指针CTextView *pView=(CTextView *)pMain->GetActiveView();/获得view的指针CClientDC dc(pView);/构造DC dc.TextOut(333,222,"hello world");/我们可以看出,使用回调函数时要获得窗口或者APP的指针,给我们的操作带来麻烦。并不方便。 第6课1
33、.当对某菜单添加消息响应函数时,4个类的消息响应优先次序分别是:1.View;2.CDOC;3.CMainFrame.4.CWinAPP.为什么?请参阅深入浅出2.消息分类:a;标准消息(以WM_开头的消息,但不包括ON_COMMAND);b;命令消息 ON_COMMAND(IDM_PHONE1, OnPhone1),菜单和工具栏的消息。c.通告消息:按钮,列表框发出的消息。CCmdTarget只能接受命令消息。而从CCmdTarget派生的CWnd可以接收命令消息,也可以接受标准消息。3.确定菜单的索引号,注意从0开始,分隔符也算数。什么叫弹出菜单(Popup Menu)?一个子菜单只能有一
34、个缺省菜单。 /GetMenu()->GetSubMenu(0)->SetDefaultItem(5,TRUE);str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK);/获得系统的菜单的位图的大小。/* SetMenu(NULL);/移除菜单CMenu menu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);menu.Detach();*/增加菜单,此处detach
35、(),如果是局部变量。4.void CMainFrame:OnUpdateEditCut(CCmdUI* pCmdUI) if(2=pCmdUI->m_nIndex) pCmdUI->Enable();/当此菜单显示时,设为可用。5.右键弹出菜单功能的实现方法有两个: a.Project->Add to Project->component and controls->文件夹VC components->Popup Menu OK b.用TrackPopupMenu()实现。CMenu menu;menu.LoadMenu
36、(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);ClientToScreen(&point);pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, GetParent();6.动态创建菜单的方法:CMenu menu;menu.CreatePopupMenu();/ GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");GetMen
37、u()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"WinSun");menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");menu.AppendMenu(MF_STRING,112,"Weixin");menu.AppendMenu(MF_STRING,113,"Mybole");menu.Detach();GetMenu()->GetSubMenu(0)->AppendMenu(MF_
38、STRING,114,"Welcome");GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING,115,"维新");/ GetMenu()->DeleteMenu(1,MF_BYPOSITION);/ GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);7.为动态创建的菜单增加消息响应的步骤 a.在resource.h中增加#defin
39、e IDM_HELLO 123 b.在MainFrm.h中加入afx_msg void OnHello(); c.MainFrm.cpp中加入ON_COMMAND(IDM_HELLO,OnHello) d.最后加入void CMainFrame:OnHello()MessageBox("Hello!");8.动态增加电话号码本步骤 a.处理WM_Char消息。如果回车,则清空字符串,窗口重绘invalidate,将人名加入到菜单中,将字符串保存集合类CStringArray中,用的是成员函数Add方法。 b.取出动
40、态创建的菜单的数据的方法。 1)创建一个弹出菜单,弹出菜单下面有4个子菜单。将子菜单的ID号连续。 2)在resource.h中添加#define IDM_PHONE1 123. 3)添加其消息响应函数。注意注释中的文字BEGIN_MESSAGE_MAP(CMenu2View, CView)/AFX_MSG_MAP(CMenu2View)ON_WM_CHAR()ON_COMMAND(ID_EDIT_COPY, OnEditCopy)/下面的4句代码原来在此处。/AFX_MSG_MAP/
41、Standard printing commandsON_COMMAND(IDM_PHONE1, OnPhone1)/一定要这4句代码移到此处。ON_COMMAND(IDM_PHONE2, OnPhone2)ON_COMMAND(IDM_PHONE3, OnPhone3)ON_COMMAND(IDM_PHONE4, OnPhone4)ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CVi
42、ew:OnFilePrintPreview)END_MESSAGE_MAP() 4)填写代码9.如何在MainFrame中拦截OnCommand消息?答,在它增加OnCommand的消息处理函数即可。10.错误调试方法:Missing "" before "*"CMenu2Doc* GetDocument();/因为CMenu2Doc是个不认识的变量,将其头文件包含进即可。 第7课1.如果在SDI中要调用对话框 a.先插入一个对话框资源; b.然后在ClassWizards中为其创建一
43、个类。其目的是比较方便为添加按纽和消息响应函数。 c.然后实例化它。在实例化时,必须将其头文件包含进去。2.创建非模态对话框,注意它不能是局部变量。当 点击非模态对话框的OnOK按纽时,它并没有关闭,而是隐藏了。需要调用destroyWindow().3.一个对象只能一个按纽。为什么?因为在Wincore.cpp的628行有代码 ASSERT(pWnd->m_hWnd = NULL); / only do once而创建后它的m_hWnd就不为0了。此处ASSERT的用法是如果括号里面不为真,则程序崩溃。4.如何为静态文本框增加消息响应?首先将IDC_
44、STATIC改名。同时还需要将Notify特性复选中。5.完成加法功能。 a.GetDlgItem(); b.GetDlgItemText(); c.GetDlgItemInt(); d.将IDC_EDIT1关联CEDIT类型变量 e.将IDC_EDIT1关联int型变量。注意调用 UpdateData(); f. /:SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);/:SendMessage(m_edit1.m_hWnd,WM
45、_GETTEXT,10,(LPARAM)ch1);/GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1); g. SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);6.点击按纽改变窗口尺寸 if(GetDlgItemTe
46、xt(IDC_BUTTON2,str),str="收缩<<") SetDlgItemText(IDC_BUTTON2,"扩展>>");static CRect rectLarge;static CRect rectSmall;if(rectLarge.IsRectNull() CRect rectSeparator; GetWindowRect(&rectLarge); GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rect
47、Separator); rectSmall.left=rectLarge.left; rectSmall.top=rectLarge.top; rectSmall.right=rectLarge.right; rectSmall.bottom=rectSeparator.bottom;if(str="收缩<<") SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDE
48、R);else SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER);7.回车时将输入焦点移动到下一个控件SetWindowLong()改变窗口的属性。方法1:改变控件的回调函数,注意IDC_EDIT1的MultiLine要复选上。WNDPROC prevProc;LRESULT CALLBACK WinSunProc( HWND hwnd, / handle to w
49、indow UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter)if(uMsg=WM_CHAR && wParam=0x0d) /:SetFocus(:GetNextWindow(hwnd,GW_HWNDNEXT); /SetFocus(:GetWin
50、dow(hwnd,GW_HWNDNEXT); CString str; str.Format("%d",hwnd); AfxMessageBox(str);/, UINT nType = MB_OK, UINT nIDHelp = 0 );/ AfxGetApp()-> SetFocus(:GetNextDlgTabItem(:GetParent(hwnd),hwnd,FALSE); return 1;else return prevProc(hwnd,uMsg,wParam,lPar
51、am);BOOL CTestDlg:OnInitDialog() CDialog:OnInitDialog();/ TOD Add extra initialization hereprevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC, (LONG)WinSunProc);/设置回调函数return TRUE; / return TRUE unless you set the focus to a control
52、 / EXCEPTION: OCX Property Pages should return FALSE方法2:在OnOK响应函数中加入代码/GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();/GetFocus()->GetNextWindow()->SetFocus();/GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();GetNextDlgTabItem
53、(GetFocus()->SetFocus(); 第8课 对话框1.如何改变按纽的字体?在对话框的属性中改变字体的属性即可2.逃跑按纽的实现 1.从CButton派生一个类,CWeixinBtn 2.将IDC_EDIT1关联成员变量m_btn1,类型为CWeixinBtn,注意要包含头文件。 3.在CWeixinBtn中加一个指针成员变量CWeixinBtn *pWeixinBtn,然后将其地址初始化。 4.在新类中增加鼠标移动的消息处理。3.属性表单 1.插入属性页资源。Insert->new Re
54、source->Dialog 2.当选择Classwizard菜单时,系统提示是否为创建新的类,我们将其从CPropertyPage派生!这样可以为方便为其增加消息响应函数。 3.插入新的从CPropertySheet派生的类,在类中增加3个CPropertyPage的实例。 4.在view中增加菜单项,当点击时显示属性表单,出现中文乱码,修改CPropertyPage属性为中文,另外将其字体设为宋体。 5.在CPropertyPage中设置SetWizardButtons可将其属性改为上一步、完成! 6.为IDC_RADIO1
55、关联成员变量,需要先设置Group属性才行。另外别忘记调用UpdateData(). 7.为CPropertyPage增加虚函数,OnWizardNext,如果用户点击下一步时,不想让他进入下一步,刚返回-1! 8.将用户的选择输出到屏幕上,此时可以在View中增加几个成员变量,用来接收用户选择的数据。4.memset()的用法! memset(m_bLike,0,sizeof(m_bLike); 第9课1.修改外观和图标可以在MainFrm中进行,而修改背景和光标只能在View中进行。为什么?因为view的显示挡在了MainFrame的前面。 a
56、.在MainFrame中 PreCreateWindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在PreCreateWindow()中修改 也可以用简单的方法,用全局函数/cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,/ LoadIcon(NULL,IDI_WARNING); 在窗口创建之后,在OnCreate()中修改/SetWind
57、owLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);/SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & WS_MAXIMIZEBOX);/ SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR); b.在View中 PreCreateWindow()中/cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VRED
58、RAW,/ LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);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
59、.创建一个不断变化的图标。用定时器和SetClassLong完成 a.准备三个图标文件,放在RES文件夹,Insert->Resource-三个图标, b.在CMainFrame中增加图标句柄数组,m_hIcons3m_hIcons0=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1);/MAKEINTRESOURCE是一个宏,它将整数转化为Win32的资源类型,简单的说它是一个类型转换#define MAKEINTRESOURCEA(i) (LPSTR)(DWORD)(WORD)(i)m_hIco
60、ns1=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2);/此处需要用到theAPP对象,故要在文件中声明extern CStyleApp theApp;m_hIcons2=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3);然后将其初始化 c.然后在定时器中实现3.工具栏的编程 a.加入分隔符的方法,向右拖动即可; b.删除按纽的方法,拖出即可。4.创建一个新的工具栏的方法 a.插入一个工具栏,画出其图形。
61、160; b.在头文件中,定义CToolBar m_newToolBar c.在MainFrm.cpp的OnCreate()中调用if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_newToolBar.LoadToolBar(IDR_TOOLBAR1) TRACE0("Failed to
62、 create toolbarn"); return -1; / fail to create d.点击“新的工具栏”菜单时,隐藏工具栏。两种方法 第一种/*if(m_newToolBar.IsWindowVisible() m_newToolBar.ShowWindow(SW_HIDE);else m_newToolBar.ShowWindow(SW_SHOW);RecalcLayout();DockControlBar(&m_newToolBar);*/ 第二种ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE); e.将菜单增加复选标记。在OnUpdateUI中加入代码 pCmdUI->SetCheck(m_newToolBar.IsWindowVisible();5.状态栏编程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江丽水缙云县壶镇怡亚通液压招聘14人备考题库及答案详解(新)
- 2026新疆博尔塔拉州博乐市奕顺财务管理有限公司招聘1人备考题库含答案详解(模拟题)
- 2026年河南省(信阳市)事业单位公开联考招聘400名备考题库附答案详解(能力提升)
- 2026湖南郴州高新技术产业开发区综合服务中心招募见习生7人备考题库有答案详解
- 2026云南玉溪市江川区中医医院就业见习岗位招募11人备考题库含答案详解(培优)
- 2026上海城投集团春季校园招聘备考题库及1套参考答案详解
- 2026浙江省商业集团有限公司招聘4人备考题库(第3期)附答案详解(培优)
- 2026内蒙古巴彦淖尔市临河区老年大学班主任储备人才招募备考题库及答案详解(新)
- 2026天津津融国盛股权投资基金管理有限公司社会招聘1人备考题库参考答案详解
- 2026上半年安徽合肥新荃湖商业管理有限公司招聘9人备考题库及答案详解(夺冠)
- 屋顶分布式光伏电站施工管理要点
- HYT 271-2018 海洋多参数水质仪检测方法(正式版)
- 曲黎敏《黄帝内经》-全套讲义
- 万宁市病死畜禽无害化处理中心项目 环评报告
- 《引航》系列特刊2-《共建绿色丝绸之路进展、形势与展望》
- 全国优质课一等奖小学道德与法治六年级下册《地球-我们的家园》第1课时(完美版课件)
- 王朔现象与大众文化课件
- GB/T 311.1-2012绝缘配合第1部分:定义、原则和规则
- GB/T 26022-2010精炼镍取样方法
- 中药饮片处方点评表
- 赢时胜系统与恒生系统介绍课件
评论
0/150
提交评论