MFC中按鈕控制項的用法筆記

來源:互聯網
上載者:User

標籤:使用   os   io   strong   檔案   資料   for   ar   

VC學習筆記1:按鈕的使能與禁止

用ClassWizard的Member Variables為按鈕定義變數,如:m_Button1;
則
m_Button1.EnableWindow(true); 使按鈕處於允許狀態
m_Button1.EnableWindow(false); 使按鈕被禁止,並變灰顯示


VC學習筆記2:控制項的隱藏與顯示

用CWnd類的函數BOOL ShowWindow(int nCmdShow)可以隱藏或顯示一個控制項。

例1:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );     //擷取控制項指標,IDC_EDIT為控制項ID號
pWnd->ShowWindow( SW_HIDE );     //隱藏控制項

例2:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );     //擷取控制項指標,IDC_EDIT為控制項ID號
pWnd->ShowWindow( SW_SHOW );     //顯示控制項

以上方法常用於動態產生控制項,雖說用控制項的Create函數可以動態產生控制項,但這種控制項很不好控制,所以用隱藏、顯示方法不失為一種替代手段。


VC學習筆記3:改變控制項的大小和位置

用CWnd類的函數MoveWindow()或SetWindowPos()可以改變控制項的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一種用法需給出控制項新的座標和寬度、高度;
第二種用法給出存放位置的CRect對象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );     //擷取控制項指標,IDC_EDIT1為控制項ID號
pWnd->MoveWindow( CRect(0,0,100,100) );     //在視窗左上方顯示一個寬100、高100的編輯控制項

SetWindowPos()函數使用更靈活,多用於只修改控制項位置而大小不變或只修改大小而位置不變的情況:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一個參數我不會用,一般設為NULL;
x、y控制項位置;cx、cy控制項寬度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一個參數;
SWP_NOMOVE:忽略x、y,維持位置不變;
SWP_NOSIZE:忽略cx、cy,維持大小不變;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_BUTTON1 );     //擷取控制項指標,IDC_BUTTON1為控制項ID號
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );     //把按鈕移到視窗的(50,80)處
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );     //把編輯控制項的大小設為(100,80),位置不變
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );     //編輯控制項的大小和位置都改變
以上方法也適用於各種視窗。


VC學習筆記4:什麼時候設定視中控制項的初始尺寸?

我在CFormView的視中加入了一個編輯控制項,在運行時使它充滿客戶區,當視窗改變大小時它也跟著改變。
改變控制項尺寸可以放在OnDraw()函數中,也可放在CalcWindowRect()函數中,當視窗尺寸發生變化時,它們都將被執行,且CalcWindowRect()函數先於OnDraw()函數,下例是在CalcWindowRect()函數中修改控制項尺寸。
重載VIEW類的CalcWindowRect函數,把設定控制項的尺寸的語句加入這個函數中。
例:
void CMyEditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
     // TODO: Add your specialized code here and/or call the base class

     CFrameWnd *pFrameWnd=GetParentFrame(); //擷取架構視窗指標

     CRect rect;
     pFrameWnd->GetClientRect(&rect); //擷取客戶區尺寸

     CWnd *pEditWnd=GetDlgItem(IDC_MYEDIT); //擷取編輯控制項指標,IDC_MYEDIT為控制項ID號
     pEditWnd->SetWindowPos(NULL,0,0,rect.right,rect.bottom-50,SWP_NOMOVE | SWP_NOZORDER); //設定控制項尺寸,bottom-50是為了讓出狀態條位置。

     CFormView::CalcWindowRect(lpClientRect, nAdjustType);
}


VC學習筆記5:選項按鈕控制項(Ridio Button)的使用

一、對選項按鈕進行分組:
每組的第一個選項按鈕設定屬性:Group,Tabstop,Auto;其餘按鈕設定屬性Tabstop,Auto。

如:
Ridio1、Ridio2、Ridio3為一組,Ridio4、Ridio5為一組

設定Ridio1屬性:Group,Tabstop,Auto
設定Ridio2屬性:Tabstop,Auto
設定Ridio3屬性:Tabstop,Auto

設定Ridio4屬性:Group,Tabstop,Auto
設定Ridio5屬性:Tabstop,Auto

二、用ClassWizard為單選控制項定義變數,每組只能定義一個。如:m_Ridio1、m_Ridio4。

三、用ClassWizard產生各選項按鈕的單擊訊息函數,並加入內容:

void CWEditView::OnRadio1() 
{
     m_Ridio1 = 0;     //第一個選項按鈕被選中
}

void CWEditView::OnRadio2() 
{
     m_Ridio1 = 1;     //第二個選項按鈕被選中
}

void CWEditView::OnRadio3() 
{
     m_Ridio1 = 2;     //第三個選項按鈕被選中
}

void CWEditView::OnRadio4() 
{
     m_Ridio4 = 0;     //第四個選項按鈕被選中
}

void CWEditView::OnRadio5() 
{
     m_Ridio4 = 1;     //第五個選項按鈕被選中
}

四、設定預設按鈕:
在定義控制項變數時,ClassWizard在建構函式中會把變數初值設為-1,只需把它改為其它值即可。
如:
//{{AFX_DATA_INIT(CWEditView)
m_Ridio1 = 0;     //初始時第一個選項按鈕被選中
m_Ridio4 = 0;     //初始時第四個選項按鈕被選中
//}}AFX_DATA_INIT


VC學習筆記6:旋轉控制項(Spin)的使用

當單擊旋轉控制項上的按鈕時,相應的編輯控制項值會增大或減小。其設定的一般步驟為:
一、在對話方塊中放入一個Spin控制項和一個編輯控制項作為Spin控制項的夥伴視窗,
設定Spin控制項屬性:Auto buddy、Set buddy integer、Arrow keys
設定文本控制項屬性:Number

二、用ClassWizard為Spin控制項定義變數m_Spin,為編輯控制項定義變數m_Edit,定義時注意要把m_Edit設定為int型。

三、在對話方塊的OnInitDialog()函數中加入語句:
BOOL CMyDlg::OnInitDialog() 
{
     CDialog::OnInitDialog();
    
     m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) );     //設定編輯控制項為Spin控制項的夥伴視窗
     m_Spin.SetRange( 0, 10 );     //設定資料範圍為0-10
     return TRUE;
}

四、用ClassWizard為編輯控制項添加EN_CHANGE訊息處理函數,再加入語句:
void CMyDlg::OnChangeEdit1() 
{
     m_Edit = m_Spin.GetPos();     //擷取Spin控制項當前值
}

OK!


VC學習筆記7:程式結束時儲存檔案問題

在文檔-視圖結構中,用序列化自動儲存檔案在各種VC書上都有介紹。現在的問題是我不使用序列化,而是自己動手儲存,當點擊視窗的關閉按鈕時,如何提示並儲存文檔。

用ClassWizard在文檔類(CxxDoc)中添加函數CanCloseFrame(),再在其中加入儲存檔案的語句就可以了。
註:要儲存的資料應放在文檔類(CxxDoc)或應用程式類(CxxApp)中,不要放在視圖類中。

例:
//退出程式
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) 
{
     CFile file;
     if(b_Flag)     //b_Flag為文檔修改標誌,在修改文檔時將其置為True
     {
         int t;
         t=::MessageBox(NULL,"文字已經改變,要存檔嗎?","警告",
                 MB_YESNOCANCEL | MB_ICONWARNING);     //彈出提示對話方塊
         if(t==0 || t==IDCANCEL)
             return false;
         if(t==IDYES)
         {
             CString sFilter="Text File(*.txt)|*.txt||";
             CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL);     //定製檔案對話方塊

             int k=m_Dlg.DoModal();     //彈出檔案對話方塊
             if(k==IDCANCEL || k==0)
                 return false;
             m_PathName=m_Dlg.GetPathName();     //擷取選擇的檔案路徑名
            
             file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);
             file.Write(m_Text,m_TextLen);     //資料寫入檔案
             file.Close();
         }
     }
     return CDocument::CanCloseFrame(pFrame);
}


VC學習筆記8:UpdateData()

對於可以接收資料的控制項,如編輯控制項來說,UpdateData()函數至關重要。當控制項內容發生變化時,對應的控制項變數的值並沒有跟著變化,同樣,當控制項變數值變化時,控制項內容也不會跟著變。
UpdateData()函數就是解決這個問題的。

UpdateData(true);把控制項內容裝入控制項變數
UpdateData(false);用控制項變數的值更新控制項

如:有編輯控制項IDC_EDIT1,對應的變數為字串m_Edit1,
1、修改變數值並顯示在控制項中:
m_Edit1 = _T("結果為50");
UpdateData(false);
2、讀取控制項的值到變數中:
用ClassWizard為IDC_EDIT1添加EN_CHANGE訊息處理函數,
void CEditView::OnChangeEdit1()
{
     UpdateData(true);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.