2014-04-07 19 views
0

我想將簡單的Cedit添加到CWnd的派生GUI類中。這個類是簡單的容器,並且像MFC中的Panel一樣對待。在類的構造函數中,在類中添加簡單的CEdit實例。 但是當我在客戶端對話框中實例化面板時,面板顯示但按鈕不顯示,爲什麼它不顯示。 面板代碼爲什麼子控件不會出現在MFC派生的CWnd中

面板頭文件

#pragma once 
#include "afxwin.h" 
class CPanel : 
public CWnd 
{ 
public: 
CPanel(void); 
~CPanel(void); 

virtual void PreSubclassWindow(); 
virtual void DoDataExchange(CDataExchange* pDX); 
CEdit *txt; 
DECLARE_MESSAGE_MAP() 

};

面板源文件

#include "stdafx.h" 
#include "Panel.h" 


CPanel::CPanel(void) 
{ 
WNDCLASS wndcls; 
HINSTANCE hins=AfxGetInstanceHandle(); 
if(!(::GetClassInfo(hins,_T("CPanelCtrl"),&wndcls))){ 
    wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; 
    wndcls.lpfnWndProc=::DefWindowProc; 
    wndcls.cbClsExtra=wndcls.cbWndExtra=0; 
    wndcls.hInstance=hins; 
    wndcls.hIcon=NULL; 
    wndcls.hCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS ); 
    wndcls.hbrBackground=(HBRUSH)(COLOR_3DFACE+13); 
    wndcls.lpszMenuName=NULL; 
    wndcls.lpszClassName=_T("CPanelCtrl"); 

    txt=new CEdit(); 
    txt->Create(ES_PASSWORD,CRect(10,10,25,35),this,1); 

    if (!AfxRegisterClass(&wndcls)) 
    { 
     AfxThrowResourceException(); 
     return; 
    } 
    else{ 

     return; 
    } 

} 
} 


CPanel::~CPanel(void) 
{ 
} 


void CPanel::PreSubclassWindow() 
{ 
// TODO: Add your specialized code here and/or call the base class 

CWnd::PreSubclassWindow(); 
} 


void CPanel::DoDataExchange(CDataExchange* pDX) 
{ 
// TODO: Add your specialized code here and/or call the base class 

CWnd::DoDataExchange(pDX); 
} 
BEGIN_MESSAGE_MAP(CPanel, CWnd) 
END_MESSAGE_MAP() 

在在OnInitDialog方法對話框我不喜歡這樣

panel=new CPanel(); 
panel->Create(L"CPanelCtrl",L"Hello ", WS_VISIBLE , CRect(70, 70, 400, 200), this, 1); 

回答

0

兩個提示:

第一:你分配給你的CEdit的ID,以相同CPanel:1.

其次:你在CPanel構造函數裏面創建CEdit,我wou ld嘗試在CPanel WM_CREATE處理程序中創建它,因爲CPanel的構造函數HWND尚未分配。

+0

這沒關係。據我瞭解,編輯控件應該是面板內的成員(孩子)。 – xMRi

+0

@xMRi它仍然需要一個有效的父HWND – marcinj

+0

是的......但我沒有寫一些不同的東西... – xMRi

0
  1. 您的代碼創建編輯控件只運行一次,因爲在註冊窗口類之後,編輯控件永遠不會被創建。
  2. 創建父窗口時無法創建子窗口。
  3. 在父級的WM_CREATE處理程序中創建子窗口。
  4. 如果你總是有一個編輯控件,你爲什麼要用它的指針。只需創建一個簡單的成員。
  5. 如果編輯控件位於面板內,則應使用WS_CHILD。
+0

thnx所有。你是對的。我應該處理WM_CREATE。通過處理它,一切工作正常 – user3184427

相關問題