當前位置:編程學習大全網 - 編程語言 - MFC 中關於Edit控件問題

MFC 中關於Edit控件問題

控件可以動態創建

具體思路如下:

先在妳的對話框類中添加壹個CPtrArray對象,如CPtrArray m_ptr;它是壹個鏈表類,用於保存動態創建的Edit控件的地址,以便程序結束時銷毀所有動態創建的Edit控件,否則會造成內存泄露。

然後添加動態創建Edit控件的代碼,示例如下:

void CMyDlg::OnAddEdit()

{ int n=m_ptr.GetSize();

CEdit* pEdit=NULL;

pEdit=new CEdit;

pEdit->Create(WS_VISIBLE | WS_CHILD,CRect //A(0,0,25,25),this,ID_MYEDIT+n);

pEdit->ShowWindow(SW_SHOW); //B

if(pEdit!=NULL)

m_ptr.Add((void*)pEdit);

}

上面的代碼很簡單,首先聲明壹個CEdit指針變量,然後對其進行new運算(這些最基本的應該知道吧),然後用該變量創建壹個Edit控件,這裏把A行Create的幾個參數介紹壹下,第壹個參數是窗口風格,Edit控件作為對話框的子窗口,所以必須包含WS_VISIBLE 和WS_CHILD兩個風格,另外,如果想讓Edit控件有水平和豎直滾動條的話,可以添加WS_VSCROLL和WS_HSCROLL兩個風格屬性,最好還添加壹個ES_MULTILINE屬性,這樣編輯控件支持多行顯示; 第二個參數是Edit控件在其父窗口的位置和大小,是壹個CRect類對象,第三個參數是其父窗口指針,這裏用this,第四個是控件ID,這裏需要在消息函數外定義壹個宏,如#define ID_MYEDIT 19874;每個Edit控件創建後ID都是不同的(自己分析); 最後將指向新創建的Edit控件的指針添加到m_ptr列表中。

B行為了讓Edit控件在創建後立即顯示。該函數可以把CRect對象作為參數,然後傳遞到A行的Create函數裏面,這樣想把Edit控件創建在哪兒都可以。

最後在對話框的析構函數中釋放所有創建的Edit控件的內存,

CMyDlg::~CMyDlg()

{

int n=m_ptr.GetSize();

for(int i=0;i<n;i++)

{

CEdit* pEdit=(CEdit*)m_ptr.GetAt(i);

pEdit->DestroyWindow();

delete pEdit;

pEdit=NULL;

}

m_ptr.RemoveAll();

}

如果在對話框中直接添加消息函數的話,由於事先不知道到底有幾個Edit控件,也不知道每個Edit控件的ID是多少,響應消息時很容易出錯。 要響應雙擊消息的話我建議妳自己從CEdit派生壹個CMyEdit子類,然後在子類中具體實現,有壹點麻煩,但是只要妳派生好了壹個子類,以後編程時可以直接使用,非常方便,而且不易出錯。不過代碼有點長,這裏說不清楚。有誰想了解具體如何實現可以把妳的郵箱發給我,我寫好後給妳發過去。

具體的細節可以在百度或百度百科上搜索,或參考MSDN

順便提供壹個MSDN下載地址:/soft/program/DN60ACHS1.rar

/soft/program/DN60ACHS2.rar

有兩個CD,速度應該很快。

有什麽VC++問題可以問我,大家壹起討論討論

完整說明如下:

根據妳的要求寫了壹個類似的程序

首先從CEdit類派生壹個子類CMyEdit,在文件MyEdit.h和MyEdit.cpp中,該類只重載了鼠標單擊和雙擊的消息函數,在雙擊消息函數中,首先讓編輯框獲得輸入焦點(這壹句可以不要),然後向它的父窗口發送NM_MYDBLCLK消息,並且把發送消息的編輯框的窗口指針傳遞給父窗口用於識別消息到底是誰發送的,NM_MYDBLCLK的定義在MyEdit.h"的開頭,其實它就是壹個消息ID,即壹個整數。

然後再說說Dlg類,在對話框類的頭文件中添加包含語句:#include "MyEdit.h" .在對話框類中添加壹個CPtrArray對象,如CPtrArray m_ptr;它是壹個鏈表類,用於保存動態創建的Edit控件的地址,以便程序結束時銷毀所有動態創建的Edit控件,否則會造成內存泄露。

然後添加動態創建Edit控件的代碼,示例如下:

void CEditTestDlg::AddEdit(CRect rc)

{

int n=m_ptr.GetSize();

CMyEdit* pEdit=NULL;

pEdit=new CMyEdit;

ASSERT(pEdit->Create(WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE,rc,this,ID_MYEDIT+n));

pEdit->ShowWindow(SW_SHOW);

m_ptr.Add((void*)pEdit);

}

再添加壹個按鈕並添加該按鈕的響應消息函數,在該函數中調用AddEdit函數添加Edit控件

void CEditTestDlg::OnButton1()

{

// TODO: Add your control notification handler code here

CRect rc(0,0,340,120);

AddEdit(rc);

}

此時單擊該按鈕就能看見創建的Edit控件了,為了不造成內存泄露,還要添加對話框的析構函數如下:

CEditTestDlg::~CEditTestDlg()

{

int n=m_ptr.GetSize();

for(int i=0;i<n;i++)

{

CMyEdit* pEdit=(CMyEdit*)m_ptr.GetAt(i);

pEdit->DestroyWindow();

delete pEdit;

pEdit=NULL;

}

m_ptr.RemoveAll();

}

為了響應雙擊Edit消息,在對話框類中作如下修改:

1、在對話框類的頭文件中添加消息函數聲明: afx_msg void OnEditDblClk(WPARAM wParam, LPARAM lParam);

2、在對話框類的cpp文件中添加該消息函數的消息映射 ON_MESSAGE(NM_MYDBLCLK, OnEditDblClk)

3、添加雙擊消息函數的實現代碼入下:

void CEditTestDlg::OnEditDblClk(WPARAM wParam, LPARAM lParam)

{

CMyEdit* pEdit=(CMyEdit*)lParam;

if(pEdit!=NULL)

{

AfxMessageBox("雙擊了Edit控件!");

}

pEdit->SetWindowText("雙擊了Edit控件!");

}

這裏只是壹個實例,雙擊Edit控件後到底要做什麽,妳自己可以修改。

大概就是這樣,其實其他控件妳也可以這樣做,例如按鈕控件等等,這樣就可以做出自己別具壹格的控件

有什麽問題可以再問我

  • 上一篇:書單丨看書的意義在於通過別人的經歷來提醒自己
  • 下一篇:懂得來! 坦克世界裏面的AP、APCR、HEAT彈。這三種炮彈各個的屬性相比? 另外炮彈的AP轉正
  • copyright 2024編程學習大全網