用VC解决 按钮灰显(不可用)
用VC解决 按钮灰显(不可用)
本实例使用系统提供的几个函数,对其进行简单的应用,实现更改窗体控件状态的功能,因是初学,在代码风格和质量上很差,有不好的地方还望大家指出;
运行效果如下图所示:
本实例所用到的函数主要有以下几个,在这儿只是列出其名字:
WindowFromPoint();
SetWindowsPos();
GetCurSorPoint();
EnumChildWindows();
EnumChildProc();
实现思想:
获取当前光标所在区域的窗口(控件),得相应的句柄及其父窗口,再通过EnumChildWindows()枚举出所有的子窗口,使用GetClassName()可以判断窗口类型,只要知道了窗口的句柄就可以对其进行操作了,如更改按钮的状态,只需把Enabled属性设置True即可。
下面部份代码:
///开始按钮
void CBodifyButtonDlg::OnBtnStart()
{
CString btncpt = "";
m_btn_start.GetWindowText(btncpt);
if (btncpt == "开始")
{
m_btn_start.SetWindowText("ÔËÐÐÖÐ...");
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
SetTimer(1,200,NULL);//执行Timer事件
}
else
{
m_btn_start.SetWindowText("运行中…");
SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
KillTimer(1);
}
}
Timer事件,本程序关键代码:
void CBodifyButtonDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent != 1)
return;
CPoint pt;
CWnd *cwnd = NULL; //当前句柄
CWnd *pwnd = NULL; //父窗体句柄
char buf[MAX_PATH];
CStatic *stc;
memset(buf,0,MAX_PATH);
CString strvalue,strtemp = "";
GetCursorPos(&pt);
cwnd = WindowFromPoint(pt);
if (cwnd != NULL ||
IsWindow(cwnd->m_hWnd))
{
pwnd = cwnd->GetParent();
if (pwnd == NULL)
pwnd = cwnd;
strvalue.Format("%x",pwnd);
stc = (CStatic*)GetDlgItem(IDC_STC_ParentHandl);
strtemp = "ParentHandl: 0x";
strtemp += strvalue;
stc->SetWindowText(strtemp);
strtemp = "";
strvalue.Format("%x",cwnd);
stc = (CStatic*)GetDlgItem(IDC_STC_SelfHandl);
strtemp = "SelfHandl: 0x";
strtemp += strvalue;
stc->SetWindowText(strtemp);
strtemp = "";
GetClassName(*cwnd,buf,MAX_PATH);
strvalue.Format("%s",buf);
stc = (CStatic*)GetDlgItem(IDC_STC_ClassName);
strtemp = "ClassName: ";
strtemp += strvalue;
stc->SetWindowText(strtemp);
strtemp = "";
cwnd->GetWindowText(strvalue);
stc = (CStatic*)GetDlgItem(IDC_STC_SelfValue);
strtemp = "SelfValue: ";
strtemp += strvalue;
stc->SetWindowText(strtemp);
strtemp = "";
LONG lo = 0;
//此回调函数的两种调用方法均可
// EnumChildWindows(cwnd->m_hWnd,EnumChildProc,(LPARAM)lo);
EnumChildWindows(cwnd->m_hWnd,&EnumChildProc,NULL);
}
CDialog::OnTimer(nIDEvent);
}
//EnumWindowPro回调函数,更改状态
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
if (hwndChild != NULL ||
IsWindow(hwndChild))
{
if(!IsWindowEnabled(hwndChild))
EnableWindow(hwndChild,TRUE);
}
return TRUE;
}