内容发布更新时间 : 2024/11/5 20:44:11星期一 下面是文章的全部内容请认真阅读。
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.最后加入