孙鑫C++第五堂课要点

1、在资源视图Menu中,打开IDR_MAINFRAME中,文件弹出菜单称为弹出菜单,像“文件”这种选项不能够添加消息响应函数,而将“文件”的“属性”中的“Popup”由false改为true,就可添加消息响应函数。

2、控件ID:图标以IDI_开头,光标以IDC_,菜单用IDM_,来表示。

3、在资源视图Menu中添加消息响应函数,如果在不同类中添加相同消息响应函数,则响应的顺序为:视图类(View)、文档类(Doc)、框架类(Frame)、应用程序类(App)。

4、消息的分类:

  1. 标准消息:除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接受到这类的消息。
  2. 命令消息:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标示(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接受到这类消息。
  3. 通告消息:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接受到这类消息。

     总而言之,从CWnd派生出来都可以接受上面3种,而从CCmdTarget派生的类不能够接受标准消息。

5、菜单定义:菜单栏->子菜单(弹出菜单整个部分)->菜单项。

6、由于孙鑫视频教程使用VC6.0,在VS2010中使用的时候,在创建应用程序时,“应用程序类型”里选择“项目类型”是“MFC标准”。然后在“用户界面功能”里“命令栏(菜单/工具栏/功能区)”里选择使用“使用经典菜单”(可以再选上“使用浏览器样式的工具栏”,那样比较美观)。

7、m_strLine是CString的数据类型,nChar是OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)的形参,在VS2010中操作:m_strLine+=(char)nChar。

8、出现Debug Assertion Failed情况下的原因:

出现这种情况很可能是使用了野指针,比如某个指针指向一个局部变量,而在该变量作用域外使用该指针引用了该对象;另外也要检查是否越界。
Assertion 是断言,用于假定某个条件肯定会满足,在debug模式下,当该条件不满足时则发生阻塞而弹出该对话框;在release下会忽略断言。

 

 9、在VS2010中,遇到字符要用(_T('')),遇到字符串要用(_T("")),注意单引号与双引号的区别。

10、错误error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPSTR“

int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT1)->GetWindowText(ch2,10);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

 解决方法:右击当前项目,选择属性,在项目默认值下面的“字符集”选项改为“使用多字节字符集”就可以了。这是多种编程语言标准不统一造成的。

11、DDV: Dialog Data Validation ;  DDX: Dialog Data Exchange

12、MFC中动态链接库和静态链接库的区别:动态链接可以减少程序的内存大小,但是可能导致程序移植到其他电脑上而不能使用;静态链接库则可以保留这些,以便可以在其他电脑上使用。

13、UpdateData(true)表示从控件中读取值传到与控件相关联的变量;UpdateData(False)表示将控件相关联的变量的值显示在控件上。

14、由多个radio组建的Group中,要建立于一个radio控件相关联的成员变量,需要将这个radio的属性的“group”由“false”变为“TRUE”;另外在对这个成员变量的初始化的值要为-1,如果要用向的函数来检查用户是否选中多个radio中的一个,-1表示表示用户没有选中多个radio中的一个,而第一个radio值是从0开始,第二个radio值是从1开始,以此类推,直到遇到下一个组才结束。

15、cs.style&=~FWS_ADDTOTITLE; 注意这种写法,表明在FWS_ADDTOTITLE情况下,不能成立,所以要取反,取反再与操作。

16、在文本中插入插入符,函数使用CreateSolidCaret,还需要ShowCaret来显示插入符;通常插入符的大小随着字体的大小而发生变化,GetTextMetrics来获取当前字体的度量信息

 1 int Cmfctest9View::OnCreate(LPCREATESTRUCT lpCreateStruct)
 2 {
 3     if (CView::OnCreate(lpCreateStruct) == -1)
 4         return -1;
 5 
 6     // TODO:  在此添加您专用的创建代码
 7     CClientDC dc(this);
 8     TEXTMETRIC tm;
 9     dc.GetTextMetrics(&tm);
10     CreateSolidCaret(tm.tmAveCharWidth/8.0,tm.tmHeight);    //注意这里的8
11     ShowCaret();
12     return 0;
13 }

17、位图插入符用函数CreateCaret

 1 int Cmfctest9View::OnCreate(LPCREATESTRUCT lpCreateStruct)
 2 {
 3     if (CView::OnCreate(lpCreateStruct) == -1)
 4         return -1;
 5 
 6     // TODO:  在此添加您专用的创建代码
 7     CClientDC dc(this);
 8     TEXTMETRIC tm;
 9     dc.GetTextMetrics(&tm);
10     CBitmap* pbitmap=new CBitmap;
11     pbitmap->LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是已经创建位图的句柄
12     CreateCaret(pbitmap);
13     ShowCaret();
14     return 0;
15 }

18、在OnDraw函数中进行文本输出、画图,显示窗口后,如果改变窗口大小,从而引起窗口的重绘,相关的文本和图形都不会消失,而是引起重绘。

19、路径程概念:GetTextMetrics是获取当前字体信息宽度和高度的度量,GetTextExtent是获取特定字符串在窗口显示的宽度和高度

 1 void Cmfctest9View::OnDraw(CDC* pDC)
 2 {
 3     Cmfctest9Doc* pDoc = GetDocument();
 4     ASSERT_VALID(pDoc);
 5     if (!pDoc)
 6         return;
 7     // TODO: 在此处为本机数据添加绘制代码
 8     CString str="北风之神";
 9     pDC->TextOut(50,50,str);  //在指定的位置上输出字符串
10     CSize sz=pDC->GetTextExtent(str); //获取指定字符串在显示窗口的宽度和高度
11     pDC->BeginPath();       //路径程
12     pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);//显示字符串的外接矩形
13     pDC->EndPath();
14     pDC->SelectClipPath(RGN_DIFF); //可查MSDN
15     for (int i=0;i<150;i+=10)     //画网格线
16     {
17         pDC->MoveTo(0,i);
18         pDC->LineTo(150,i);
19         pDC->MoveTo(i,0);
20         pDC->LineTo(i,150);
21     };
22 }

20、做文字图像处理功能可从:CEditView或CRichEditView派生而来

21、设置定时器SetTimer,下面为定时器消息响应函数

 1 void Cmfctest11View::OnDraw(CDC* pDC)
 2 {
 3     Cmfctest11Doc* pDoc = GetDocument();
 4     ASSERT_VALID(pDoc);
 5     if (!pDoc)
 6         return;
 7     // TODO: 在此处为本机数据添加绘制代码
 8     CClientDC dc(this);
 9     m_str="http://weixin.mybole.com";  //m_str为CView类下CString数据类型的成员变量
10     dc.TextOut(0,200,m_str,strlen(m_str));
11     SetTimer(1,100,NULL);
12 }
13 
14 void Cmfctest11View::OnTimer(UINT_PTR nIDEvent)//nIDEvent代表定时器的标识,通常有用户设定 15 { 16 // TODO: 在此添加消息处理程序代码和/或调用默认值 17 m_width+=2; //2代表2个像素点,m_str为CView类下int数据类型的成员变量 18 CClientDC dc(this); 19 TEXTMETRIC tm; 20 dc.GetTextMetrics(&tm); //获取当前字体的宽度、高度信息 21 CRect rect; 22 rect.left=0; 23 rect.top=200; 24 rect.right=m_width; 25 rect.bottom=200+tm.tmHeight; 26 dc.SetTextColor(RGB(255,0,0)); 27 dc.DrawText(m_str,rect,DT_LEFT);//以左对齐的方式 28 29 rect.top=150; 30 rect.bottom=rect.top+tm.tmHeight; 31 dc.DrawText(m_str,rect,DT_RIGHT);//以右对齐的方式 32 33 CSize sz=dc.GetTextExtent(m_str);//获取字符串宽度、高度信息 34 if (m_width>sz.cx) //当累加的宽度高于字符串宽度,就清0 35 { 36 m_width=0; 37 dc.SetTextColor(RGB(0,255,0)); 38 dc.TextOut(0,200,m_str); 39 } 40 CView::OnTimer(nIDEvent); 41 }

 

posted @ 2014-10-01 14:17  龙泽一狼  阅读(174)  评论(0编辑  收藏  举报