powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пользовательский элемент управления на основе диалога
5 сообщений из 5, страница 1 из 1
Пользовательский элемент управления на основе диалога
    #34916908
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу прогу на MSVC6.0, MFC.
Научился писать свои элементы управления след образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
LRESULT CALLBACK MyCtrlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

class CMyCtrl : public CWnd
{
...
     static BOOL RegisterWndClass(HINSTANCE hInstance);
...
};

//в cpp-файле
LRESULT CALLBACK MyCtrlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
	if(pWnd==NULL){
		pWnd = new CMyCtrl();
		pWnd->Attach(hWnd);
	}
	ASSERT(pWnd->m_hWnd == hWnd);
	ASSERT(pWnd == CWnd::FromHandlePermanent(hWnd));

	return AfxCallWndProc(pWnd,hWnd,message,wParam,lParam);
}


BOOL CMyCtrl::RegisterWndClass(HINSTANCE hInstance)
{
	WNDCLASS wc;
	wc.lpszClassName = "MyControl";
	wc.hInstance = hInstance;
	wc.lpfnWndProc = MyCtrlWndProc;
	wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
	wc.hIcon =  0 ;
	wc.lpszMenuName=NULL;
	wc.hbrBackground = (HBRUSH)::GetStockObject(LTGRAY_BRUSH);
	wc.style = CS_GLOBALCLASS;
	wc.cbClsExtra = 0 ;
	wc.cbWndExtra = 0 ;
	return (::RegisterClass(&wc)!= 0 );
}
//в CMyApp::InitInstance()
CMyCtrl::RegitserWndClass(AfxGetInstanceHandle());
потом в диалоговом окне создаю Custom Control, пишу, что его класс - MyControl и радуюсь жизни.

Теперь хочу написать более сложный элемент управления, включающий в себя несколько кнопок, ползунок и т.д. Проблема в том, что не понятно, как добавить это в созданный таким образом собственный элемент управления чтобы не переписывать всю реализацию нажатия на кнопку, перемещения ползунка и т.д. Но все это легко реализовать в каком-нибудь диалоге. Вопрос в том, можно ли на основе диалога создать свой элемент управления или как-то включить в CMyCtrl несколько стандартных элементов управления(т.е., например, добавить в CMyCtrl член типа CButton и как-то им пользоваться - т.е. чтобы он автоматически рисовался, чтобы удобно было отрабатывать нажатия на кнопку и т.д.). Заранее спасибо за помощь.
...
Рейтинг: 0 / 0
Пользовательский элемент управления на основе диалога
    #34917099
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slip
Теперь хочу написать более сложный элемент управления, включающий в себя несколько кнопок, ползунок и т.д. Проблема в том, что не понятно, как добавить это в созданный таким образом собственный элемент управления чтобы не переписывать всю реализацию нажатия на кнопку, перемещения ползунка и т.д. Но все это легко реализовать в каком-нибудь диалоге. Вопрос в том, можно ли на основе диалога создать свой элемент управления или как-то включить в CMyCtrl несколько стандартных элементов управления(т.е., например, добавить в CMyCtrl член типа CButton и как-то им пользоваться - т.е. чтобы он автоматически рисовался, чтобы удобно было отрабатывать нажатия на кнопку и т.д.). Заранее спасибо за помощь.
Для сложного элемента управления все его дочерние компоненты, каковыми будут все кнопки и ползунок, необходимо создавать динамически

например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class MyComplexControl : public CMyWnd
{
// в конструкторе их проинициализируй NULL, значения присвоишь в Create
CMyButton* pBtn1, *pBtn2;
CMyProgressCtrl* pPrgs;

virtual bool Create(....);

};

bool CMyComplexControl::Create(...)
{
// !! обязательно указать что CMyComplexControl родительский по отношению к кнопкам и другим 
// входящим в его состав контролов, которые должны быть созданы со стилем WS_CHILD

pBtn1 = new CMyButton(...);

// размещаем как надо
SetWindowPos();
и т.д.
}
...
Рейтинг: 0 / 0
Пользовательский элемент управления на основе диалога
    #34917129
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum
Для сложного элемента управления все его дочерние компоненты, каковыми будут все кнопки и ползунок, необходимо создавать динамически


Да, это я понимаю, но тогда и сам элемент управления нужно будет создавать динамически... хотя я не понимаю почему. Например, пишу так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
//MyControl.h

LRESULT CALLBACK MyControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

/////////////////////////////////////////////////////////////////////////////
// CMyControl window

class CMyControl : public CWnd
{
// Construction
public:
	CMyControl();
	static BOOL RegisterWndClass(HINSTANCE hInstance);
// Attributes
public:
            CButton* pBt;

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMyControl)
	public:
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CMyControl();

	// Generated message map functions
protected:
	//{{AFX_CMyControl
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//MyControl.cpp

LRESULT CALLBACK MyControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{...}

/////////////////////////////////////////////////////////////////////////////
// CMyControl

BOOL CMyControl::RegisterWndClass(HINSTANCE hInstance)
{...}


CMyControl::CMyControl():pBt(new CButton()){}

CMyControl::~CMyControl(){ delete pBt;}


BEGIN_MESSAGE_MAP(CMyControl, CWnd)
	//{{AFX_MSG_MAP(CMyControl)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMyControl message handlers

BOOL CMyControl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	pBt->Create("Button", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,rect,this,nID+ 1 );
	
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
, создаю в диалоге Custom Control этого типа и выходит, что Create не вызывается (ну т.е. говорю Debugger'у Rut to Cursor и ставлю курсор внутри Create, прога выполняется до конца, а управление так и не приходит в Create)...
...
Рейтинг: 0 / 0
Пользовательский элемент управления на основе диалога
    #34917153
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create ты должен дернуть сам, new ничего не знает о твоем create
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
Пользовательский элемент управления на основе диалога
    #34917164
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, понятно, просто в Create не надо вызывать CWnd::Create... тогда вроде бы все получается... Спасибо!!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пользовательский элемент управления на основе диалога
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]