但是如果这样,会导致包括edit框在内的背景透明,之后的文字无法覆盖之前的文字的BUG,因此需要对要使背景
if (nCtlColor == CTLCOLOR_STATIC&& (pWnd->GetDlgCtrlID() == IDC_STATIC || pWnd->GetDlgCtrlID() == IDC_STATIC_CHECK))
可以指定对某些控件,文字背景透明化。
11、在基于FormView的单文档中初始化背景
关键函数:voidOnPaint()
简介:添加该View类的WM_PAINT消息,即可在该函数中进行操作
12、取消FormView滚动条
关键函数:void **View::OnSize(UINT nType, int cx, intcy);
简介:在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值,需要通过对应的宏来进行转化。
注:typedefDWORD 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、动态改变对话框的背景颜色
关键函数:HBRUSHCCColorDialogLearningDlg ::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更新)](https://i-blog.csdnimg.cn/blog_migrate/cc90f4c3d97d8d4c4c97b1743e38ed4b.jpeg)
20
、响应单击静态文本的消息
关键函数:无
简介:需要给静态文本勾选
Notify
选项(通知选项),再响应对应的信息即可。
21
、使用图标按钮
关键函数:
HICON SetIcon(HICON hIcon)
简介:首先要勾选按钮的图标属性选项(勾选了之后,按钮将不再显示字体),再在初始化时调用
SetIcon
方法,如:
m_icon_button.SetIcon(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(BTN_ICON)));
注:如果想拓展当鼠标移到按钮时,显示对应的字体提示,需要添加相对于
DLG
的
CtoolTipCtrl
类的全局变量,然后在
DLG
初始化时调用
Create()
和
AddTool
方法即可,如:
m_tooltip.Create(this);
m_tooltip.AddTool(&this->m_icon_button, "
进入游戏
");
最后重写虚函数
PreTranslateMessage
,并添加:
m_tooltip.RelayEvent(pMsg);
22
、改变应用程序的图标
关键函数:无
简介:直接载入图标,替换
IDR_MAINFRAME
图标……
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加载图片呢?尝试了函数LPTSTRMAKEINTRESOURCE( 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
27
、响应鼠标拖动信息
关键函数:OnMouseMove(UINT nFlags, CPoint point)
简介:首先要响应鼠标的移动信息,然后再利用状态变量nFlags判断是否有鼠标左右键按下,这里取值可以为:
MK_LBUTTON、MK_MBUTTON、MK_RBUTTON、MK_CONTROL、MK_SHIFT。