1.各个类中的方法的作用:外观样式的修改
1.1 App 类里有创建和退出实例的函数
1.2 Frame 类中有 预创建窗口函数 和 创建窗口函数
1.3 View 类中获取文档的函数,因为其是用户和文档做关联的;还有绘图的函数;也有一个与创建窗口的函数
1.4 想修改窗口的大小和起始位置,在 Frame 类中的 PreCreateWindows (预创建函数)中修改 cs 结构体的 x 和 y 即可;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 1.通过cs修改窗口的样式(大小,位置等)
cs.cx = 300; // 修改窗口的大小
cs.cy = 300; // 修改窗口的大小
cs.x = 0; // 修改窗口出现的位置
cs.x = 0; // 修改窗口出现的位置
return TRUE;
}
1.5 想要获取系统的屏幕高度和宽度,我们使用: GetSystemMetrics(SM_CXSCREEN) 函数即可;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 1.1 全局函数GetSystemMetrics是获取操作系统的分辨率的函数
int CX = ::GetSystemMetrics(SM_CXSCREEN);
int CY = ::GetSystemMetrics(SM_CYSCREEN);
cs.x = (CX - cs.cx)/2;
cs.y = (CY - cs.cy)/2;
return TRUE;
}
1.6 想要更改窗口的风格,与要去掉的东西进行异或即可(原因是因为当某种样式存在时,其所在位为1,否则为0,因此想去掉某种样式就和其进行异或)
1.6.1 去掉最大化最小化、去掉拉伸样式:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 2.去掉最大化最小化按钮(使用异或)
cs.style = cs.style^WS_MINIMIZEBOX;
cs.style = cs.style^WS_MAXIMIZEBOX;
// 2.1 去掉拉伸样式
cs.style = cs.style^WS_THICKFRAME;
return TRUE;
}
1.7 去掉窗口的边框(包括去掉标题栏)
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 2.2 去掉标题栏
// cs.style = WS_POPUP;
return TRUE;
}
1.8 修改标题栏的标题:我们需要先去掉 FWS_ADDTITLE 这个样式,才能对标题进行修改,否则无法进行修改,标题是默认的
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 3. 更改标题栏的题目
cs.style = cs.style^FWS_ADDTOTITLE; // FWS是frame windows style,
cs.lpszName = L"O(∩_∩)O哈哈~";
return TRUE;
}
1.9 去掉菜单栏:我们在 OnCreate 函数中添加一行 this->SetMenu(0) 即可完成去掉菜单栏
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
... ...(之前的代码不进行拷贝,否则太多容易乱)
// 4.创建一个空的菜单(即为删除菜单)
this->SetMenu(0);
return 0;
}
2.修改图标
2.1 我们想修改一下标题栏的图标
1.我们首先需要创建一个 ICON 类型的资源,删除多余的,只留下一个 32x32 的 24位 的位图来作为新的标题栏的图标;
2.完成绘制后,我们在 PreCreateWindow 函数中首先加载新创建的图标的句柄: HICON hIcon = ::LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;
3.其次我们使用: cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, 0, 0, hIcon) 来完成对新创建图标的更新;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// 5.修改图标
// HICON hIcon = ::LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON1));
// 使用内建的函数
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, 0, 0, hIcon);
return TRUE;
}
3.修改鼠标样式
3.1 修改鼠标的样式
1.首先我们确定鼠标的样式我们需要在 View 类的 PreCreateWindow 函数中进行修改的,因此首先我们添加一个新的鼠标资源,完成绘制;
2.其次,我们在 View 类的 PreCreateWindow 函数中添加: HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1) 来完成刷子的加载;
3.再然后我们使用: cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, hCursor) 来完成对鼠标样式的更新;
4.我们还可以添加一个画刷对象来完成对窗口 view 背景色的更改,先创建画刷对象: HBRUSH hBrush = ::CreateSolidBrush(RGB(0, 255, 0)) ,再更新: cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, hCursor, hBrush) 。
BOOL CMy114MFCView::PreCreateWindow(CREATESTRUCT& cs)
{
// 6.修改光标的样式
HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);
HBRUSH hBrush = ::CreateSolidBrush(RGB(0, 255, 0));
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, hCursor, hBrush);
return CView::PreCreateWindow(cs);
}
4.添加新的工具条
4.1 首先添加一个新的工具条资源,在资源视图中进行添加;
4.2 添加完成后在 Frame 类中的 OnCreate 函数中的判断语句(跟 m_wndToolBar 变量相关的判断语句)中的 LoadToolBar 函数中修改参数,修改为刚刚添加的工具条的 ID ,这样就可以将新创建的工具条加入到窗口中去。
4.3 若想要删除工具条,将 4.2 中的判断语句整体删除,并将从注释 // TODO: 如果不需要可停靠工具栏,则删除这三行 开始的四行语句进行删除就可以完成删除工具条的操作。
4.4 若想要窗口显示为最大化,则可以更改 App 类中的 InitInstance 函数中的最后两行: m_pMainWnd->ShowWindow(SW_MAXMUNIMUM) ,即可完成将窗口最大化显示在屏幕上。
5.绘图
5.1 考虑当按下鼠标左键时绘制一个矩形框
1.首先在 View 类中添加一个鼠标左键按下消息;
2.考虑绘制一个矩形的方法,我们需要一个: CDC *cDC = this->GetDC() ;其次我们需要用 cDC 来进行矩形框的绘制: cDC->Rectangle(0, 0, 100, 100) ;最后释放获取的DC: this->ReleaseDC(cDC) ;
3.运行程序,我们发现一个问题:当我们拖动窗口导致窗口大小发生变化时,矩形将消失,这是因为当我们拖拽窗口时窗口自动调用了重回功能,因此矩形会消失,当我们将第二步的代码放置到 View 类中的 OnDraw 函数中时,无论怎样拖拽窗口,矩形都将不会消失。
5.2 考虑如何按下左键,移动鼠标,松开左键完成直线的绘制
1.首先考虑:我们在鼠标按下中只是记录按下的坐标点,画线操作是在鼠标抬起中完成的;
2.给 View 类中添加一个成员: CPoint pointDown 用于在鼠标按下时记录按下的坐标;
3.在 View 中添加一个 LButtonDown 消息,并在其中记录 pointDown 坐标: pointDown = point ;
4.在 View 中添加一个 LButtonUp 消息,并在其中进行绘制直线,绘制直线需要两条语句: LineTo 和 MoveTo ,因此在 LButtonUp 消息中,先获取DC: CDC* cDC = this->GetDC() ;从哪开始绘制: cDC->MoveTo(pointDown) ;到哪结束: cDC->LineTo(point) ;再释放dc: this->ReleaseDC() 。
5.3 考虑如何画出一个曲线
1.我们可以将曲线看成多个小段直线来进行绘制;
2.给 View 类添加 MouseMove 消息,在该消息的处理函数中进行绘制;
3.我们仍需给 View 类添加一个用来标记鼠标是否按下的成员: bool isDraw ,并在 View 的构造函数中初始化为 false ;当鼠标左键按下时更改为 true ;当鼠标抬起时更改为 false ;
4.在 MouseMove 函数中,当 isDraw 为 true 时进行绘制,首先获取DC: CDC* cDC = this->GetDC() ;再进行绘制: cDC->MoveTo(pointDown) ; cDC->LineTo(point) ;更改每次的起始点: pointDown = point ;释放DC: this->ReleaseDC() 。
5.4 考虑如何改变画刷的颜色
1.首先定义一个画笔: CPen pen(PS_DASH, 1, RGB(255, 0, 255)) ;在使用获得的DC选择该画笔: cDC->SelectObject(pen) ;即可改变画刷的颜色;
2.可以任改画刷的颜色、线条的粗细等。