MFC--小知识总结二



 

1 UpdateData 不能及时更新控件内容

 

原因: 

UpdateData是通过数据交换实现改变控件显示的,改变了之后必须要调用一次OnPaint才能实现刷新。

因此,若是在一个函数里反复多次调用有时是没有效果的。

若想及时更新控件内容,在调用UpdateData后,需要再调用下UpdateWindow() 来刷新窗口。

 

[cpp]  view plain copy
  1. UpdateData(FALSE);  
  2. UpdateWindow();  

 

2 Invalidate、Invalidate(FALSE)、Invalidate(TRUE) 关系

 

1)

[cpp]  view plain copy
  1. void Invalidate(  
  2.    BOOL bErase = TRUE   
  3. );  


bErase

Specifies whether the background within the update region is to be erased.

  Invalidate() 相当于 Invalidate(TRUE)

  TRUE代表更新时察除背景色

  FALSE表示更新时不察除背景,在原有背景上继续画图

 

2)

         UpdateWindow();     表示立即更新

         但是必须先设置需要更新的无效区域才有效果, 否则不会发生变化。

       

         下例显示的效果为: 直接在原图背景上 绘制新图,  因此会有重复现象  

[cpp]  view plain copy
  1. Invalidate(FALSE);  
  2. UpdateWindow();  


        下例显示的效果为: 先将原图清理掉,然后再画新图, 因此不会有重复现象,但可能会发生闪烁 

         其效果等同于RedrawWindow()

[cpp]  view plain copy
  1. Invalidate();  
  2. UpdateWindow();  

 

[cpp]  view plain copy
  1. RedrawWindow();  

 

 

3  使用空刷子画图和不使用空刷子画图的区别

 

[cpp]  view plain copy
  1. CBrush * pBrush=CBrush::FromHandle((HBRUSH(GetStockObject(NULL_BRUSH))));  
  2.   
  3. CBrush* pOldBrush=pDC->SelectObject(pBrush);  
  4.   
  5. Draw(); //使用空刷子画图  
  6.   
  7. pDC->SelectObject(pOldBrush);  


考虑这样一种情况: 

先画一个小矩形, 然后再画一个大矩形,使得大矩形包含小矩形

 

[cpp]  view plain copy
  1. CRect rc1(0,0,100,100);  
  2.    
  3. CRect rc2(0,0,200,200);  
  4.   
  5.   
  6. pDC->Rectangle(&rc1);  
  7. pDC->Rectangle(&rc2);    


1)  不使用空刷子时, 则最终结果只能看见大矩形

2) 使用空刷子时,      则大小矩形都可看见

 

原因分析:

       不使用空刷子,系统默认的白色刷子,  这样画图时,  先使得画图区域失效,然后用刷子刷一下画图区域,最后再往这块区域中画图。

       因此,当画大矩形时, 先用刷子刷这块区域,这样就将小矩形给冲刷掉了。

       而, 使用空刷子时, 因为刷子是空的, 所以画大矩形时, 便不再用刷子刷这块区域, 而是直接在这块区域上画图,因此,原先的小矩形还保留着,没有受到影响。

 

4 画矩形框架(只画外围框架,不覆盖内部内容)


[cpp]  view plain copy
  1. CBrush brush(RGB(255,0,0));  
  2. CRect rect(0,0,100,100);  
  3. pDC->FrameRect(&rect,&brush);  


5  ON_COMMAND与ON_UPDATE_COMMAND_UI 区别

   ON_COMMAND是点了按钮或菜单项后的响应消息,

   ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息.   消息函数对按钮的状态进行控制, 如将按钮设置为无效(灰色显示)

   如:控制按钮IDM_DRAW_TABLE 是否有效

 

[cpp]  view plain copy
  1. afx_msg void OnUpdateDrawTable(CCmdUI *pCmdUI);  
[cpp]  view plain copy
  1. ON_UPDATE_COMMAND_UI(IDM_DRAW_TABLE, OnUpdateDrawTable)  

 

[cpp]  view plain copy
  1. void CImageView::OnUpdateDrawTable(CCmdUI *pCmdUI)  
  2. {  
  3.     if(m_TableStep==2)  pCmdUI->Enable(TRUE);  //按钮有效  
  4.     else                pCmdUI->Enable(FALSE);  //按钮无效  
  5. }  


 

[cpp]  view plain copy
  1. void CImportView::OnUpdateFormatBrush(CCmdUI *pCmdUI)  
  2. {  
  3.   
  4.   
  5.   if (bFormat)  
  6.   {  
  7.       pCmdUI->Enable(TRUE);  
  8.       pCmdUI->SetRadio(TRUE); //显示凹陷状态  
  9.       return;  
  10.   }else  
  11.           pCmdUI->SetRadio(FALSE); //显示正常状态  
  12. }  

6  画工具栏按钮

  【视图】-->【工具栏】--->【图像编辑器】 调出图像编辑器工具栏。

   选取工具栏中提供的工具, 其中包含 A  (文本工具---可以直接往工具栏按钮写字)

   选择颜色时,没有  填充工具 或 颜色选择工具时  没有调出系统颜色窗口 , 此时 需通过 【图像】-->【显示颜色窗口】来显示不同的颜色

 

  当往一个按钮上写2个字时,  点中工具栏上的A后,需要划出一个字的范围, 写入改字后,再调整范围,然后划出另一个字的范围,再画另一个字, 最后调节两字。

  可以使用放大镜将其放大到最大程度书写

  

 

1 UpdateData 不能及时更新控件内容

 

原因: 

UpdateData是通过数据交换实现改变控件显示的,改变了之后必须要调用一次OnPaint才能实现刷新。

因此,若是在一个函数里反复多次调用有时是没有效果的。

若想及时更新控件内容,在调用UpdateData后,需要再调用下UpdateWindow() 来刷新窗口。

 

[cpp]  view plain copy
  1. UpdateData(FALSE);  
  2. UpdateWindow();  

 

2 Invalidate、Invalidate(FALSE)、Invalidate(TRUE) 关系

 

1)

[cpp]  view plain copy
  1. void Invalidate(  
  2.    BOOL bErase = TRUE   
  3. );  


bErase

Specifies whether the background within the update region is to be erased.

  Invalidate() 相当于 Invalidate(TRUE)

  TRUE代表更新时察除背景色

  FALSE表示更新时不察除背景,在原有背景上继续画图

 

2)

         UpdateWindow();     表示立即更新

         但是必须先设置需要更新的无效区域才有效果, 否则不会发生变化。

       

         下例显示的效果为: 直接在原图背景上 绘制新图,  因此会有重复现象  

[cpp]  view plain copy
  1. Invalidate(FALSE);  
  2. UpdateWindow();  


        下例显示的效果为: 先将原图清理掉,然后再画新图, 因此不会有重复现象,但可能会发生闪烁 

         其效果等同于RedrawWindow()

[cpp]  view plain copy
  1. Invalidate();  
  2. UpdateWindow();  

 

[cpp]  view plain copy
  1. RedrawWindow();  

 

 

3  使用空刷子画图和不使用空刷子画图的区别

 

[cpp]  view plain copy
  1. CBrush * pBrush=CBrush::FromHandle((HBRUSH(GetStockObject(NULL_BRUSH))));  
  2.   
  3. CBrush* pOldBrush=pDC->SelectObject(pBrush);  
  4.   
  5. Draw(); //使用空刷子画图  
  6.   
  7. pDC->SelectObject(pOldBrush);  


考虑这样一种情况: 

先画一个小矩形, 然后再画一个大矩形,使得大矩形包含小矩形

 

[cpp]  view plain copy
  1. CRect rc1(0,0,100,100);  
  2.    
  3. CRect rc2(0,0,200,200);  
  4.   
  5.   
  6. pDC->Rectangle(&rc1);  
  7. pDC->Rectangle(&rc2);    


1)  不使用空刷子时, 则最终结果只能看见大矩形

2) 使用空刷子时,      则大小矩形都可看见

 

原因分析:

       不使用空刷子,系统默认的白色刷子,  这样画图时,  先使得画图区域失效,然后用刷子刷一下画图区域,最后再往这块区域中画图。

       因此,当画大矩形时, 先用刷子刷这块区域,这样就将小矩形给冲刷掉了。

       而, 使用空刷子时, 因为刷子是空的, 所以画大矩形时, 便不再用刷子刷这块区域, 而是直接在这块区域上画图,因此,原先的小矩形还保留着,没有受到影响。

 

4 画矩形框架(只画外围框架,不覆盖内部内容)


[cpp]  view plain copy
  1. CBrush brush(RGB(255,0,0));  
  2. CRect rect(0,0,100,100);  
  3. pDC->FrameRect(&rect,&brush);  


5  ON_COMMAND与ON_UPDATE_COMMAND_UI 区别

   ON_COMMAND是点了按钮或菜单项后的响应消息,

   ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息.   消息函数对按钮的状态进行控制, 如将按钮设置为无效(灰色显示)

   如:控制按钮IDM_DRAW_TABLE 是否有效

 

[cpp]  view plain copy
  1. afx_msg void OnUpdateDrawTable(CCmdUI *pCmdUI);  
[cpp]  view plain copy
  1. ON_UPDATE_COMMAND_UI(IDM_DRAW_TABLE, OnUpdateDrawTable)  

 

[cpp]  view plain copy
  1. void CImageView::OnUpdateDrawTable(CCmdUI *pCmdUI)  
  2. {  
  3.     if(m_TableStep==2)  pCmdUI->Enable(TRUE);  //按钮有效  
  4.     else                pCmdUI->Enable(FALSE);  //按钮无效  
  5. }  


 

[cpp]  view plain copy
  1. void CImportView::OnUpdateFormatBrush(CCmdUI *pCmdUI)  
  2. {  
  3.   
  4.   
  5.   if (bFormat)  
  6.   {  
  7.       pCmdUI->Enable(TRUE);  
  8.       pCmdUI->SetRadio(TRUE); //显示凹陷状态  
  9.       return;  
  10.   }else  
  11.           pCmdUI->SetRadio(FALSE); //显示正常状态  
  12. }  

6  画工具栏按钮

  【视图】-->【工具栏】--->【图像编辑器】 调出图像编辑器工具栏。

   选取工具栏中提供的工具, 其中包含 A  (文本工具---可以直接往工具栏按钮写字)

   选择颜色时,没有  填充工具 或 颜色选择工具时  没有调出系统颜色窗口 , 此时 需通过 【图像】-->【显示颜色窗口】来显示不同的颜色

 

  当往一个按钮上写2个字时,  点中工具栏上的A后,需要划出一个字的范围, 写入改字后,再调整范围,然后划出另一个字的范围,再画另一个字, 最后调节两字。

  可以使用放大镜将其放大到最大程度书写

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值