1. 程式人生 > >c++ MFC筆記008 對話框+動態創建按鈕+Edit Control+Static Text

c++ MFC筆記008 對話框+動態創建按鈕+Edit Control+Static Text

buffer oge 輸入 列表 菜單 返回 lpar -a clas

一 創建對話框

  資源視圖->Dialog->右鍵->插入Dialog 默認生成一個ID:IDD_DIALOG1的對話框,在生成的IDD_DIALOG1上雙擊打開編輯。在對話框編輯區任意位置按右鍵->添加類(也可以通過[項目]->[添加類])。這兩種方式默認狀態下, 對話框:IDD_DIALOG1,基類:CDialogEx。此時填寫類名:CFstDlg,它會自動生成去了字母C的頭文件和源文件(名字都可以改,一般默認就可以,除非沖突)。

技術分享圖片

  在資源視圖中Menu雙擊 IDR_MAINFRAME菜單,在幫助後面添加一個菜單項,直接輸入打開對話框1

,選中它右鍵->屬性,將Popup的值改為False,雜項中ID那裏輸入:IDM_OPENDIL1。再次在剛增加的菜單上右鍵->添加處理程序->消息類型:COMMAND 類列表選擇:xxxView,函數處理程序用默認的:OnOpenDlg1之後添加編輯:

技術分享圖片

  在OnOpenDlg1中添加如下代碼: 先包含 #include "FstDlg.h"

CFstDlg dlg1;
void CMFCDLGView::OnOpendlg1()
{
    /*模式窗口方式*/
    CFstDlg dlg;        
//用剛才增加的類CFstDlg 創建一個對象 dlg.DoModal(); //用模式窗口方式顯示該對話框 //dlg.EndDialog(); 關閉模式窗口用 //單擊了OK才會執行到下面 /*非模式窗口方式*/ //CFstDlg dlg1; //定義在類外,否則,執行完就自動析構了 dlg1.Create(IDD_DIALOG1,this); //非模式窗口的創建 dlg1.ShowWindow(SW_SHOW); //非模式窗口的顯示
//dlg1.DestroyWindow(); 實現真正的銷毀對象
//單擊OK,只是隱藏了,但並沒有銷毀對象,要實現按OK銷毀它,需要重寫OnOK,並在OnOK中調用DestroyWindow();
}

  運行程序,可以單擊添加的菜單,可以打開該對話框窗口了。

  當需要按一個按鈕之後在對話框中動態的增加一個按鈕時:在要彈處的對話框裏面,添加一個按鈕,修改IDCaption屬性,之後右鍵->添加處理程序->消息類型:BN_CLICKED,函數處理程序名:默認的就可以了,之後添加編輯按鈕->轉到代碼區

    if(!m_btnAdd)
    { 
        m_btnAdd.Create(L"我是動態創建出來的按鈕", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11);
    }
    else
    {
        MessageBox(L"對象已存在");
    }

對話框中的子窗口獲取需要用GetDlgItem()

二 CEdit控件值的獲取、設置、選中狀態

  一個CEdit可以關聯多個變量,變量類別:Control類 Value類

  直接使用項目->類向導添加關聯變量時,類名:要添加的關聯控件變量所在的對話框類;需要選中 [ ]控件變量復選框勾選,切換到成員變量類別中選擇:ControlValue

資源視圖上,選中要創建變量的控件,再右鍵->添加變量->打開一個對話框:添加成員變量向導->勾選控件變量->類別:Control/Value 變量名:m_xxx; 也可以右鍵->類向導->成員變量

關聯控件的成員變量在 .h文件中跟普通的沒啥區別:在CPP文件中主要區別在如下這段代碼:

//由Frame調用,帶有數據校驗功能,不直接調用,而是要通過調用UpdateData()方法來實現對它的調用
void CFstDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_Edit1);         //CEdit控件關聯  private CEdit m_Edit1變量
    DDX_Control(pDX, IDC_EDIT2, m_Edit2); 
    DDX_Control(pDX, IDC_EDIT3, m_Edit3);
    DDX_Text(pDX, IDC_EDIT1, m_num1);            //CEdit控件關聯  private int m_num1變量
    DDV_MinMaxInt(pDX, m_num1, -1000, 100000);   //帶校驗功能 Dlg Data Validate
    DDX_Text(pDX, IDC_EDIT2, m_num2);
    DDX_Text(pDX, IDC_EDIT3, m_num3);
}

CEdit值的獲取、設置、選中狀態測試代碼如下:

void CFstDlg::OnBnClickedBtnAdd()
{
    //if(!m_btnAdd)
    //{ 
    //    m_btnAdd.Create(L"我是動態創建出來的按鈕", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0, 0, 260, 60), this, 0xf11);
    //}
    //else
    //{
    //    MessageBox(L"對象已存在");
    //}

    /*方法1*/
    //int num1, num2, num3;
    ////char ch1[10], ch2[10], ch3[10];
    //CString cs1, cs2, cs3;
    //GetDlgItem(IDC_EDIT1)->GetWindowTextW(cs1);
    //GetDlgItem(IDC_EDIT2)->GetWindowTextW(cs2);
    //USES_CONVERSION;
    //num1=atoi(T2A(cs1.GetBuffer()));
    //num2 = atoi(T2A(cs2.GetBuffer()));
    //num3 = num1 + num2;
    //char* temp=new char[10];
    //itoa(num3, temp, 10);//第三個參數表示10進制
    //CString css(temp);
    //GetDlgItem(IDC_EDIT3)->SetWindowText(css);
    //delete[] temp;

    /*方法2 S/GetDlgItemText 文本轉數字*/
    //int num1_1, num2_2, num3_3;
    //CString cs_num1, cs_num2, cs_num3;
    //GetDlgItemText(IDC_EDIT1, cs_num1);
    //GetDlgItemText(IDC_EDIT1, cs_num2);
    //USES_CONVERSION;
    //num1_1 = atoi(T2A(cs_num1.GetBuffer()));
    //num2_2 = atoi(T2A(cs_num2.GetBuffer()));
    //num3_3 = num1_1 + num2_2;
    //char* temp1 = new char[10];
    //itoa(num3_3, temp1, 10);//第三個參數表示10進制
    //CString cs_result(temp1);
    //SetDlgItemText(IDC_EDIT3, cs_result);
    //delete[] temp1;

    /*方法3 G/SetDlgItemInt()*/
    //int num11, num12, num13;
    //num11=GetDlgItemInt(IDC_EDIT1);
    //num12 = GetDlgItemInt(IDC_EDIT2);
    //num13 = num12+ num11;
    //SetDlgItemInt(IDC_EDIT3, num13);

    /*方法4 編輯框控件關聯int變量法------最簡單的一種*/
    //UpdateData(); //參數:bSaveAndValidate  TRUE 返回一個非零值表示成功 返回FALSE 表示正在初始化
    //m_num3 = m_num1 + m_num2;
    //UpdateData(FALSE); //需要再次調用,否則控件不會有值,意思就是讓控件重新初始化

    /*方法5 編輯框控件關聯編輯框變量 使用控件自身的G/SetWindowTextW()*/
    //CString cs_ctrl1, cs_ctrl2, cs_ctrl3;
    //m_Edit1.GetWindowTextW(cs_ctrl1);
    //m_Edit2.GetWindowTextW(cs_ctrl2);
    //m_Edit3.GetWindowTextW(cs_ctrl3);

    /*方法6 利用消息 WM_GETTEXT/WM_GETTEXT*/
    //int a, b, c;
    //wchar_t ch1[10], ch2[10], ch3[10];
    ////控件發送消息的4種方式
    //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //第三個參數,指示要拷貝的字符數,第四個LParam 文本Buffer
    //::SendMessage(m_Edit1.m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1);                //由於關聯了控件變量    
    //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT, 10, (LPARAM)ch1);        //直接用CWnd的成員函數
    //m_Edit1.SendMessageW(WM_GETTEXT,10, (LPARAM)ch1);                        //用控件自身的SendMessage
    //m_Edit2.SendMessageW(WM_GETTEXT,10, (LPARAM)ch2);
    //a = _wtoi(ch1);
    //b = _wtoi(ch2);
    //c = a + b;
    //_itow(c, ch3, 10);
    //SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 10, (LPARAM)ch3);


    /*方法7 */
    int a, b, c;
    wchar_t ch1[10], ch2[10], ch3[10];
    SendDlgItemMessageW(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1);
    SendDlgItemMessageW(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2);
    a = _wtoi(ch1);   //W 寬字符 atoi()會得不到想要的結果
    b = _wtoi(ch2);
    c = a + b;
    _itow(c,ch3,10);
    SendDlgItemMessageW(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3); //VS2015裏 第三個參數設置為10000也沒問題,負數也沒影響

    /*設置選中文本狀態 EM_SETSEL*/
    SendDlgItemMessageW(IDC_EDIT3, EM_SETSEL,1,3L); //第三個參數開始:0,結尾:-1 它將實現全選功能
    m_Edit3.SetFocus(); //需要設置焦點

}

c++ MFC筆記008 對話框+動態創建按鈕+Edit Control+Static Text