MFC备忘(1)

1. 窗口显示样式
假设定义一个窗口,设定变量为m_pWnd;

//在窗口原来的位置以原来的尺寸激活和显示窗口
m_pWnd->ShowWindow(SW_SHOW);		

//激活窗口并将其最大化
m_pWnd->ShowWindow(SW_SHOWMAXIMIZED);		

//激活窗口并将其最小化
m_pWnd->ShowWindow(SW_SHOWMINIMIZED);

//窗口默认大小显示,并处于激活状态
m_pWnd->ShowWindow(SW_SHOWNA);				

//激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小
m_pWnd->ShowWindow(SW_SHOWNOMAL);			

//窗口最小化,激活窗口仍然维持激活状态
m_pWnd->ShowWindow(SW_SHOWMINNOACTIVATE);		

一些参数定义

/*
SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。

SW_HIDE: 隐藏窗口

SW_MIOE:隐藏窗口并激活其他窗口。

SW_MAXIMIZE:最大化指定的窗口。

SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。

SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。

SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。

SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。

SW_SHOWMAXIMIZED:激活窗口并将其最大化。

SW_SHOWMINIMIZED:激活窗口并将其最小化。

SW_SHOWMINNOACTIVATE:窗口最小化,激活窗口仍然维持激活状态。

SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。

SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。

SW_SHOWNOMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。
*/

参数详细解释

2. 窗口最大化问题
窗口最大化任务栏被覆盖解决方案

3. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
每次遇到这个问题就头疼,主要知道解决方法,每次都忘记,无语!
解决方法:搜索vs目录下的文件cvtres.exe,重命名即可。(C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\ 在这个目录下找)
相关方法解决

4.代码实现技巧
(1)如果使用了GetTickCount() 获取时间,会有一个缺陷是,这个函数可以存储的最大值是(2^32-1) ms约为49.71天,超过则会归零。需要计算时间避免得到负值,会用到如下方法:

//1. 某个起始时间获取
StartTime = GetTickCount();

//2. 获取相应的结束时间
EndTime = GetTickCount();

//3. 计算时间差
Time = EndTime - StartTime;		//错误做法,会导致负值存在,影响后续代码执行
Time = abs((int)(EndTime - StartTime));		//正确做法,避免负值影响

(2)异常处理
有时候代码执行会出现需要进行错误处理的情况,有几种方法,一种是用goto语句直接跳转到某一个处理函数,另外有一种是直接return一个错误值;但这两种都会有点缺陷,goto会直接影响代码结构,显得整体很混乱;return值返回会有一种如果我需要执行函数内部之后的代码,但直接返回了可能会有意料外的情况出现。
目前还能想到一种就是用do{…}while() 语句来操作,遇到错误可以直接break; 不会影响到函数末端的代码执行。

void fun()
{
	//一些操作代码
	....
	do{
		//需要执行的代码,包含需要处理异常的
		if()
		{
			......
			break;		//可以直接跳出当前循环,不需执行内部之后的代码
		}
		
	}while(false);		//false可以确保这个循环内部只执行一次
	
	...					//这部分之后的代码因是从循环内部直接break,仍然能执行这段之后的代码
}

(3)鼠标闲置一段时间之后进行其他的操作

//需要用到的函数是GetLastInputInfo(),主要是用来获取键盘和鼠标空闲状态的时间
//注意:windows2000以上系统才支持函数GetLastInputInfo()因此有可能需要在StdAfx.h中加上如下语句:
#define _WIN32_WINNT 0x0500
//或者:
#ifdef _WIN32_WINNT 
#undef _WIN32_WINNT 
#endif 
#define _WIN32_WINNT 0x0500 

#define CHANGE_LOGIN_AUTHORITY

//我这里用的是登录权限在闲置的时候的自动切换
//1.设置定时器,放到界面的初始化函数里
SetTimer(CHANGE_LOGIN_AUTHORITY, 1000, NULL)//2.处理函数
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
	LASTINPUTINFO lpi;
	DWORD dwTime = 0;
	
	switch(nIDEvent)
	{
	case GETLASTINPUTINFO:// 获取键盘和鼠标处于空闲状态的时间

		lpi.cbSize = sizeof(lpi);
		GetLastInputInfo(&lpi);
		dwTime = abs((int)(::GetTickCount()-lpi.dwTime));

		if (dwTime >= 30000 && UserLevel>GM_PERSONNAL)//30秒自动切换
		{
			/*if (m_uGetLastInputInfo)
			{
				KillTimer(GETLASTINPUTINFO);
			}*/
			//权限切换
		}
		break;
	default:
		break;
	}

	CFrameWndEx::OnTimer(nIDEvent);
}

//3.界面退出时要释放定时器资源
void CMainFrame::OnClose()
{
	//。。。
	KillTimer(GETLASTINPUTINFO);
	KillTimer(GETLASTINPUTINFO);		//确保释放成功
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值