程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 復合控件制作示例

復合控件制作示例

編輯:關於VC++

平時在編程時,常想自己編一些適用的控件以利於程序開發,最近編了一個 定時關機的控件。現把它提供出來,為和我類似的朋友提供小小的幫助。由於我 也是初學乍練,有不當的地方請各位高手給予指出。

1、利用ATL COM Wizard新建一個ATL DLL工程,工程名定為TrueShutDown,其余所有設置保持為 默認。

2、利用插入菜單中的"ATL Object Wizard"插入對象 ,選擇復合控件(Composite Control),如圖1所示。然後單擊"下一步 ",輸入短名稱:ShutDownCtrl,然後單擊"確定"。

3、我們選擇的是復合控件,所以程序中生成了一個對話框模板,在這 裡我們可以將多個控件組合起來形成一個復合控件。

4、在ClassView中右擊CShutDownCtrl,然後選擇Add Window Message Handle,在接一下來的對話框中選擇IDC_OK,並為它選擇消息BN_CLICKED。點擊 "Add and Edit"退出。

5、OnClickedOk函數的實現如下:

LRESULT OnClickedOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

if(IsOK==0)
{
HWND h=::GetDlgItem(m_hWnd,IDC_HOUR);
::EnableWindow(h,false);
h=::GetDlgItem(m_hWnd,IDC_MINUTE);
::EnableWindow(h,false);
SetDlgItemText(IDC_OK,"重設");
IsOK=1;
}
else
{
HWND h=::GetDlgItem(m_hWnd,IDC_HOUR);
::EnableWindow(h,true);
h=::GetDlgItem(m_hWnd,IDC_MINUTE);
::EnableWindow(h,true);
SetDlgItemText(IDC_OK,"確定 ");
SetDlgItemText(IDC_STIME,"");
IsOK=0;
}
return 0;
}

其中的IsOK用來判斷是否點擊了確 定按鈕。定義如下:

protected:

int IsOK;

初始值在構造 函數CShutDownCtrl()中

IsOK=0;

6。在ClassView中右擊 CShutDownCtrl,然後選擇Add Window Message Handle,在接一下來的對話框中 選擇WM_TIMER,為它增加句柄(點擊"Add Handle"),並為 WM_INITDIALOG也增加一個句柄。點擊"Add and Edit"退出。

7、往新增加的函數中添加代碼:

LRESULT OnInitDialog (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
::SetTimer(m_hWnd,0,5000,NULL);//用來定時檢查關機時間 是否已到
::SetTimer(m_hWnd,1,1000,NULL);//用來顯示當前時間
return 0;
}
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SYSTEMTIME str;
CHAR stall DefWindowProc if necessary.
::SetTimer (m_hWnd,0,5000,NULL);//用來定時檢查關機時間是否已到
::SetTimer (m_hWnd,1,1000,NULL);//用來顯示當前時間
return 0;
}
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SYSTEMTIME str;
CHAR str1[20];
CHAR str_h[10],str_m[10];
::GetLocalTime(&str);//得到當前時間
sprintf(str1,"%2d時%2d分%2d秒 ",str.wHour,str.wMinute,str.wSecond);
SetDlgItemText (IDC_TIME,str1);
GetDlgItemText(IDC_HOUR,str_h,sizeof(str_h));// 得到關機小時
GetDlgItemText(IDC_MINUTE,str_m,sizeof(str_m));//得 到關機分鐘
if(IsOK==1)GetSTime(str.wHour,str.wMinute,atoi (str_h),atoi(str_m),str.wSecond);
if (wParam==0&&IsOK==1&&str.wHour==atoi(str_h) &&str.wMinute==atoi(str_m))
{
  switch(m_nType)
  {
  case 1:
ExitWindowsEx(EWX_SHUTDOWN,0);
break;
  case 2:
ExitWindowsEx(EWX_REBOOT,0);
break;
  case 3:
ExitWindowsEx(EWX_FORCE,0);
break;
  }
}
return 0;
}

上面代碼中的 函數GetSTime(str.wHour,str.wMinute,atoi(str_h),atoi (str_m),str.wSecond)是我自定義的,目的是用來計算剩余時間,具體方法見後 。

8、為程序添加一個變量,此變量用來反映用戶選擇的是哪一個單選按 鈕。

protected:

int m_nType;

並初使變量,在構造函數 CShutDownCtrl()中加入代碼m_nType=0;

9、為三個單選按鈕添加函數, 方法和上面為IDC_OK添加單擊函數相同

LRESULT OnClickedRadio1(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

m_nType=1;
return 0;
}
LRESULT OnClickedRadio2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

m_nType=2;
return 0;
}
LRESULT OnClickedRadio3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

m_nType=3;
return 0;
}

10、 在ClassView中右擊CShutDownCtrl,然後選擇Add Member Function,在接一下 來的對話框中輸入函數類型為void,函數聲明為GetSTime(int H,int M,int h,int m,int s)

然後在ShutDownCtrl.cpp中加入代碼:

void CShutDownCtrl::GetSTime(int H, int M, int h, int m, int s)
{
CHAR str[20];
m-=1;
if(h<H)h+=24;
if(m<M){m+=60;h-=1;}
sprintf(str,"%2d時%2d分%2d秒 ",h-H,m-M,60-s);
SetDlgItemText(IDC_STIME,str);
}

11、測試很簡單,首先按F7鍵編譯,之後打開源文件所在目錄, 雙擊ShutDownCtrl.Htm文件就可以測試了。

總結:其實編制復合控件和 用MFC編一般的程序區別不大,只要搞清步驟就可以了。在此希望所有程序愛好 者多多練習,學有所成。我堅信一分耕耘,就一定會有一分收獲的。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved