MFC & C++ 笔记
获取控件及控件使能:
CButton *pButton=(CButton*)GetDlgItem(IDC_STOP);
pButton->EnableWindow(FALSE);
=================================================
文件拖拽功能:
→→→→→→→点这里
=================================================
文件读取:
CFile mFile(_T(FileName),CFile::modeRead);
mFile.Read(Buffer,BufferLength);
CFile::SeekToBegin();//文件指针回到头
mFile.Close();
CFile mFile(_T(FileName),CFile::modeWrite|CFile::modeCreate);
mFile.Write(Buffer,BufferLength);
mFile.Flush();
如果要实现每次读取文件的一行,要用CStdioFile,这个类继承于CFile
CStdioFile::ReadString(CString)
=================================================
MFC中使用OPENCV显示图片API:
void CFBGDlg::DrawPicToHDC(IplImage *image, UINT ID) { CDC *pDC = GetDlgItem(ID)->GetDC(); HDC hDC= pDC->GetSafeHdc(); CRect rect; GetDlgItem(ID)->GetClientRect(&rect); CvvImage cimg; //只有CvvImage类的图像才有下面的DrawToHDC函数 cimg.CopyOf(image,3); cimg.DrawToHDC(hDC,&rect); ReleaseDC(pDC); }
=================================================
添加控件变量时弹出对话框“未能返回新代码元素。可能是语法错误。xxx”解决方法:
关闭整个VS,然后把工程目录里面的所有文件的只读属性去掉即可。
=================================================
打开文件的对话框:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszFilter 指定文件拓展名。
范例如下:
CFileDialog pCFileDialog(TRUE,NULL,NULL,0,”文本文件(*.CSV)|*.CSV||”);
pCFileDialog.m_ofn.lpstrTitle = “打开目标曲线文件 “;
if(pCFileDialog.DoModal() != IDOK) return;
之后可用下列函数获取文件相关信息:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
=================================================
double转CString
double atof(CString);
=================================================
改变控件文字:
GetDlgItem(id)->SetWindowText()
=================================================
HWND→CWnd*:
CWnd* = CWnd::FromHandle (HWND);
=================================================
获取屏幕分辨率:
int GetSystemMetrics(SM_CXSCREEN)
int GetSystemMetrics(SM_CYSCREEN)
=================================================
移动鼠标:
如果使用mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0)的话,不知为什么移动会被非线性放大,如果要精确移动像素值dx,dy,要使用:
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE ,dx*65536/1280,dy*65536/800,0,0);
1280×800是屏幕分辨率
最简单还是SetCursorPos(500,500);这个是绝对坐标
PS:GetCursorPos(&CurPoint);
=================================================
获取指定窗口句柄:
::FindWindow( NULL,OBJECT_WINDOW_NAME)
=================================================
获取最前端窗口句柄:
GetForegroundWindow()
PS:SetForegroundWindow(HWND)设置为最前端窗口
=================================================
鼠标操作:
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information);
MOUSEEVENTF_MOVE:表明发生移动。
MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOUSEEVENTF_WHEEL:表明鼠标轮被移动。移动的数量由dwData给出。
=================================================
获取窗口位置:
GetWindowRect(::FindWindow( NULL,OBJECT_WINDOW_NAME),&rect);
GetClientRect(::FindWindow( NULL,OBJECT_WINDOW_NAME),&rect);不包括菜单等
=================================================
获取控件的位置:
GetDlgItem(nID)->GetWindowRect(&rect);
GetDlgItem(nID)->GetParent()->ScreenToClient(rect);
=================================================
显示JPG格式的图片:
→戳这里
=================================================
改变控件的大小:
GetDlgItem(IDC_XXX)->MoveWindow(rect);
=================================================
获取DC方法:
CDC* pDC = GetDC();
CPaintDC dc(this);
=================================================
多个控件响应同一个消息响应函数:
- 定义消息响应函数:afx_msg void OnStnClickedTablePic(UINT uID);
- 添加消息映射:ON_CONTROL_RANGE(STN_CLICKED,IDC_MIN,IDC_MAX,OnStnClickedTablePic)
- 添加函数定义:void CXxxxxxDlg::OnStnClickedTablePic(UINT uID){// TODO: 在此添加控件通知处理程序代码}
- 对于Static类控件,响应按钮前要先使能Notify:GetDlgItem(ID)->ModifyStyle(0,SS_NOTIFY);
=================================================
CString转char:
CString::GetBuffer()
=================================================
CPen更换:
CPen pen_line(PS_SOLID,1,RGB(255,255,0));//画线颜色
CPen* oldpen = memDC.SelectObject(&pen_line);
/**/
memDC.SelectObject(oldpen);
pen_line.DeleteObject();//必须要
pen_line.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldpen = memDC.SelectObject(&pen_line);
=================================================
写字背景透明:
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(0,0,str);
=================================================
CString指定小数点位数格式化:
str.Format(“%.2f dbm”,ReferenceLevel);
=================================================
CFile向文本输出换行:
/r/n
=================================================
在使用 VS2008 SP1 与 Matlab2009a 混合编程时遇到如下编译错误:
1>—— Build started: Project: testsincplot_dll, Configuration: Debug Win32 ——
1>Compiling…
1>testsincplot_dll.cpp
1>d:/program files/matlab/r2009a/extern/include/mclmcr.h(1722) : error C2011: ‘_INTERFACE_INFO’ : ‘struct’ type redefinition
1> c:/program files/microsoft sdks/windows/v6.0a/include/ws2ipdef.h(84) : see declaration of ‘_INTERFACE_INFO’
原因:
VS2008默认设置系统平台的最低要求是 Vista 系统,如果是 XP 系统,就会出现上述错误。
解决方法:
打开项目文件夹中的 targetver.h 头文件,把其中的 0X0600 修改为 0X0501,即:
#define WINVER 0x0600 ===>> #define WINVER 0x0501
#define _WIN32_WINNT 0x0600 ===>> #define _WIN32_WINNT 0x0501
=================================================
菜单使能:
法一:添加UPADTE_COMMAND_UI事件,然后pCmdUI->Enable(TRUE)或者pCmdUI->Enable(FALSE);
法二:
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
但是要先在CMainFrm::CMainFrm中添加m_bAutoMenuEnable = FALSE;不然无效。不推荐此方法,因为当你工具栏某个按钮和菜单栏使用同一个ID的话,这么做只对菜单栏有变化,而工具栏上的按钮该怎么样还是怎么样。
=================================================
绘制实心扇形API:
//************************************ // Method: DrawPie // FullName: CEle_Power_DecomposeView::DrawPie // Access: public // Returns: void // Qualifier: // Parameter: CDC * pDC // Parameter: CPoint Center // Parameter: int Radius // Parameter: COLORREF color :RGB(0,0,0) // Parameter: double angle_begin:角度 // Parameter: double angle_end:角度 //************************************ void DrawPie( CDC* pDC,CPoint Center,int Radius,COLORREF color,double angle_begin,double angle_end ) { double PI = 3.14159265358979; CRect rect(Center.x-Radius, Center.y-Radius, Center.x+Radius, Center.y+Radius); CPen newpen; newpen.CreatePen(PS_SOLID ,1,color); pDC->SelectObject(newpen); double t = angle_begin/180*PI; double x = sin(t); double y = -1*cos(t); CPoint Start(Radius*x+Center.x,Radius*y+Center.y); t = angle_end/180*PI; x = sin(t); y = -1*cos(t); CPoint End(Radius*x+Center.x,Radius*y+Center.y); pDC->MoveTo(Center); pDC->LineTo(Start); pDC->MoveTo(Center); pDC->LineTo(End); //迫不得已,为了防止断线连接不上 t = (angle_begin-1)/180*PI; x = sin(t); y = -1*cos(t); Start = CPoint(Radius*x+Center.x,Radius*y+Center.y); t = (angle_end+1)/180*PI; x = sin(t); y = -1*cos(t); End = CPoint(Radius*x+Center.x,Radius*y+Center.y); pDC->Arc(rect,End,Start); CBrush NewBrush; NewBrush.CreateSolidBrush(color); pDC->SelectObject(NewBrush); t = (angle_end+angle_begin)/180*PI/2; x = sin(t); y = -1*cos(t); CPoint FillCenterPoint(Center.x + 0.5*Radius*x,Center.y + 0.5*Radius*y); pDC->ExtFloodFill(FillCenterPoint.x,FillCenterPoint.y,color,FLOODFILLBORDER); }
=================================================
获取当前工作路径:(利用打开文件对话框打开文件后当前工作路径是会变化的)
char pFileName[MAX_PATH];
int nPos = GetCurrentDirectory( MAX_PATH, pFileName);
=================================================
透明画刷:
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(anchor.x,anchor.y,drawto.x,drawto.y);
=================================================
在编译时出现:
1>正在编译…
1>PreviewDlg.cpp
1>d:zacprojectvs2008projectsdipalgorithmdipalgorithmview.h(46) : error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>d:zacprojectvs2008projectsdipalgorithmdipalgorithmview.h(46) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:zacprojectvs2008projectsdipalgorithmdipalgorithmview.h(46) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:zacprojectvs2008projectsdipalgorithmdipalgorithmview.h(46) : warning C4183: “GetDocument”: 缺少返回类型;假定为返回“int”的成员函数
从上面可以看出,出错是在编译PreviewDlg.cpp时,错误原因是我在PreviewDlg.cpp中使用了VIEW类,但只包含了XXXView.h而没有包含XXXDoc.h.应该这样:
#include “XXXDoc.h”
#include “XXXView.h”
注意两个的顺序不能调换,调换了也会报错
=================================================
屏蔽指定Warning:
#pragma warning(disable : 4995)
=================================================
控件大小随对话框大小变化而变化:
在OnPaint或者OnSize中加入以下类似代码,自行研究:
CRect m_rect; GetParent()->GetClientRect(&m_rect); CWnd *pWnd,; pWnd = GetDlgItem(IDC_LIST); if(pWnd) { CRect rect; pWnd->GetWindowRect(&rect); ScreenToClient(&rect); rect.right= rect.left+m_rect.Width()*0.9; rect.bottom = m_rect.Height()-m_rect.Height()*0.4-10; pWnd->MoveWindow(rect); }
=================================================
某块内存被占用时产生中断:
_CrtSetBreakAlloc(615);
用处在于内存泄露是可以检测到是什么代码产生的,但是如果每次泄露的内存不同位置,就不好使了。。
=================================================
基于单文档的程序启动最大化:
App类中:
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
=================================================
设置保存路径对话框:
char szPath[MAX_PATH]; CString str; ZeroMemory(szPath, sizeof(szPath)); BROWSEINFO bi; bi.hwndOwner = m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = "请选择输出目录:"; bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST lp = SHBrowseForFolder(&bi); if(lp && SHGetPathFromIDList(lp, szPath)) { str.Format("选择的目录为 %s", szPath); AfxMessageBox(str); }
=================================================
读取整个文本文件:
ifstream myfile("a.TXT"); stringstream buffer; buffer<<myfile.rdbuf(); cout<<buffer.str();
=================================================
读取中文路径需要先设置:
setlocale(LC_ALL,”Chinese-simplified”);
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com