MFC界面开发小技巧

1、在单文档工程中更新视图
关键函数:Invalidate(BOOL bErase = TRUE);
简介:用于重新执行OnDraw()。当参数为默认的true时,擦除并重画;当参数为false时,保留原先所绘,并更      新视图。

2、设置文字背景透明
关键函数:SetBkMode(intnBkMode);
简介:主要是向参数中填进两个常量之一【TRANSPARENT(1)  OPAQUE(2)】,推荐透明选项 会比较能融入             界面。

3、解决TextOut()不能打印'\n'的问题
关键函数:TextOut(int x, int y,const CString &str);
          TextOut(int x, int y, LPCTSTR lpRect, intnCount);
          DrawText(const CString&str, LPRECT lpRect, UINT nFormat);
          DrawText(LPCTSTR lpszString, int nCount, LPRECTlpRect, UINT nFormat);
简介:这两个借助DC输出文字的函数都支持CString和constchar*,不同的是利用DrawText()可以输出字符串中
      【typedef LPCSTRLPCTSTR;  typedef CONST CHAR *LPCSTR,*PCSTR;】
      的'\n'效果,而TextOut()输出的是|,无法输出转行的效果。但是DrawText()传入的是一个LPRECT参数,
      【typedef struct tagRECT FAR *LPRECT;】
      需要建立一个CRect类的实例,然后传入地址。第三个参数用于选择对齐模式,常用的有DT_LEFT(0)、        DT_CENTER(1)、DT_RIGHT(2)、DT_BOTTOM(8)等等,当然可以利用 |进行多项组合了……

4、删除Edit框中的文字
关键函数:UINT GetLimitText(); SetSel(DWORD dwSelection, BOOLbNoScoll = FALSE);
            SetSel(int nStartChar, int nEndChar, BOOLbNoScoll = FALSE); Clear();
简介:首先利用SetSel()进行Edit框中文字的选择,最后一个参数作用未知……可以利用GetLimitText()返回控      件的最大允许值作为参数,最后利用Clear()函数删除选中的文字

5、设Edit框为只读
关键函数:SetReadOnly(BOOL bReadOnly = TRUE);
简介:参数为true设置为只读,参数为false设置可读写

6、设置单文档的格式
关键函数:BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs);//在MainFrame中
简介:在该函数中添加 cs.style &= ~(WS_MAXIMIZEBOX |WS_MINIMIZEBOX);可以屏蔽单文档的最大化最小化功       能。 

7、禁用按钮
关键函数:CWindow :: EnableWindow(BOOL bEnable = TRUE);
简介:利用CButton的EnableWindow()函数,将参数设置为false时禁用该按钮,true的时候启用该按钮

8、解决在MFC不能使用<math.h>的函数
关键函数:无
简介:无论是包含<math.h>还是<cmath>+ using namespace std 都显示pow()函数没有定义,这让人很郁闷。       解决方法就是将<math.h>放到#include"stdafx.h"之后就行了。不得不承认包含头文件顺序的重要           性……至于是什么原因,暂时未知。
      原因是:任何放在#include "stdafx.h" 之前的代码都会因为预编译头被忽略。

9、屏蔽对话框的回车信息
关键函数:BOOL PreTranslateMessage(MSG*pMsg) 
简介:重载这个虚函数,在里面添加代码:
      if(pMsg->message == WM_KEYDOWN&& (pMsg->wParam ==VK_RETURN || pMsg->wParam == VK_ESCAPE))
              return true;
      即可屏蔽回车和ESC键。当然你可以添加其他代码,比如调用OnButtonOk()等……

10、将静态文本控件融入图片
关键函数:HBRUSH C**Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINTnCtlColor) 
简介:响应这个消息,在里面添加代码
        if( nCtlColor ==CTLCOLOR_STATIC)      
       
          pDC->SetBkMode(TRANSPARENT);   //设置背景透明
          return   HBRUSH(GetStockObject(HOLLOW_BRUSH));   
     

但是如果这样,会导致包括edit框在内的背景透明,之后的文字无法覆盖之前的文字的BUG,因此需要对要使背景

if (nCtlColor == CTLCOLOR_STATIC&& (pWnd->GetDlgCtrlID() == IDC_STATIC || pWnd->GetDlgCtrlID() == IDC_STATIC_CHECK))

   pDC->SetBkMode(TRANSPARENT);  //设置背景透明

             return  HBRUSH(GetStockObject(HOLLOW_BRUSH));  

      

可以指定对某些控件,文字背景透明化。


11、在基于FormView的单文档中初始化背景

关键函数:voidOnPaint() 

简介:添加该View类的WM_PAINT消息,即可在该函数中进行操作


12、取消FormView滚动条

关键函数:void **View::OnSize(UINT nType, int cx, intcy);

        ShowScrollBar(SB_BOTH, FALSE);

简介:在View类中响应WM_SIZE消息,添加语句ShowScrollBar(SB_BOTH,FALSE)即可。


13、动态绘图

关键函数:BOOL BitBlt( int x,int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc,DWORD dwRop );

简介:除了静态利用Pictrue控件,异或是利用画刷将图片画上去(但是除了对整个背景的绘画外,画小的图片需要利用此方法)。先附上MSDN给的利用范例:

   CBitmap bmp;
   if (bmp.LoadBitmap(IDB_BITMAP1))
   {
      // Get the size of the bitmap
      BITMAP bmpInfo;
      bmp.GetBitmap(&bmpInfo);
 
      // Create an in-memory DC compatible with the
      // display DC we're using to paint
      CDC dcMemory;
      dcMemory.CreateCompatibleDC(pDC);
 
      // Select the bitmap into the in-memory DC
      CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
 
      // Find a centerpoint for the bitmap in the client area
      CRect rect;
      GetClientRect(&rect);
      int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
      int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
 
      // Copy the bits from the in-memory DC into the on-
      // screen DC to actually do the painting. Use the centerpoint
      // we computed for the target offset.
      pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 
         0, 0, SRCCOPY);
 
      dcMemory.SelectObject(pOldBitmap);
   }
   else
      TRACE0("ERROR: Where's IDB_BITMAP1?\n");
}
关于参数使用说明:前4个划定一个矩形区域,第五个参数传进一个指向CDC的指针,第6个、第7个设为0,第8个表示源图片和目的图片的关联,一般填SRCCOPY

14、进行对话框初始化操作
关键函数:OnInitDialog()
简介:不能响应WM_CREATE消息,不然DoModal()的时候会异常,需要在OnInitDialog()函数中进行处理。
 
15、关闭整个FormView程序
关键函数:AfxGetMainWnd(),DestroyWindow();
简介:直接调用全局函数AfxGetMainWnd()获得窗体指针,然后直接调用DestroyWindow(),即可直接退出程序。
 
16、COLORREF转对应的R、B、G值
关键函数:下面3个宏,可以从COLORREF当中提取单独的颜色 ,GetBValue ()、GetGValue ()、GetRValue()
简介:如果需要单独显示颜色对应的RGB值,针对大多数函数返回的COLORREF值,需要通过对应的宏来进行转化。
注:typedef  DWORD  COLORREF;     typedef   unsigned long  DWORD;
    如果RGB转COLORREF,只需要调用函数:
    COLORREF RGB(  BYTE byRed,    // red component of color
                                    BYTE byGreen,  // green component of color
                                    BYTE byBlue    // blue component of color);
 
17、动态改变对话框的背景颜色
关键函数:HBRUSH  CCColorDialogLearningDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
简介:如果需要动态改变某个对话框的背景颜色,需要对对话框响应WM_CTLCOLOR消息,在OnCtlColor()函数中添加以下自定义代码:
        if (nCtlColor == CTLCOLOR_DLG)
        {
               CBrush m_brush(m_bk_color);
               CRect m_rect;
 
               GetClientRect(&m_rect);
        //     m_brush.CreateSolidBrush(m_bk_color);
               pDC->SelectObject(&m_brush);
               pDC->FillRect(&m_rect, &m_brush);
                               
               return m_brush;
        }
        当然,在动态改变对话框颜色处,加入Invalidate()才能发送WM_CTLCOLOR消息,进行对应消息响应。
注:这种方法怎么让我想起了单文档里面的OnDraw()或者是OnPaint()函数……期待进一步加深对OnCtlColor()的认识~
 
18、制作个性化屏保
关键函数:无
简介:需要将Dlg程序设置成没有边框,然后自定义响应鼠标信息。做成之后,输出成.scr格式的文件,放到C\windows\system32中,便可以在屏保选项中加载自定义屏保。
 
19、设置静态文本中的字体
关键函数:SetFont(CFont *pFont, BOOL bRedraw = TRUE);
简介:利用CStatic的控件方法,可以设置字体。但是传进去的CFont变量一定要有相对于DLG的全局属性(可以设置成其成员变量)。
MFC界面开发小技巧(2012-10-16更新)
 
20、响应单击静态文本的消息
关键函数:无
简介:需要给静态文本勾选Notify选项(通知选项),再响应对应的信息即可。
 
21、使用图标按钮
关键函数:HICON SetIcon(HICON hIcon)
简介:首先要勾选按钮的图标属性选项(勾选了之后,按钮将不再显示字体),再在初始化时调用SetIcon方法,如:m_icon_button.SetIcon(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(BTN_ICON)));
注:如果想拓展当鼠标移到按钮时,显示对应的字体提示,需要添加相对于DLGCtoolTipCtrl类的全局变量,然后在DLG初始化时调用Create()AddTool方法即可,如:
m_tooltip.Create(this); 
m_tooltip.AddTool(&this->m_icon_button, "进入游戏");
最后重写虚函数PreTranslateMessage,并添加:m_tooltip.RelayEvent(pMsg);MFC界面开发小技巧(2012-10-16更新)
 
22、改变应用程序的图标
关键函数:无
简介:直接载入图标,替换IDR_MAINFRAME图标……MFC界面开发小技巧(2012-10-16更新)

23、利用picture控件动态加载位图
关键函数:HBITMAP SetBitmap(HBITMAP hBitmap)【picture控件的方法】;
LoadBitmap HINSTANCE hinst,   // handle to instance
              LPCTSTR lpszName,  // name or identifier of the image
              UINT uType,        // image type  
            int cxDesired,     // desired width
              int cyDesired,     // desired height  
            UINT fuLoad        // load options);
简介:将picture控件的类型设置成位图,然后调用控件的SetBitmap方法,而需要的HBITMAP则可以利用函数LoadBitmap生成,第一个参数填NULL,第二个是文件路径,第三个填参数IMAGE_BITMAP,第四个和第五个可以用CRect进行获取,以填充整个picture控件,最后一个填LR_LOADFROMFILE。
注:只掌握了加载文件,可是怎么根据图片ID加载图片呢?尝试了函数LPTSTR  MAKEINTRESOURCE( WORD wInteger),但是好像没用……
 
24、列表框点击的实时响应
关键函数:int GetCurSel(); void OnSelchangeList***()
简介:响应LBN_SELCHANGE消息(此消息只要你点击到某一条信息就会发出),然后再在响应函数里面利用ClistBox的GetCurSel()获得当前选中的下标,利用GetText(int, CString&)等函数可以取得选中的信息。
 
25、填充一块区域
关键函数:FillRect(CRect*, CBrush*);GetClientRect(&rect);CDC* GetDC();
简介:对picture控件、静态文本控件可以先得到他们的DC和Rect,然后选定固定画刷进行动态填充。比较好玩的是,如果你给CButton添加一个CStatic型变量的话,可以对按钮进行重画,但是不能再给它添加CButton类型变量。PS.这里的的CBrush当然可以传入一个图片画刷,可以在某个条件下用一张图片填充这个按钮,而且也可以响应它的单击消息哦~试试吧,很好玩~
 
26、重写CComboBox类的DrawItem()方法时不响应
关键函数:无
简介:自己派生的CColorComboBox重写DrawItem虚方法时,控件并没有进行调用。此时需要关注控件的属性设置:  需要设置Owner Draw属性:这个属性有三个选项:No(不采用任何自绘),Fixed(固定属性的列表高度和宽度),Variable(改变列表的高度和宽度).最直白的理解分别是:不响应DrawItem()、响应DrawItem(不响应MeasureItem)、响应MeasureItem(也响应DrawItem)。也就是说,需要将三个风格严格对应起来。还要勾上Has Strings,才能使结果正确。
引用自:http://blog.csdn.net/wghhdzwzqbx02/article/details/7277937
MFC界面开发小技巧(2012-10-16更新)
 
27、响应鼠标拖动信息
关键函数:OnMouseMove(UINT nFlags, CPoint point)
简介:首先要响应鼠标的移动信息,然后再利用状态变量nFlags判断是否有鼠标左右键按下,这里取值可以为:MK_LBUTTON、MK_MBUTTON、MK_RBUTTON、MK_CONTROL、MK_SHIFT
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值