孙鑫老师VC笔记 下载本文

内容发布更新时间 : 2024/5/7 18:05:32星期一 下面是文章的全部内容请认真阅读。

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 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.H 5.如何从句柄获得对象的指针? 答FromHandle

6.类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。 7.理解代码区,数据区,堆,栈! 请见下面的简介:

http://www.downcode.com/server/j_server/J_1010.Html

对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 第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;//获得字体高度。 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); CRgn rn;

rn.CreateRectRgn(0,50,sz.cx,sz.cy); pDC->SelectClipRgn(&rn,RGN_DIFF);

路径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。 4.在View上输入文字的步骤。 CFont font;//创建字体对象

font.CreatePointFont(300,\华文行楷\设置

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_ptOrigin.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);//输出字体 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 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);此函数的作用是将字符串输出到长方形中,但如果字符串的长度超过长方形的长度,多余的字符将被截断 //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.SetTextColor(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, // handle of CWnd that called SetTimer UINT nMsg, // WM_TIMER

UINT nIDEvent, // timer identification DWORD dwTime // system time ) {

// MessageBox((((CMainFrame *)AfxGetMainWnd())->m_hWnd),\;

CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;//获得MainFrame的指针 CTextView *pView=(CTextView *)pMain->GetActiveView();//获得view的指针 CClientDC dc(pView);//构造DC dc.TextOut(333,222,\world\

}//我们可以看出,使用回调函数时要获得窗口或者APP的指针,给我们的操作带来麻烦。并不方便。 第6课

1.当对某菜单添加消息响应函数时,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)?一个子菜单只能有一个缺省菜单。 //GetMenu()->GetSubMenu(0)->SetDefaultItem(5,TRUE); str.Format(\GetSystemMetrics(SM_CYMENUCHECK));//获得系统的菜单的位图的大小。 /* SetMenu(NULL);//移除菜单 CMenu menu;

menu.LoadMenu(IDR_MAINFRAME);

SetMenu(&menu);

menu.Detach();*/增加菜单,此处detach(),如果是局部变量。 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(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,\

GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,\\

menu.AppendMenu(MF_STRING,IDM_HELLO,\menu.AppendMenu(MF_STRING,112,\menu.AppendMenu(MF_STRING,113,\menu.Detach();

GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,\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中增加#define IDM_HELLO 123 b.在MainFrm.h中加入afx_msg void OnHello();

c.MainFrm.cpp中加入ON_COMMAND(IDM_HELLO,OnHello) d.最后加入