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); //确保释放成功
}