C++学习 2019-1-14

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.可以任改画刷的颜色、线条的粗细等。

Visual C++窗口标题改变的几种方法 在论坛中,经常有人会问到这个问题,所以今天整理了几种方法用来改变窗口标题,希望对这些朋友有所帮助。    一•单文档接口(SDI)类型窗口标题改变    首先,我们来看Windows SDI类型窗口标题栏的结构形式。结合具体例子说明:用VC的AppWizard创建一个名为“SDITitle”的单文档类型的工程,创建完工程后,编译运行该工程,程序主窗口标题形式如下:    文档标题窗口标题    1•文档标题改变    文档标题在是由工程中相应的文档类所控制的,因此我们可以利用SetTitle ()函数来改变文档标题。 例:改变CSDITitleDoc::OnNewDocument() 函数为: BOOL CSDITitleDoc::OnNewDocument()    { if (!CDocument::OnNewDocument()) return FALSE; SetTitle (" 文档标题 " );    return TRUE;    }    运行程序,则每次选择选单中的“文件”的“新建”选项时,文档标题就变成 “文档标题- SDITitle”。    2•主窗口标题改变    主窗口标题默认是工程的文件名,正如前面AppWazied生成的SDITitle工程执行后,标题栏的形式总为“(文档名)- SDITitle”。    改变窗口标题有两种:    第一种方法:利用ResourceView打开工程的资源,修改String Table中的IDR_MAINFRAME的值。将原来的“SDITitle\n\nTitle\n\n\nTitle.Document\nTitle Document”改为“标题改变示例\n\nTitle\n\n \nTitle. Document\nTitle Document”。这样改变后,主窗口标题栏的形式就为“((((-标题改变示例”。    第二种方法:具体改变方法如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值