为快速开发学mfc,推荐看吕鑫的教学视频,因为这个比较清楚百度搜索 吕鑫mfc就可以了!
这个就挺好:http://www.tudou.com/programs/view/sirRzIM0gj0
vs2010对vc 6.0有了很大的改进,扩充了类库。在vc 6.0中很多不便使用的功能得到了改进。
要实现某个功能,比如vc6.0中CDialogBar使用,不如在vs2010中的DockablePane方便,列表控件的排序用CListCtrl不如用CMFCListCtrl方便,在vc6.0中的方法比较麻烦,看起来也费劲,模仿操作可能还不成功。
在有一定vc6.0经验后要学习vs2010的新特性。
vc学习:
http://family.baidu.com/portal/techForum/detail?articleId=685441801
消息函数解析:
http://bbs.csdn.net/topics/300216012
Windos API初体验:
http://blog.csdn.net/fucumt/article/details/8547227
遍历文件目录:
CFileFind tempFind;
CString path="C:\\Documents and Settings\\huangzhiqiang03\\桌面\\语料2\\cand\\*.*";
CString strFileName;
int nCount=0;
BOOL bIsFinded =(BOOL)tempFind.FindFile( path );
while( bIsFinded )
{
bIsFinded = (BOOL)tempFind.FindNextFile();
if( !tempFind.IsDots() )
{
nCount++;//文件数
//每次得到一个文件名
strFileName = tempFind.GetFileName();
MessageBox(strFileName);
}
}
tempFind.Close();
修改单文档程序的标题栏:
找到document类,找到OnNewDocument() 函数,添加SetTitle()函数
OnNewDocument() {
if (!CDocument::OnNewDocument())
return FALSE;
SetTitle (" 文档标题 " );
return TRUE;
}
画点函数:
pDC->SetPixel(x,y,RGB(0,0,220));
画线函数:
pDC->MoveTo(point0);
pDC->LineTo(temppoint);
pDC->LineTo(x,y);
画多边形:
CPoint res【】中存了n个点,定义画刷可以填充。
CBrush MyBrush;
CDC *pDC=GetDC();
MyBrush.CreateSolidBrush(RGB(100,250,250));
pDC->SelectObject(&MyBrush);
pDC->Polygon(res,n);
画椭圆:
CDC *pDC=GetDC();
MyBrush.CreateSolidBrush(RGB(100,250,250));
pDC->SelectObject(&MyBrush);
pDC->Ellipse(point.x-r,point.y-r,point.x+r,point.y+r);
点的初始化:
CPoint point1=CPoint(250,500);
创建画笔:
CPen Mypen,*oldPen;
Mypen.CreatePen(1,1,RGB(255,0,0));
oldPen=pDC->SelectObject(&Mypen);
//draw...
pDC->SelectObject(oldPen);
RedrawWindow();//刷新屏幕
Sleep(1);//延时1ms,提高填充过程的可视性
取得一个绘图类指针的方法
方法一
CTestDoc *pDoc=GetDocument();
ASSERT_VALID(pDC);
pDC->MoveTo(50,50);
pDC->LineTo(500,500);
方法二
CDC *pDC=GetDC();
pDC->MoveTo(50,50);
pDC->LineTo(500,500);
ReleaseDC(pDC);
方法三
CClientDC dc(this);
dc.MoveTo(50,50);
dc.LineTo(500,500);
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Polygon(Point,7);//绘制多边形
//输出多边形的顶点编号
pDC->TextOut(550,410,"P0");
RedrawWindow();//刷新屏幕
double temp[N][3]={};数组初始化置空 在DEV C++中可用,visual C++图形学中编译报错
数组批量赋值:
double m[3][3]={1,0,0,0,1,0,1,1,1};
设置窗口范围函数:
类属 CDC::SetWindowExt
原型 virtual CSize SetWindowExt(int x,int y);
返回值: 原窗口范围的CSize对象
设置视区范围函数:
类属 CDC::SetViewportExt
原型 virtual CSize SetViewportExt(int x,int y);
返回值: 原视区范围的CSize对象
设置视区坐标原点函数:
类属 CDC::SetViewportOrg
原型 virtual CPoint SetViewportOrg(int x,int y);
返回值: 原视区原点的CPoint对象
得到当前绘图窗口的大小及屏幕坐标:
CDC *pDC=GetDC();
CRect Rect;
GetClientRect(&Rect);
Rect .Width();Rect.Height();
绘图窗口左上角的屏幕坐标:
GetWindowRect(Rect);
x=Rect.left;y=Rect.top;
使控件获得焦点:
GetDlgItem(IDC_BUTTON1)->SetFocus();
GetDlgItem(控件ID)->SetFocus();
双缓冲绘图:取得视区范围内的点的像素,并且剥离RGB值的方法:
CDC *pDC=GetDC();
int x,y;
COLORREF c;
COLORREF temp;
for(x=0;x<xx;x++)
for(y=0;y<yy;y++)
{
c=pDC->GetPixel(x,y);
if(x==0&&y==0)
temp=c;
//剥离rgb变量c的rgb值!
BYTE r = GetRValue(c);
BYTE g = GetRValue(c);
BYTE b = GetRValue(c);
BYTE rr = GetRValue(temp);
BYTE gg = GetRValue(temp);
BYTE bb = GetRValue(temp);
temp=c;
//判别两个像素点之间差异范围是否超过一定阈值
if(abs(r-rr)+abs(g-gg)+abs(b-bb)>100)
c=RGB(255,0,0);
pDC->SetPixel(x,y,c);
}
关于在视区内输出文字及变量的语句
CString data; //定义一个字符串变量
data.Format("%f",k); //将浮点型变量K格式化成字符串到data
如果是在vs2010中则需写成data.Format(L"%f",k);
pDC->SetTextColor(RGB(0,0,0)); 设置字体颜色
pDC->SetBkColor(RGB(0,200,100)); 设置文字背景颜色
pDC->TextOut(0,0,"直线的斜率为:"); 在特定位置(0,0)输出常量字符串
pDC->TextOut(100,0,data); 在特定位置(100,0)输出data变量
载入位图的方法(可用来做小游戏)
下面一段程序是来自Mousemove消息的,point.x和point.y是mousemove自动生成的Cpoint的横纵坐标
CDC MemDC;//定义一个内存设备上下文对象
CBitmap Bitmap,*OldBitmap;//定义一个CBitmap对象和一个CBitmap对象指针
Bitmap.LoadBitmap(bitxq);//从资源中导入图片,在Resouce视图下已经导入位图资源的ID号设为bitxq
MemDC.CreateCompatibleDC(pDC);//建立与位图相应的内存设备上下文
OldBitmap=MemDC.SelectObject(&Bitmap);//把内存设备上下文换成位图图像
pDC->BitBlt(point.x-20,point.y-20,40,50,&MemDC,0,0,SRCCOPY);//将位图数据传送到屏幕(point.x-20,point.y-20为位图的左上角设备坐标系坐标;40,50为长宽)
MemDC.SelectObject(OldBitmap);//从内存设备上下文中释放位图图像
combox的使用:
m_combox.InsertString(1,_T("19200"));添加待选条目
m_combox.GetCurSel();得到选中条目的序号
m_BaudRate.SetCurSel(0);设置选中条目
1 把CView改成 CScrollView
2 重载 OnInitialUpdate()函数
void CCh10Demo3View::OnInitialUpdate()
CScrollView::OnInitialUpdate();
SIZE size={3000,1500};
SetScrollSizes(MM_TEXT,size);//滚动窗口的最大区域/
}
OnPrepareDC(&dc);//进行坐标原点的匹配
dc.DPtoLP(&point);//将视图坐标转换为文档作标
颜色对话框
COLORREF bgColor;
使用文件夹对话选择 框:
目录对话框SHBrowseForFolder:
CString docPath;
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = _T("选择路径");//显示提示信息
bi.ulFlags = BIF_RETURNONLYFSDIRS;//可以选很多值,BIF_NEWDIALOGSTYLE可以新建目录并缩放窗口
bi.iImage = 0;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
//如果没有选择路径则返回 0
//如果选择了路径则复制路径,返回路径长度
if(pIDList)
{
SHGetPathFromIDList(pIDList,Buffer);
//取得文件夹路径到Buffer里
docPath = Buffer;
//docPath+="\\";//将路径保存在一个CString对象里
MessageBox(docPath);
}
//详细参看:http://www.cnblogs.com/hibernate6/archive/2011/11/24/2521995.html 在单文档程序中添加按钮:
在view类中添加CButton m_button;
在Resource选项卡的StringTable中添加m_button的ID,比如:代号为 IDB_BTN 数值为 130,不与现有ID冲突就行
用类向导为view类添加消息处理函数处理 WM_CREATE消息 ,会生成 OnCreate(LPCREATESTRUCT lpCreateStruct) 函数
在函数内添加 按钮的初始化与显示的语句:
如:
F5调试,程序运行就可显示按钮。
在类向导command选项卡下找到按钮的ID(IDB_BTN),添加Message COMMAND;
生成OnIdbBtn()函数
F5运行,点击按钮就出现对话框。
各种对话框:
MessageBox(_T("你点击了取消按钮!"));
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
IDC_ARROW 标准箭头; IDC_CROSS 十字光标; IDC_HAND windows 2000:手型
鼠标滚轮事件:
OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
nFlags
nFlags的值表示鼠标、Shift键和Ctrl键的状态组合
当ctrl键按下的时候 nFlags=MK_CONTROL
当shift键按下的时候 nFlags=MK_SHIFT
zDelta
当滚轮滚动朝上滚动的时候 zDelta>0
当鼠标滚动朝下滚动的时候 zDelta<0
pt
CPoint pt为鼠标滚轮滚动时鼠标所在的位置,这个坐标以屏幕的左上角为零点。
详见:http://blog.sina.com.cn/s/blog_4c7fa77b010007is.html
添加快捷键:
1
找资源视图-》Accelerate-》IDR_MAINFRAME,
在展开的列表中找到“ID_EDIT_UNDO修饰符ctrl 键Z 类型VIRTKEY”,(如果没有自己创建的可能无效)
点击该条右键,选择添加事务处理程序,OnEditUndo(){。。。}
2
在类向导中点击消息,找到WM_KEYDOWN,添加事件处理函数
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){。。。};
Cwnd窗体控件派生了CView, CScrollView, CDialog, 各种control类,FrameWindows(CFrameWnd),CControlBar,CPropertySheet等。
其中contrls包括常用的CButton,CEdit,ClistBox,CComboBox等。
以CButton为例,
有一个按钮控件CButton m_btn1;
采用CWnd的MoveWindow函数移动 m_btn1。
MoveWindow(m_btn1的左上角x坐标,m_btn1的左上角y坐标,m_btn1的宽,m_btn1的高,TRUE)。
CWnd窗体控件的Create()函数
CWnd::Create
virtual BOOL Create(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle, //窗体显示方式WS_CHILD 子窗口 WS_VISIBLE可见
const RECT& rect, //窗体大小
CWnd* pParentWnd, //父窗体的指针 ,如&m_wndToolBar,编辑框m_MyEdit是工具条m_wndToolBar的子窗口
UINT nID, //窗体控件的控件ID,如IDC_MYEDIT
CCreateContext* pContext = NULL
);
参数:
lpszClassName | 指向一个以null结尾的字符串,它命名了一个Windows的窗口类(一个WNDCLASS结构)。类名可以是用全局函数AfxRegisterWndClass注册的任何名字,也可以是任何预定义的控制类名。如果该参数为NULL,则使用缺省的CWnd属性。 |
lpszWindowName | 指向一个null结尾的字符串,其中包含了窗口名。 |
dwStyle | 指定了窗口风格属性。不能使用WS_POPUP。如果你想要创建一个弹出窗口,则应使用CWnd::CreateEx。 |
rect | 窗口的位置和大小,使用pParentWnd的客户区坐标。 |
pParentWnd | 父窗口。 |
nID | 子窗口的ID。 |
pContext | 窗口的创建上下文。 |
编辑框-create:
//hzq 在工具条上添加使用编辑框
按钮-create:
CButton::Create
BOOL Create(
LPCTSTR lpszCaption,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
返回值:调用成功时返回非零值,否则为0。
参数:
lpszCaption | 指定按钮控件上的文本。 |
dwStyle | 指定按钮控件的风格。可以采用控件风格的各种组合。 |
rect | 指定按钮控件的大小和位置。既可以是一个CRect对象,也可以是一个RECT结构。 |
pParentWnd | 指定按钮控件的父窗口,通常是一个CDialog对象。注意不能为NULL。 |
nID | 指定按钮控件的ID号。 |
构造一个CButton对象需要两步:首先调用构造函数,然后调用Create函数创建Windows按钮控件并在CButton对象上应用它。
如果设置了WS_VISIBLE风格,Windows将向该按钮控件发送所有用来激活和显示该按钮的消息。
按钮控件上可用的窗口风格如下:
· | WS_CHILD | 总是设置 |
· | WS_VISIBLE | 通常要设置 |
· | WS_DISABLED | 很少使用 |
· | WS_GROUP | 成组按钮 |
· | WS_TABSTOP | 按钮按制表键次序排列 |
CString转int:
int tempNum=_ttoi(tempStr); //转CString变量tempStr为 int变量tempNum
单文档view类获得焦点:
方法:得到view指针,然后设置焦点。以下代码在view类中实现,头文件添加"MainFrm.h"。
C工程名View *pView = (C工程名View *)((CMainFrame *)AfxGetApp()->GetMainWnd())->GetActiveView();
pView->SetFocus();
参考:http://zhidao.baidu.com/link?url=RiGEOEErH9sNVGtflNSiUFffPEpCHROajJaUB_nCfm2mKyfw5iq1Kek6X3E1O2h5WuoL3sUwtrkiaog0McCR3a
更多参考学习:
http://blog.sina.com.cn/s/articlelist_1604917350_0_1.html
单文档中得到CView类,CMainRrame类,APP类指针,及句柄与指针转换
实例:
在一个CDockablePane的dialog中,获得CView的指针,并调用CView中的方法:
CpaneTestView *pView=(CpaneTestView *)pMain->GetActiveView();
http://blog.csdn.net/shuilan0066/article/details/6743789
判断左边Shift键是否按下:
if(GetAsyncKeyState(VK_LSHIFT))//Shift左键按下
{...按下应该做的...}
在鼠标滚动操作中判断control键是否按下:
BOOL CYGJD4View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){
(windows里面控制音量的那个东西):
添加滑动条控件slider,ID号默认为:IDC_SLIDER1,并为之绑定控制变量m_slider,
在窗口初始化函数OnInitDialog()里设置滑动块的滑动范围:m_slider.SetRange(0,255);
在类向导命令选项卡下通过控件ID号IDC_SLIDER1找到slider对应的对象,在该对象右边的消息列表中找到消息NM_RELEASEDCAPTURE,该消息在拖滚动条释放的时候触发。
添加处理函数
比如:得到滑动块的位置 m_slider.GetPos();
使用非模态对话框:
创建了dialog对话框类dialog1 ,
dialog1 *pDlg=new dialog1; //在堆中开辟对话框内存,模态对话框在栈中,生命期短。
或pDlg->Create(IDD_DIALOG1,GetDesktopWindow());//以桌面窗口为父窗口,这样可以取得类似qq的效果。
使用Rebar工具条容器
Rebar工具条是一个工具条容器
在MainFra.h中定义
CReBar m_wndReBar; //Rebar工具条容器
在MainFra.cpp中修改OnCreate函数:
||!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
//创建Rebar工具条容器,并把标准工具条m_wndToolBar、自定义工具条myToolBar1和编辑框m_edit加入Rebar
//显示工具条容器m_wndReBar
//设置工具栏停靠
}
Dialog程序中使用滚动条:
添加滚动条控件并绑定控制变量
CScrollBar m_scrollbar;
在OnInitDialog()函数中初始化滚动条的滚动范围,并设置滚动条的初始位置:
为对话框添加滚动消息:WM_HSCROLL或者WM_VSCROLL(对应水平、竖直滚动条的消息)
文件选择对话框:
}
拖一个listCtrl控件到CDialog或者viewForm工程,
给listCtrl控件绑定控制变量CListCtrl m_list;
插入3列:
插入两行:
点击列表头对应控件m_list的消息WM_COLUMCLICK;
CString strTemp;
*pResult = 0;
点击m_list某一行时,产生WM_CLICK消息:
点击表头排序,参考:http://blog.csdn.net/precipitant/article/details/1254878
单文档CRichEditView使用:
得到CRichEditView的引用
CRichEditCtrl& ctrl = GetRichEditCtrl();
CString strContent=“CRichEditView内容文本”;
//设置CRichEditView中的内容为StringContent
ctrl.SetWindowText(strContent);
或者采用如下方式
SendMessage(WM_SETTEXT, 0, (LPARAM)static_cast<LPCTSTR>(strContent));
设置RichEdit中的字体
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
cf.dwEffects = 0;
cf.yHeight = 24*24;//文字高度
cf.crTextColor = RGB(200, 100, 255); //文字颜色
strcpy(cf.szFaceName ,_T("隶书"));//设置字体
CRichEditCtrl& m_richedit1 = GetRichEditCtrl();
m_richedit1.SetSel(1, 5); //设置处理区域
m_richedit1.SetSelectionCharFormat(cf);
CRichEditView上同样支持绘图
CClientDC dc(this);
dc.TextOut(50,50,"Hello");
CRichEditView设置字体
CFontDialog myFontDlg(0,CF_EFFECTS|CF_SCREENFONTS,0,0);
if(myFontDlg.DoModal()==IDOK)
{
CHARFORMAT cf;
myFontDlg.GetCharFormat(cf);
CRichEditCtrl& m_richedit1 = GetRichEditCtrl();
m_richedit1.SetSel(0,-1); //设置处理区域,0,-1为全选
m_richedit1.SetSelectionCharFormat(cf);
}
得到CRichEditView中的文本:
//得到编辑框内容
CRichEditCtrl& ctrl = GetRichEditCtrl();
ctrl.GetWindowText(strContent);
char *pContent;
pContent=strContent.GetBuffer();
CDockablePane使用
参看:http://blog.csdn.net/sky_lily_1985/article/details/7609727
将CFormView嵌入到CDockablePane中(vs2010)
http://blog.csdn.net/zhongyu627/article/details/7239756