前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >VC++6.0入门——案例 电话本的案例

VC++6.0入门——案例 电话本的案例

原创
作者头像
Arya
发布2024-11-22 20:44:41
发布2024-11-22 20:44:41
610
举报
文章被收录于专栏:后端开发专栏后端开发专栏

在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!

题目:Text to image论文精读Adma-GAN:用于文本到图像生成的属性驱动内存增强型GAN Attribute-Driven Memory Augment

好事文章地址:https://cloud.tencent.com/developer/article/2467598

作为一项具有挑战性的任务,文本到图像生成旨在根据给定的文本描述生成照片级真实感和语义一致的图像。现有的方法主要是从一个句子中提取文本信息来表示图像,文本表示对生成图像的质量影响很大。然而,在一句话中直接利用有限的信息会遗漏一些关键的属性描述,而这些属性描述是准确描述图像的关键因素。为了缓解上述问题,我们提出了一种有效的带有属性信息补充的文本表示方法。

引出


VC++6.0入门——案例 电话本的案例

电话本案例

接下来,我们要利用Mnu2程序实现这样的一个功能:在应用程序的窗口中,输入一行文字,这行文字的格式是:人名电话号码。在这行文字输入完成之后按下回车键,就会在程序的菜单栏上的【帮助】菜单之后动态生成一个子菜单,并且刚才输入的人名将作为其中的一个菜单项来显示。然后可以继续上述过程,接着在程序窗口中输入下一行文字,但这时按下回车键后,并不需要再新添一个子菜单,而是直接在已添加的子菜单下添加菜单项,这个新菜单项的文本就是新输入的人名。当单击这个动态生成的子菜单中的某个菜单项时,程序就会把相应的人名和电话号码显示在程序窗口上。

处理首次回车,增加菜单

当第一次按下回车键时,首先创建一个弹出菜单,然后把这个菜单项目添加到程序的菜单栏上。这段代码中有一个问题需要注意:之前,我们都是在 CMainFrame类中调用GetMenu函数来获取程序的菜单栏指针,而视类窗口是没有菜单的,因此在视类中直接调用GetMenu函数是无法获得程序的菜单栏对象的。如果要在视类中获得属于框架类的菜单栏对象的话,首先需要利用GetParent函数获得视类的父窗口,即框架类窗口对象,然后再调用框架类窗口对象的GetMenu函数就可以获得程序的菜单栏对象的指针了。

开始没出现,鼠标滑动后才出来

因为CMainFrame类的OnCreate函数的作用是实现窗口的创建,也就是说,在调用这个函数时,程序的窗口还未创建和显示,所以在这个函数中对窗口上菜单所作的修改会立即在程序界面上呈现出来。但在窗口创建并显示完成之后,再去修改程序菜单的内容时,需要对菜单栏进行一次重绘操作才能显现修改的结果。CWd类提供了一个DrawMenuBar成员函数用来完成菜单栏的重绘操作。我们可以在上述例6-32所示代码中,在添加菜单项目之后,使菜单栏进行一次重绘操作。

处理其他字符输入

如果当前用户输入的不是回车键的话,就应该在程序窗口中显示当前输入的字符。为了显示输入的字符,可以按照第五章中介绍的技巧来实现,即把输入的字符都保存到一个字符串中,然后在窗口中显示这个字符串就可以了。这样,我们就需要为视类添加一个 CString类型的成员变量,用来保存输入的字符。本例中定义的字符串成员变量为: m_strLine.

再次测试Mu2程序,将会发现又出现一个问题:再次输入的文字是在上次输入的文字之上显示的,我们希望将上次显示的内容清除掉,再显示当前输入的文字。有多种方法可以实现窗口上文字的擦除,这里,我们利用窗口重绘这种方法来实现。CWd类有一个名为Invalidate的成员函数,该函数的作用是让窗口的整个客户区无效,这样,当下一条 WM PAINT消息发生时,窗口就会被更新。这个函数的声明如下所示:

这个函数有一个BOOL类型的参数,如果该参数的值是TRUE,窗口重绘时就会把窗口的背景擦除掉;否则,保留窗口的背景。该参数的默认值是TUE。

处理空格分割的姓名和电话

接下来,需要实现在输入人名、空格、电话号码,并当按下回车键后,把输入的人名作为菜单项的文本添加到PhoneBook子菜单下这一功能。因为我们把当前输入的内容全部保存到m strLine这个变量中,并且人名和电话号码之间是以空格分隔的,所以,首先需要从m_strLine变量中分离出人名字符串。

CString类提供了一个Find成员函数,这个函数在字符串中可以查找一个字符,或者一个字符串,返回匹配结果的第一个字符在该字符串中的位置索引。例如利用Find函数在字符串“Hello”中查找字符:“1”,将得到“Hello”这个字符串中第一个“1”字符出现的位置索引:2。这里需要提醒读者的是:在C/C+语言中,字符串的索引是从0开始计数的。

因此,这里我们可以在m_strLine中查找空格字符,得到它的位置索引,然后利用前面我们已经介绍的CString类的另一个成员函数:Left把人名字符串截取出来,并将该字符串作为菜单项名称添加到PhoneBook子菜单下。

下面,我们就先为CMenu2View类定义一个公有的(public类型)CStringArray类型的成员变量:m_strArray,用来保存所有输入的字符串。至于为什么将m_strArray声明为公有的,在后面会讲述。然后在OnChar函数中,在按下回车键后,并在m strLine变量清空之前,把当前输入的一行文字增加到这个集合类变量中,即在CMenu2View类的OnChar函数中添加下述加灰显示的代码。

代码语言:java
复制
void CTelBookView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	// 捕获键盘消息
	// 首次输入,需要加入菜单,后面输入加入菜单项即可

	CClientDC dc(this);

	if(0x0d==nChar)
	{
		if(0==++m_nIndex) // 先自加后比较
		{
			m_menu.CreatePopupMenu();
			// 添加到菜单栏,view类获取框架类菜单指针:
			GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu,"PhoneBook");
			// 菜单栏重绘
			GetParent()->DrawMenuBar();
		}
		// 增加菜单项
		m_menu.AppendMenu(MF_STRING,IDM_PHONE1 + m_nIndex ,m_str.Left(m_str.Find(' ')));

		m_strArray.Add(m_str);
		// 清除字符
		m_str.Empty();
		Invalidate();
	
	}else
	{	
		// 输出字符
		m_str+=nChar;
		dc.TextOut(0,0,m_str);
	}

	CView::OnChar(nChar, nRepCnt, nFlags);
}

void CTelBookView::OnPhone1() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	dc.TextOut(0,0,m_strArray.GetAt(0));
	
}

让框架类进行响应

增加虚函数

报错解决:源文件单独编译,要包含头文件

代码语言:java
复制
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	int MenuCmdId = LOWORD(wParam);

	// 如果是自己定义的IDM_PHONE1 ~ 之间
	CTelBookView *view = (CTelBookView*) GetActiveView();  
	if(MenuCmdId >= IDM_PHONE1 && MenuCmdId<IDM_PHONE1 + view->m_strArray.GetSize())
	{
		// MessageBox("Test");
		CClientDC dc(view);
		dc.TextOut(0,0,view->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));

		return TRUE;
	}

	return CFrameWnd::OnCommand(wParam, lParam);
}

总结

VC++6.0入门——案例 电话本的案例

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 电话本案例
    • 处理首次回车,增加菜单
    • 处理其他字符输入
    • 处理空格分割的姓名和电话
    • 让框架类进行响应
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档