VC++常考题型

常考题目:
GDI有哪几类绘图工具?
GDI绘图工具1) CPen类 2) CBrush类 3) CBitmap类
有哪几种鼠标消息?
鼠标消息
WM_LBUTTONDOWN 鼠标停留在客户区,同时鼠标左键按下
WM_LBUTTONUP 鼠标左键释放
WM_RBUTTONDOWN 鼠标停留在客户区,邮件按下
WM_RBUTTONUO 右键释放
WM_MBUTTONDOWN 鼠标在客户区,中键按下
WM_MBUTTONUP 中键释放
WM_MOUSEMOVE 鼠标指针在客户区移动
WM_LBUTTONDBLCLK 第二次按下左键
WM_RBUTTONDBLCLK 第二次右键
WM_MBUTTONDBLVLK 第二次中键

有哪几种设备环境类,各有什么用处?
CDC:设备环境类的基类,CDC对象提供处理显示器或打印机等设备.上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员

  1. CPaintDC 适用于在接到WM_ PAINT消息时进行绘图操作输出,不仅可以对客户区进行操作,还可以对非客户区进行操作。
    创建方法CPaintDC dc(this)
    2.CClientDC:客户区设备环境类;用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区。 创建方法CClientDC dc(this); GetDC() ReleaseDC()
  2. CWindowDC:窗口设备环境类;获取整个屏幕区域,包括客户区和非客户区 创建方法CWindowDC dc(this)
  3. CmetaFileDC 通常用于创建Windows图元文件

有哪几种键盘消息?
键盘消息:WM_CHAR、ON_WM_KEYUP和ON_WM_KEYDOWN的消息处理函数

请写出使用CFile::Seek成员函数将文件读写指针从文件起始处往后移动200个字节偏移量的实现代码。
try{
myFile. Seek( 200, CFile::begin );//从文件开始向后移动200字节
}
catch(CFileException *e)
//捕获文件指针移动异常
e->ReportError();
//通过信息框报告异常
e->Delete();
//删除异常
}

写出使用序列化方法将10至100的数字写入文件的代码。
void CMy0702Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO:在此添加存储代码
for(int i=10;i<=100;i++)
ar< }
}

在MFC中、消息分为几类,
三类:标准消息、命令消息、通告消息。
自定义消息中,发出消息函数SendMessage与PostMessage有什么区别?
返回时间不同,返回值不同,一个是同步一个是异步,且发送的过程不同
PostMessage发送局部变量,因为其不会等待处理函数结束,自己就继续往下执行了,可能会导致PostMessage所在的函数运行完毕,局部变量内存被释放,而处理函数接收到的变量地址就成了野指针; SendMessage会等待处理函数执行完毕,自己再往下执行,所以处理函数运行期间接受的地址一直存在,可以安心操作,所以局部变量只能用SendMessage发送,全局变量则两个函数都可以发送。
计时器消息使用涉及到哪些函数?
计时器消息有: Ontimer 函数
建立计时器:
建立计时器
SetTimer(UINT nIDEvent,UINT nElapse,
void(CALLBACK EXPORT* IpfnTimer)() )
SetTimer(1, 1000,NULL);
处理计时消息
使用窗口类的属性窗口,采用添加处理其它窗口消息同样的方法添加WM_ TIMER消息处理函数,添加后的代码如下所示:
void CMainFrame::On Timer(UINT nlDEvent)
// TODO:在此添加消息处理程序代码和或调用默认值
switch(nlDEvent)
{
case1:
}
CFrameWnd::On Timer(nlDEvent);

}

控件通知消息的定义是什么?在程序中怎么使用?(争论)
当控件的状态发生变化时(例如用户利用控件进行输入),控件就会向所属窗口发送通知消息。在MFC中有专门的宏将这些消息与相应的处理函数联系起来,使程序能够及时地对用户的输入进行处理。
控件通知消息:是指这样一种消息 , 一个窗口内的子控件发生了一些事情 ,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本,操作控件的滚动条都会产生通知消息。

在取得某个控件的值之前,为什么必须调用UpdateData函数? 此函数当参数不同时,各有何作用?
1、操作系统会调用这个函数来初始化对话框中的数据,或者检索或者验证对话框中的数据。
UpdateData(true);//用于将屏幕上控件中的数据交换到变量中。
UpdateData(false);//用于将数据在屏幕中对应控件中显示出来。
UpdateData() 是MFC的窗口函数,用来刷新数据的。
第二种回答:UpdateData()参数只有一个,默认为TRUE。
UpdateData(TRUE)
刷新控件的值到对应的变量。(外部输入值交给内部变量)
即:控件的值—>变量。
UpdateData(FALSE)
拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
即:变量值—>控件显示。

在VC中有那两种动态链接库?
Non-MFC DLL非MFC动态库、MFC Regular DLL、MFC Extension DLL

在程序中使用动态链接库的几种方式?
方法一:windows提供了一套函数,用于加载动态链接库中的符号(函数和变量),调用函数去加载。
方法二:让调用者的工程依赖于动态链接库工程。
方法三:直接把动态链接库产生的.lib文件加入到调用者的工程中。
方法四:进入Link设置:Project–>settings–>Link,选择 Categery中的Input,在object/library modules里输入的动态链接库对应的.lib文件名,在Additional library path中输入动态链接库对应的.lib的路径。
方法五:#pragma (lib, “filename.lilb”)

0801实现

void CMy0801Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		POSITION ps=m_List.GetHeadPosition();
		CPoint pt;
		while(ps)
		{
			pt=m_List.GetNext(ps);
			ar<<pt;
		}
		pt=CPoint(-1,-1);
		ar<<pt;

	}
	else
	{
		// TODO: 在此添加加载代码
		POSITION ps=NULL;
		CPoint pt;
		while(ar>>pt,pt!=CPoint(-1,-1))
		{
			m_List.AddTail(pt);
		}
	}
}

树形控件的遍历操作

 插入节点
 HTREEITEM hRoot;     // 树的根节点的句柄   
    HTREEITEM hCataItem; // 可表示任一分类节点的句柄
    hRoot = m_Tree.InsertItem(_T("Root"),0,0);
    for(int i=0; i < 5; i++)
    {
         CString str;
         str.Format(_T("Item%d"),i+1);
         hCataItem = m_Tree.InsertItem(str, 1, 1, hRoot, TVI_LAST);         
    }   

3、

获取选中节点名称
void GetCheckNode( HTREEITEM hRoot )
{
    // 如果不是叶子节点
    if(TRUE == m_Tree.ItemHasChildren(hRoot))
    {
        if(TRUE == m_Tree.GetCheck(hRoot))
        {
            // 插入所有页节点
            InsertAllLeaves(hRoot);
        }
        else
        {
            // 查询所有节点,递归
            HTREEITEM hChild = m_Tree.GetChildItem(hRoot);
            while(NULL != hChild)
            {
                GetCheckNode(hChild);
                hChild = m_Tree.GetNextSiblingItem(hChild);
            }
        }
    }
    else // 是叶子节点
    {
        // 被选中
        if(TRUE == m_tTree.GetCheck(hRoot))
        {
            CString well = m_Tree.GetItemText(hRoot);
        }
    }
}

void InsertAllLeaves( HTREEITEM hRoot )
{
    HTREEITEM hChild = m_Tree.GetChildItem(hRoot);
    while(NULL != hChild)
    {
        if(TRUE == m_Tree.ItemHasChildren(hChild))
        {
            InsertAllLeaves(hChild);
        }
        else
        {
            CString well = m_Tree.GetItemText(hChild);
        }
        hChild = m_Tree.GetNextSiblingItem(hChild);
    }
}

4、根据名称查找节点

HTREEITEM  finditem(HTREEITEM  item, CString strtext)   
{  
    HTREEITEM  hfind;  
    //空树,直接返回NULL
    if(item ==  NULL)  
        return  NULL;  
    //遍历查找
    while(item!=NULL)  
    {  
        //当前节点即所需查找节点
        if(m_Tree.GetItemText(item) == strtext)  
            return   item;  
        //查找当前节点的子节点
        if(m_Tree.ItemHasChildren(item))  
        {  
            item   =   m_Tree.GetChildItem(item); 
            //递归调用查找子节点下节点
            hfind   =   finditem(item,strtext); 
            if(hfind)  
            {  
                return  hfind;  
            }  
            else   //子节点中未发现所需节点,继续查找兄弟节点
            {
                item = m_Tree.GetNextSiblingItem(m_ShowObjectTree.GetParentItem(item));  
            }
        }  
        else{   //若无子节点,继续查找兄弟节点
            item = m_Tree.GetNextSiblingItem(item);  
        }  
    }  
    return item;  

遍历所有节点

void CDlgTree::TravelAll(HTREEITEM ht)
{
	string strTemp;
	CString cstr = m_wndTree.GetItemText(ht);
	strTemp = cstr.GetBuffer(0);
	HTREEITEM hCurItem = m_wndTree.GetChildItem(ht);
	m_vecTreeNode.push_back(strTemp);
	HTREEITEM hNextItem;
	while(hCurItem)
	{
		hNextItem = hCurItem;
		TravelAll(hNextItem);
		hCurItem = m_wndTree.GetNextSiblingItem(hCurItem);
	}

你可能感兴趣的:(知识学习)