#define IDC_MY_STATIC 101;
CStatic* myStatic;
myStatic = new CStatic;
myStatic->Create("myStatic",WS_CHILD|WS_VISIBLE|SS_NOTIFY,
CRect(0,0,10,10),this,IDC_MY_STATIC);
События для StaticText
Как создать событие OnLButtonDown для StaticNext в MFC?
Так вот собственно как вариант, отнаследуй например класс от CStratic и в нем отлавливай сообщение WM_LBUTTONDOWN. И обрабатывай его.
4 aks. Если можно, поподробнее с наследованием класса от CStatic.
class CStaticEx : public CStatic{
...
};
А дальше переопределяем что нужно, ставим свои обработчики сообщений и в нужном месте создаем объект и вызываем у него Create(...)
надо просто выставить свойство Notify в TRUE
Чтобы обрабатывать уведомления о кликах, в производном классе нужно переопределить функцию OnParentNotify (). Так что ли?
Код:
Тогда в MESSAGE_MAP
Код:
ON_BN_CLICKED(IDC_MY_STATIC, OnMyStatic)
Если работаешь с конструктором диалога, то в свойствах твоего static на закладке Styles поставь флаг Notify и обзови сам элемент например IDC_MY_STATIC Потом через Class Wizard для этого элемента создай функцию для сообщения BN_CLICKED
Но с производным классом лучше идея.
Код:
class CStaticEx: public CStatic {
public:
afx_msg void OnLButtonDown(UINT, CPoint);
private:
DECLARE_MESSAGE_MAP()
};
void CStaticEx::OnLButtonDown(UINT, CPoint) {
// тут делаешь что тебе надо
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP
public:
afx_msg void OnLButtonDown(UINT, CPoint);
private:
DECLARE_MESSAGE_MAP()
};
void CStaticEx::OnLButtonDown(UINT, CPoint) {
// тут делаешь что тебе надо
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP
только создавать в таком случае лучше вручную, а не через конструктор, аналогично можно обрабатывать и другие сообщения
http://www.firststeps.ru/mfc/steps/r.php?4 здесь сделано аналогично, но не с CStatic а с кнопкой CButton
4 koric. В производном классе переопределять придется не только OnLButtonDown но и как минимум Create, а также конструктор и деструктор. А вот какие еще надо переопределить функции? Или для корректной работы достаточно только этих?
Код:
#include "afxwin.h"
#define IDC_MY_STATIC 101
class CStaticEx: public CStatic {
public:
afx_msg void OnLButtonDown(UINT, CPoint);
private:
DECLARE_MESSAGE_MAP()
};
afx_msg void CStaticEx::OnLButtonDown(UINT, CPoint)
{
//обработка события
MessageBox("Ура, работает!","Заголовок",MB_OK|MB_ICONEXCLAMATION);
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
//описание класса окна или чего-либо ещё
class CMainFrame: public CFrameWnd {
public:
CMainFrame(); //конструктор окна
~CMainFrame();
//...
private
CStaticEx* MyStatic;
//...
};
//...
CMainFrame::CMainFrame()
{
MyStatic = new CStaticEx;
MyStatic->Create("Текст",WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(10,10,100,30),this,IDC_MY_STATIC);
//...
}
CMainFrame::~CMainFrame()
{
delete MyStatic;
}
//...
#define IDC_MY_STATIC 101
class CStaticEx: public CStatic {
public:
afx_msg void OnLButtonDown(UINT, CPoint);
private:
DECLARE_MESSAGE_MAP()
};
afx_msg void CStaticEx::OnLButtonDown(UINT, CPoint)
{
//обработка события
MessageBox("Ура, работает!","Заголовок",MB_OK|MB_ICONEXCLAMATION);
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
//описание класса окна или чего-либо ещё
class CMainFrame: public CFrameWnd {
public:
CMainFrame(); //конструктор окна
~CMainFrame();
//...
private
CStaticEx* MyStatic;
//...
};
//...
CMainFrame::CMainFrame()
{
MyStatic = new CStaticEx;
MyStatic->Create("Текст",WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(10,10,100,30),this,IDC_MY_STATIC);
//...
}
CMainFrame::~CMainFrame()
{
delete MyStatic;
}
//...
в принципе если добавить это в проект из MFC AppWizard, то работает нормально. переопределять никаких функций больше не надо. Если работаешь через конструктор диалогов, то можно вставить элемент управления Custom control подробнее о конструкторе (картинка)
Только Create хватит