151:编译错误:initialization of 'text' is skipped by 'case' label
代码:switch(m_mode){
case 0:
....
CString str;
CString text;
....
break;
case 1:
....
text="ad";
....
break;
}
原因:运行swtich中的case 1:时忽略了case 0:中初始化string strv,和text。所以出错。
解决办法:把CString str;CString text;定义为全局变量。
152:如何用Release版本编译:
点击"组件"---"配置"---"添加"--"Release",把Debug版本删除即可。
153.基于对话框的应用程序执行顺序:
先执行全局变量theApp,从C**App对象中的InitInstance()函数进入对话框。
所以在对话框中要用到的初始化必须在InitInstance()函数的开头部分写。
154.如何获得毫秒时间:
调用函数GetTickCount();retrieves the number of milliseconds that have elapsed since Windows CE was started.
155.关于设置CRgn的问题:
举个例子,有5个HRGN hRgn[5];(已经创建好)用定时器每隔一段时间就SetWindowRgn(hRgn[++i%5])一下,会发现第一轮的时候,5个都正 常,但是当第二轮的时候,SetWindowRgn(hRgn[++i%5]);的调用全都失败。
分析原因:
msdn中解释,第一次SetWindowRgn(hRgn)时,hRgn就由系统来管理了,hRgn之后不能在用于其他任何函数。
The operating system does not make a copy of the region, so do not make any further function calls with this region handle, and do not close this region handle 的意识是说,你用过了HRGN之后,它就没有意义了,你的HRGN已经不是你最初创建 的HRGN了,你需要重新创建HRGN。
解决办法:
每调用一次,当第二次调用时要把前次调用的删了重新创建。
测试代码为:
CTestDlg里声明了
CRgn m_Rgn[6];
构造函数里创建对象:
m_Rgn[0].CreateEllipticRgn(0,0,100,100);
m_Rgn[1].CreateEllipticRgn(0,0,200,200);
m_Rgn[2].CreateEllipticRgn(50,50,100,100);
m_Rgn[3].CreateEllipticRgn(0,0,300,300);
m_Rgn[4].CreateEllipticRgn(100,100,500,500);
m_Rgn[5].CreateEllipticRgn(300,300,500,500);
在InitalDialog里设置一个定时器:
SetTimer(1,500,NULL);
定时器处理函数
void CTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int rz = SetWindowRgn(m_Rgn[m_iIndex],TRUE);
if (rz==0)//等于0 说明所以的对象已经设置了一遍
{
//和原来的对象解除关系
for (int i=0;i <6;i++)
{
m_Rgn[i].Detach();
}
//重新创建
m_Rgn[0].CreateEllipticRgn(0,0,100,100);
m_Rgn[1].CreateEllipticRgn(0,0,200,200);
m_Rgn[2].CreateEllipticRgn(50,50,100,100);
m_Rgn[3].CreateEllipticRgn(0,0,300,300);
m_Rgn[4].CreateEllipticRgn(100,100,500,500);
m_Rgn[5].CreateEllipticRgn(300,300,500,500);
}
m_iIndex++;
m_iIndex %= 5;
CDialog::OnTimer(nIDEvent);
}
对测试代码的分析:
以上的测试代码可以成功,但是绝对有GDI句柄的不断增加Bug。
在Timer中应该这样写:
.............
HRGN hRgn = CreateRectRgn(0,0,0,0); //创建一个空的RGN
::GetWindowRgn(hwnd, hRgn); //获取原先的Windows RGN
::SetWindowRgn(hwnd, NULL); //将窗口区域清空
::DeleteObject(hRgn); //释放原先的RGN
::SetWindowRgn(hRgn[++i%5]); //应该木问题老
.............
156.如何得到任务栏窗口(原问题:如何得到任务栏高度)
要得到任务栏的窗口可以通过FindWindow函数。
HWND hWnd = FindWindow("Shell_TrayWnd", 0); 这样就得到了任务栏的窗口指针。
RECT Rect;
if (GetWindowRect(hWnd, &Rect))
{
//Rect.bottom-Rect.top 就是任务栏的高度。
}
157.GDI: graphics device interface
158.数据库中的表名最好不能命名为:user(Access数据库)
159.关于CTabCtrl::GetItem的问题:
TCITEM tcItem;
int m_CurS=m_TabCtrlMessage.GetCurSel();
tcItem.mask=TCIF_TEXT;
m_TabCtrlMessage.GetItem(m_CurS,&tcItem);// (m_TabCtrlMessage为CTabCtrl控件)
CString szID=tcItem.pszText; //出现异常
AfxMessageBox(szID);
问题所在:
tcItem.pszText为无用指针。
代码应写成:
TCITEM tcItem;
int m_CurS=m_TabCtrlMessage.GetCurSel();
tcItem.mask=TCIF_TEXT;
char buf[200]={0};
tcItem.pszText=buf;//把pszText这个结构体成员用一个指向申请好的一块内存区域的指针赋值
tcItem.cchTextMax=20; //指定要获取多长的字符串
m_TabCtrlMessage.GetItem(m_CurS,&tcItem);
AfxMessageBox(buf);
160.在类中定义的静态变量在链接时出现连接错误,如:
A.h文件
class A {
public :
static *B b;
}
B=new B();
对B的赋值应该放在A.cpp文件中。