C++编程俱乐部
需要订阅邮件列表以及要解答各种相关问题的朋友可以访问http://yuhail.cj.net.cn/other/mail.htm或发邮件到MFC2000@990.net、MFC2000@126.com(如订阅邮件列表请注明“订阅”字样)。
问题1:我将一个16x16的图标用在CListCtrl中时,发现它需要一个HICON句柄,请问我怎样才能从图标的ID中获取句柄?
答: 用以下的方法可以取得图标的句柄
HICON hIcon = NULL;
hIcon = LoadIcon(IDI_YOURICONID);
问题2:我已经调用了SetModifiedFlag()方法,但为什么在用户关闭文档窗口时仍然没有方法得知,如果我等到OnCloseDocument()时已经晚了,虽然我设置了标志,但它在改变时依然没有任何提示,请问这是为什么?
答:1)时刻检查用户的状态,只要用户有所变动就马上调用SetModifiedFlag()函数,并且多次调用完全没有性能上的问题。不要等到开始关闭时才调用SetModifiedFlag()。
2)当用户文档进行了改动时,在视类中调用“GetDocument()->SetModifiedFlag(TRUE)”。例如,如果在视中有一个CEdit控件,加入一个对消息ON_EN_CHANGE的自定义函数(假设为OnEditChange()),在这个函数里你就可以调用SetModifiedFlag()。 现在无论用户什么时候关闭计算机都可以询问是否保存。
问题3:打印程序中如何定义一页纸的区域,即无论如何画线,都不超出此区域?
答:在OnDraw中获得打印页面的范围,然后在该范围中画线。
void CView::OnDraw(CDC* pDC)
{ if(pDC->IsPrinting()!=0)
{ int cxPage = pDC->GetDeviceCaps(HORZRES);//获取打印页面范围
int cyPage = pDC->GetDeviceCaps(VERTRES);//get printer pixels per inch
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
...}}
问题4:在VC6(非MFC)中,我想实现将Ctrl+Alt+Del、Ctrl+Esc、Alt+Tab等功能组合键锁住,请问怎样使用Windows API函数实现?
答:在VC6如果需要将功能组合键锁住,只需调用API函数SystemParametersInfo即可,使用如下:SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,TRUE,NULL,0)。
问题5:我通过产生的一组随机数,在视中显示波形图。我采用了CRECT计算出视的失效区,并采用UPDATEWINDOW函数刷新视。程序进入死循环(呈现的波形正常),但我设置的SETTIMER(1,256,NULL)却没有起作用,请问这是为什么?
答:你可能在编写程序强制执行死循环,并且在死循环里没有加入消息处理机制,SetTimer发的WM_TIMER消息不能执行。因为在执行死循环时系统处于等待状态,解决这个问题的方法是:在循环中加入下面的语句
if (PeekMessage()) { TranslateMessage(); DispatchMessage() };
问题6:请问如何实现在移动窗口时,显示的是窗口而非虚框?
答:在Windows系统中,需要在移动窗口时显示窗口或虚框,可以调用Windows API函数来实现:
SystemParametersInfo(SPI_GETDRAGFULLWINDOWS,TRUE,NULL,0)。