對話框1
對話框的種類
有兩種類型的對話框:模態對話框和非模態對話框.
模態對話框時指當其顯示時,程序會暫停執行,直到關閉這個模態對話框后,才能繼續執行程序中的其他任務。
非模態對話框顯示時,允許轉而執行程序中其他任務,而不用關閉這個對話框。
創建模態對話框
1.在資源編輯器里面新建一個對話框資源,ID采用默認值為:IDD_DIALOG1
2.雙擊該對話框,為該對話框添加一個關聯的類,命名為CtestDlg
3.創建一個菜單項
4.為該菜單項添加COMMAND命令消息響應函數,讓視類來捕獲它
5.在實現函數中調用Cdialog類的成員函數:DoModal,添加如下兩行代碼:
CTestDlg dlg;
dlg.DoModal();
6.在視類中添加CtestDlg 類的頭文件
創建非模態對話框
1.在資源編輯器里面新建一個對話框資源,ID采用默認值為:IDD_DIALOG1
2.雙擊該對話框,為該對話框添加一個關聯的類,命名為CtestDlg
3.創建一個菜單項
4.為該菜單項添加COMMAND命令消息響應函數,讓視類來捕獲它
5. .在實現函數中添加如下兩行代碼:
CTestDlg *dlg = new CTestDlg;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW);
6.在工程視類的析構函數中調用delete函數:
delete this;
7.在視類中添加CtestDlg 類的頭文件
動態創建按鈕
1. 為對話框資源新建一個按鈕,Caption屬性設為Add;
2. 在CTestDlg類中添加一個CButton類的成員變量m_btn;
3. 在CTestDlg類中響應這個按鈕單擊的消息,在函數體中寫入如下代碼:
void CTestDlg::OnBnClickedButton1()
{
static BOOL b = FALSE;
if (FALSE == b)
{
m_btn.Create(TEXT("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0,0,100,100), this, 123);
b = TRUE;
}
else
{
m_btn.DestroyWindow();
b= FALSE;
}
4. 以上我們是創建了一個變量來判斷是否已經創建了一個按鈕窗口并與按鈕對象相關聯,下面介紹一種更直接的方法來實現判斷。我們知道,CWnd對象都有一個成員變量m_hWnd,用來保存于窗口對象相關聯的窗口句柄。如果窗口對象沒有與任何一個窗口相關聯,這個句柄就為NULL;
void CTestDlg::OnBnClickedButton1()
{
if (!m_btn.m_hWnd)
{
m_btn.Create(TEXT("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0,0,100,100), this, 123);
}
else
m_btn.DestroyWindow();
}
靜態文本控件響應鼠標單擊事件
靜態文本框的主要作用是起提示作用,默認情況下不能響應鼠標消息。
我們可以通過下面兩步就可以實現響應
1.改變它的默認ID;
2.在它的屬性對話框中選擇Notify選項。
文本框控件與成員變量相關聯
1.創建一個對話框,并在對話框上放一個文本框
2.右鍵文本框添加添加變量,類別為Value,變量類型int,變量名m_edit;
3.再添加2個編輯框控件,并與成員變量關聯,方法同上
4.在按鈕的方法中寫下如下代碼:
void CTestDlg::OnBnClickedButton1()
{
UpdateData(TRUE); //開始獲取對話框中的數據
m_edit3 = m_edit1 + m_edit2;
UpdateData(FALSE); //用變量的值來初始化對話框控件
}
對話框伸縮功能
1. 用圖像控件在對話框的底部畫出一條分割線。
2. 改變圖像控件的ID,stytle屬性設為向下凹陷。
3. 代碼如下:
CString str;
if (GetDlgItemText(IDC_BUTTON1, str), str == TEXT("收縮<<"))
{
SetDlgItemText(IDC_BUTTON1, TEXT("展開>>"));
}
else
{
SetDlgItemText(IDC_BUTTON1, TEXT("收縮<<"));
}
static CRect rectBig;
static CRect rectSmall;
if (rectBig.IsRectNull())
{
CRect rectTemp;
GetWindowRect(rectBig);
GetDlgItem(IDC_SEPERATOR)->GetWindowRect(rectTemp);
rectSmall.left = rectBig.left;
rectSmall.top = rectBig.top;
rectSmall.right = rectBig.right;
rectSmall.bottom = rectTemp.bottom;
}
if (str == TEXT("收縮<<"))
{
SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(),
SWP_NOMOVE | SWP_NOZORDER);
}
else
{
SetWindowPos(NULL, 0, 0, rectBig.Width(), rectBig.Height(),
SWP_NOMOVE | SWP_NOZORDER);
}
修改控件的窗口過程
要改變窗口的屬性,我們可以調用如下函數:
LONG SetWindowLong(
HWND hWnd, // 指定想要改變屬性的窗口的句柄
int nIndex, // 指定要設置的屬性值的偏移地址
LONG dwNewLong // 新的窗口過程函數地址
);
當hWnd參數指定的是一個對話框,那么nIndex參數就可以可以取值為DWL_DLGRROC,利用這個參數,我們就可以設置新的對話框過程。
例如:
首先在cpp文件的開頭
WNDPROC prevProc;
LRESULT CALLBACK EditNewProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
if (uMsg == WM_CHAR && wParam == 0x0d)
{
::SetFocus(GetNextWindow(hwnd, GW_HWNDNEXT));
return 1;
}
else
{
return prevProc(hwnd, uMsg, wParam, lParam);
}
}
在程序運行時,當對話框及其上子控件創建完成,將要顯示之前會發送一個消息:WM_INITDIALOG。因此,我們可以再此消息的響應函數中修改控件的窗口過程。
例如:
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (LONG)EditNewProc);
return TRUE;
}
輸入焦點的傳遞
在MFC中,默認情況下,當在對話框窗口中按下回車鍵時,會調用對話框的默認按鈕的響應函數。我們可以利用這個特性,使焦點依次向下傳遞。
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
GetNextDlgTabItem(GetFocus())->SetFocus();
// CDialog::OnOK(); //把這句注釋起來,否者會調用基類的OnOk函數。
}
編輯TAB順序:
1. 在資源編輯器中選中要排序的對話框
2. 在菜單中選擇布局
3. TAB順序
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成