用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;

}

posted @ 2009-04-16 00:10  ~笑  阅读(2700)  评论(0编辑  收藏  举报