HWND pWnd = FindWindow(NULL,"另存为"); //获得窗口的句柄
void saveopen(HWND pWnd)
{
HWND m_hWnd=pWnd;
HWND hWndChild =::GetWindow(m_hWnd,GW_CHILD);
TCHAR BUF[512];
CString filename;
CWnd *pedit;
while(hWndChild)
{
char *buf=new char[512];
::GetClassName(hWndChild,buf,512);//得到枚举的控件是什么类型的,
CString str=buf;
str.TrimRight();
delete buf;
//AfxMessageBox(str);
if(str=="ComboBoxEx32")
{
HWND tt =::GetWindow(hWndChild,GW_CHILD);
HWND yy =::GetWindow(tt,GW_CHILD);
pedit = CWnd::FromHandle(yy);
pedit->SendMessage(WM_GETTEXT,sizeof(BUF)/sizeof(TCHAR),(LPARAM)(void*)BUF);
filename=BUF;//完成第一步保存原始的文件名
CString sPath="F:\\work";
lstrcpy(BUF,(LPCTSTR)sPath);
pedit->SendMessage(WM_SETTEXT,0,(LPARAM)BUF);
}
if(str=="Button") //枚举到按钮,有保存和取消按钮
{
CWnd *pwnd = CWnd::FromHandle(hWndChild);
pwnd->SendMessage(WM_GETTEXT,sizeof(BUF)/sizeof(TCHAR),(LPARAM)(void*)BUF);
//发消息得到按钮的标题
CString str=BUF;
str.TrimRight();
if(str=="保存(&S)")//如果是保存按钮
{
::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);
::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONUP,0,0);
strcpy(BUF,filename);
pedit->SendMessage(WM_SETTEXT,0,(LPARAM)BUF);
return;
}
}
hWndChild=::GetWindow(hWndChild,GW_HWNDNEXT);
}
}
//messagebox输出非字符串的数据
CString strTmp;
strTmp.Format("窗口句柄=%0x",pWnd->m_hWnd);
AfxMessageBox(strTmp);
MFC中菜单变灰
方法1:有UpdateCmdUI句柄时
定义一个BOOL变量m_b来标志菜单项是否有效,该菜单项响应UPDATE_COMMAND_UI消息,在消息处理函数中pCmdUI->Enable(m_b);以后你根据需要来设置m_b的值,就可以使菜单是否可用。在一个函数中可以控制多个菜单
方法2:没有UpdateCmdUI句柄时
MFC中缺省的习惯是当没有UpdateCmdUI句柄时程序是使能(Enable)菜单,菜单自动变成使能,只要关掉缺省值就可以了,把下面的代码加入你的程序
CMainFrm::CMainFrm
{
// Other stuff
this->m_bAutoMenuEnable = false;
}
然后在消息响应函数中添加如下代码:
CMenu* m_menu = GetMenu();
CMenu* submenu = m_menu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_GRAYED);
CFrameWnd::m_bAutoMenuEnable
//Controls automatic enable and disable functionality for menu items.
//CFrameWnd类中的BOOL型数据成员,默认为TRUE。
//如果m_bAutoMenuEnable设为TRUE,则如果某菜单项在当前命令路径中无法找到相应的命令消息控制函数,则此时应用程序框架便禁用该菜单项,并将该菜单项设为灰色。
//如果m_bAutoMenuEnable设为FALSE,便可以禁止上叙自动禁用无控制函数菜单项的特性。
易出错不推荐使用