常考题目:
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对象提供处理显示器或打印机等设备.上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员
有哪几种键盘消息?
键盘消息: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);
}