一.VC技巧
■Debug
●VC设置条件断点:
设置一个普通断点后,Ctrl+B,会弹出当前“断点”对话框。在下部会看到当前设置的所有断点,然后选择要设置条件的断点,点击“Condition”,来设置具体的“条件”即可。
■编译错误
●fatal error C1010: unexpected end of file while looking for precompiled header directive
原因是发生错误的文件没有于编译头。比如将全局函数统一封装在一个cpp中,或其他C代码文件添加进入当前工程。
解决方法:
在文件开头添加: #include "stdafx.h"
或者取消使用预编译头(不推荐方法):
进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。
对预编译头文件说明如下:
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。
二.MFC技巧总结
有时要写个测试程序,用MFC比较方便:
■VC控件ID前缀
在给控件命名ID的时候遇到了诸如IDC,IDD,IDR,IDM,IDS等ID前缀:
IDC_:控件的ID命名前缀(Control)
IDM_:菜单的ID命名前缀(Menu)
IDD_:对话框的ID命名前缀(Dialog)
IDR_:资源的ID命名前缀(Resource)
IDS_:字符串的ID命名前缀(String)
IDB_:位图资源的ID命名前缀(Bitmap)
■ToolBar工具栏
在创建了工具栏之后,需添加对应工具栏按钮的消息(如ON_BN_CLICKED)。否则,工具栏上的按钮将为变灰状态!
VC工具栏技巧:
在资源编辑框中,打开Toolbar资源,就出现了工具条编辑界面。默认的最右边那个灰按钮就是用来添加新按钮的,双击它便会新建按钮(设置ButtonID,宽度,高度等)。
按钮的消息响应函数一般没规定写在哪个文件里,具体看在哪对整个工程实现时比较方便或者看起来比较规范,就写在哪个文件。比如某个按钮要对窗口内容进行处理,放在view.cpp里看起来比较规范一点。
Tab控件顺序:
在对话框上,Ctrl+D,会显示当前控件Tab顺序。点击控件设置第一个Tab顺序,之后依次类推。再按Ctrl+D保存!
获取控件句柄:
GetDlgItem(ID)
获取控件位置:
CRect r;
CListCtrl m_list;
m_list.GetWindowRect(&r);
GetDlgItem(IDC_STATIC1)->GetWindowRect(&r);
设置控件位置:
CListCtrl m_list;
m_list.GetWindowRect()取得CRect大小!
m_list.SetWindowPos(); / m_list.MoveWindow();
GetDlgItem(ID)->SetWindowPos() / GetDlgItem(ID)->MoveWindow()
控件的显示与隐藏:
CButton m_btnTest;
m_btnTest.ShowWindow(SW_HIDE); //SW_SHOWNORMAL
GetDlgItem(ID)->ShowWindow(SW_HIDE)
窗口中的定位
CRect rtDlg;
AfxGetMainWnd()-> GetWindowRect(&rtDlg);
坐标转换:
ClientToScreen()
ScreenToClient()
设置“弹出对话框”图标:
先将插入的对话框的Border属性改成“Thin”或"Resizing",并确保选中了"System menu"属性:
(1)在插入的对话框类中,定义个图标成员: HICON m_hIcon;
(2)在插入的对话框类的构造函数中,初始化图标成员: m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
(3)在插入的对话框类的OnInitDialog中, 设置图标:
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
DONE。
MFC 静态文本的透明显示
MFC 静态文本的透明显示,即静态文本框的背景色是透明的:
处理消息WM_CTLCOLOR:ON_WM_CTLCOLOR()
消息响应函数OnCtlColor:afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
在OnCtlColor里添加:
if( nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
return HBRUSH( GetStockObject(HOLLOW_BRUSH) );
}
设置对话框背景色
在OnPaint()中设置:
if(IsIconic())
{ ...}
else
{
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(226,242,255));
CDialog::OnPaint();
}
修改菜单栏背景色
使用SetMenuInfo:
类中声明:
CMenu m_TopMenu;
CBrush m_brush;
在OnInitDialog()中:
//插入菜单
m_TopMenu.LoadMenu(IDR_TOPMENU);//
SetMenu(&m_TopMenu);
//设置菜单背景颜色
::MENUINFO lpcmi;
m_brush.CreateSolidBrush(RGB(230,230,230));
memset(&lpcmi,0,sizeof(::LPCMENUINFO));
lpcmi.cbSize=sizeof(MENUINFO);
lpcmi.fMask= MIM_BACKGROUND;
lpcmi.hbrBack=(HBRUSH)m_brush.operator HBRUSH();
m_TopMenu.SetMenuInfo(&lpcmi);
修改Dialog状态栏颜色
类中添加:
CStatusBarCtrl m_StatusBar;
在OnInitDialog()中:
//插入对话框状态栏------------------------
m_StatusBar.Create(WS_CHILD|WS_VISIBLE |SBT_OWNERDRAW, CRect(0,0,0,0), this, 0);
int strPartDim[2]= {130, -1}; //分割数量
m_StatusBar.SetParts(2, strPartDim);
m_StatusBar.SetText("状态栏1",0,0);
m_StatusBar.SetBkColor(RGB(230,230,230)); //粉色255,160,220
VC小技巧收集 : http://blog.csdn.net/syf442/archive/2010/08/12/5807068.aspx