VC++问题集15

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文件中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值