MFC邮递表的中文翻译(转载四)

鬼谷子
交通大学思源BBS -- 文章阅读
--------------------------------------------------------------------------------
发信人: common (只爱陌生人), 信区: Visual
标 题: MFC邮递表的中文翻译(转载四)
发信站: 交大兵马俑BBS站 (Tue Dec 28 16:42:43 1999), 站内信件
MFC邮递表的中文翻译
我是一名mfc程序设计的爱好者,订阅了mfc的maillist,利用业余
时间将它翻译出来,希望能对mfc编程的朋友有所帮助,请朋友们指正.
第二十八期目录 杨晓东 1999.3.7
1.焦点问题
2.从一个OCX调用另一个OCX的方法。
3.得到视
4.字符转化时间
5.二进制还是文本方式
6.发送消息
7.怎样知道菜单运行时的状态
8.DLL编译出错
焦点问题
问:我有一个非模态属性表,其中的一页包含7个控件,我的问题是,
如果现在焦点在一个编辑控件上,当我最小化窗口后又最大化,那么
该控件就会失去焦点,怎样才能恢复原状?
答:在消息WM_SHOW中这样做:
void CPropPage::OnShowWindow(BOOL bShow, UINT nStatus)
{
...
if( bShow ) {
// restore current focused control
if( m_pCurFocusWnd != NULL ) {
m_pCurFocusWnd->SetFocus();
}
}
else {
// save current focused wnd
m_pCurFocusWnd = GetFocus();
}
YourBaseClass::OnShowWindow(bShow, nStatus);
...
}
注意:pCurFocusWnd是一个CWnd指针,必须在构造函数中初始化为NULL;
你也必须声明对话框中的所有变量,否则调用OnShowWindow时,指针
通过GetFocus()所返回的值将是非法的。希望你能满意!
回到本期目录
从一个OCX调用另一个OCX的方法。
问:我们能否在一个OCX中建立另外一个OCX的句柄?我想做一个OCX,
里面包含VC的应用向导生成器的OCX,第一个OCX需要第二个OCX的支持
(插入的控件需要交流)当我建立第二个OCX句柄时,总是失败。
答:将你的initlnstance()作如下修改。
BOOL CScheduleXVer1App::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
AfxEnableControlContainer();
}
return bInit;
}
回到本期目录
得到视
问:我写了一个SDI程序,怎样我才能从框架窗口中得到指向视的指针?
答:试一下CFrameWnd中的GetActiveView()
CView* theView = MyFrameWnd.GetActiveView();
if (CView)
// do something...
回到本期目录
字符转化时间
问:我想将字符转化为CTime对象。
答:这有一个非常简单的函数,您可以在此上面加入你所需要的:
BOOL ScanTime(
CTime &time,
// o - filled in time structure
LPCTSTR lpszTime,
// i - the string containing the time to be extracted
LPCTSTR lpszFormat
// i - the time format to extract according to
)
{
int nYear = 1980; // extracted time fields
int nMonth = 1;
int nDay = 1;
int nHour = 0;
int nMin = 0;
int nSec = 0;
int nFlag = DATE_TIME; // DATE_TIME / DATE_ONLY / TIME_ONLY
CString msg;
// start at the beginning
char *pTime = (char *)lpszTime;
char *pFmt = (char *)lpszFormat;
while (*pFmt != '\0')
{
if (*pFmt == '%')
{
pFmt++;
switch (*pFmt)
{
case 'Y' : // year with century
sscanf (pTime,"%4d",&nYear);
if (nYear < 1980 || nYear > 2036)
{
msg.Format ("Invalid year (%d)",nYear);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=4;
break;
case 'y' : // year without century (00-99)
sscanf (pTime,"%2d",&nYear);
nYear = nYear + (nYear > 36 ? 1900 : 2000);
if (nYear < 1980 || nYear > 2036)
{
msg.Format ("Invalid year (%d)",nYear);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
case 'm' : // month (01-12)
sscanf (pTime,"%2d",&nMonth);
if (nMonth < 1 || nMonth > 12)
{
msg.Format ("Invalid month (%d)",nMonth);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
case 'd' : // day of month (01-31)
sscanf (pTime,"%2d",&nDay);
if (nDay < 1 || nDay > 31)
{
msg.Format ("Invalid day (%d)",nDay);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
case 'H' : // hour (00-23)
sscanf (pTime,"%2d",&nHour);
if (nHour < 0 || nHour > 23)
{
msg.Format ("Invalid hour (%d)",nHour);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
case 'M' : // minute (00-59)
sscanf (pTime,"%2d",&nMin);
if (nMin < 0 || nMin > 59)
{
msg.Format ("Invalid minute (%d)",nMin);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
case 'S' : // second (00-59)
sscanf (pTime,"%2d",&nSec);
if (nSec < 1 || nSec > 31)
{
msg.Format ("Invalid second (%d)",nSec);
AfxMessageBox (msg);
return (FALSE);
}
pTime+=2;
break;
default :
msg.Format("Invalid format specifier (%c)",
*pFmt);
AfxMessageBox(msg);
return (FALSE);
break;
}
}
else
{
if (!isdigit((int)(*pTime)))
{
if (*pTime == *pFmt)
{
pTime++;
}
else
{
msg.Format ("Character mismatch : Expected %c, found%c",
*pFmt,*pTime);
AfxMessageBox ((LPCTSTR)msg);
return (FALSE);
}
}
}
pFmt++;
}
// success
time = CTime(nYear,nMonth,nDay,nHour,nMin,nSec);
return (TRUE);
}
回到本期目录
二进制还是文本方式?
问:怎样测定一个文件是用二进制模式还是文本模式打开?
答:所有的文件(数据文件或应用文件)都一系列的字节组成的,通
常是通过文件的扩展名来知道某一文件的内容。当程序读一个文件时,
你需要说明这个文件的格式,这通常文件格式会有相应的说明。比如
可能是这个样子的,“第11到14字节是一个长字节,指向图像数据的
开始处”。
如果文件是你自己定义的格式,那么你的读取数据的程序必须与
写入数据的程序相匹配,如果是一个已确定的文件格式,可以通过以
下的站点得到具体内容。
http://www.wotsit.org
回到本期目录
发送消息
问:怎样发送一个消息CBN_SELCHANGE给组合框?
答:下面的代码会使你满意的。
CWnd *pWnd = GetTopLevelParent();
if ( pWnd )
{
lResult = pWnd->SendMessage ( WM_COMMAND, wParam, ( LONG ) hWnd );
if ( lResult == 0 ) //perhaps may parent is a dialog box;
{
pWnd = GetParent ();
lResult = pWnd->SendMessage ( WM_COMMAND, wParam, ( LONG ) hWnd );
}
}
回到本期目录
怎样知道菜单运行时的状态
问:我想在程序运行时从一个属性表中检查某菜单是否enable或disable,
但我不会做,有谁能告诉我该怎么办?
答:如果你想通过MFC来完成你所想的,而使用CN_UPDATE_COMMAND_UI事件,
你的代码不能正常运行,这是因为MFC enable/disable菜单在激活之前就
已经完成了。你可以用 MFC的CWnd::OnCommand函数来解决这个问题,就象
下面所做的,
CTestCmdUI state;
state.m_nID =3D ID_MODIFY;
// All will work fine without this line
AfxGetMainWnd()->OnCmdMsg(ID_MODIFY, CN_UPDATE_COMMAND_UI,
&state, NULL);
if (state.m_bEnabled)
{
CMyPage* pMyPage=3D( CMyPage*)GetParent();
pMyPage->Modify(); // this is my function
}
回到本期目录
DLL编译出错
问:我建立了一个常规DLL,在VC环境下编译联接没有任何错误。但在
命令行中编译却发现有如下错误:
link.exe @C:\TEMP\nme00204. mfcs42d.lib(dllmodul.obj) : error LNK2005:
_DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
答:1)可能你有些cpp文件包括了stadafx.h,而又有些包括了windows.h?
在这种情况下你应该在文件中使用stdafx.h。
2)VC环境是使用.DSP来建立一个项目,可能你的编译器或连接器设
置中与你的.MAK文件中的设置不匹配。
--
※ 来源:·交大兵马俑BBS站 bbs.xjtu.edu.cn·[FROM: 21_73]

龙丘居士亦可怜
谈空说有夜不眠
忽闻河东师子吼
拄杖落手心茫然