// SignalLampCtrl.cpp : 实现文件
//#include "stdafx.h"
#include "SignalLamp.h"
#include "SignalLampCtrl.h"
// CSignalLampCtrlIMPLEMENT_DYNAMIC(CSignalLampCtrl, CWnd)CSignalLampCtrl::CSignalLampCtrl()
{
//注册控件类
RegisterCtrlClass(); nIDBitmap = IDB_BITMAP_GREEN;
问题一:控件类必须要进行注册吗???
}CSignalLampCtrl::~CSignalLampCtrl()
{
}
问题二:“析构”只是实现了一下,但是并没有写“析构”过程啊,这是怎么回事???
void CSignalLampCtrl::RegisterCtrlClass()
问题三:这是一个注册类的方法,这个方法是怎样实现的呢???也就是说注册过程是怎样的呢???
{
HINSTANCE hInstance = AfxGetInstanceHandle(); WNDCLASS wndclsCtrl;
ZeroMemory(&wndclsCtrl, sizeof(WNDCLASS)); if(::GetClassInfo(hInstance, STR_CLASS_NAME, &wndclsCtrl))
return; //设置控件类信息
wndclsCtrl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclsCtrl.lpfnWndProc = ::DefWindowProc;
wndclsCtrl.cbClsExtra = 0;
wndclsCtrl.cbWndExtra = 0;
wndclsCtrl.hInstance = hInstance;
wndclsCtrl.hIcon = NULL;
wndclsCtrl.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndclsCtrl.hbrBackground = NULL;
wndclsCtrl.lpszMenuName = NULL;
wndclsCtrl.lpszClassName = STR_CLASS_NAME; //注册控件类
AfxRegisterClass(&wndclsCtrl);
}void CSignalLampCtrl::SetState(StateType nState)
{
switch(nState)
{
case Normal:nIDBitmap = IDB_BITMAP_GREEN;break;
case Warning:nIDBitmap = IDB_BITMAP_RED;break;
case Disable:nIDBitmap = IDB_BITMAP_GRAY;break;
} Invalidate();
}
BEGIN_MESSAGE_MAP(CSignalLampCtrl, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
问题四:“ON_WM_PAINT”这是一个什么样的方法呢???又是什么样的“消息机制”???
// CSignalLampCtrl 消息处理程序void CSignalLampCtrl::OnPaint()
问题五:这里是怎样进行消息处理的?又进行了那些处理呢???
{
CBitmap bmLight;
BITMAP bmData;
CPaintDC dc(this);
CDC* pMemDC = new CDC; bmLight.LoadBitmap(nIDBitmap);
//获取位图数据
bmLight.GetBitmap(&bmData); //创建兼容DC
pMemDC->CreateCompatibleDC(&dc); //贴图
CBitmap *pOldBitmap = pMemDC->SelectObject(&bmLight);
dc.BitBlt(0, 0, bmData.bmWidth, bmData.bmHeight, pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap); delete pMemDC;
}void CSignalLampCtrl::PreSubclassWindow()
问题六:这个方法是进行的什么操作呢???实现了什么功能???
{
CWnd::PreSubclassWindow(); CRect rectCtrl;
CBitmap bmLight;
BITMAP bmData; bmLight.LoadBitmap(nIDBitmap);
//获取位图数据
bmLight.GetBitmap(&bmData); GetWindowRect(rectCtrl);
rectCtrl.bottom = rectCtrl.top+bmData.bmHeight;
rectCtrl.right = rectCtrl.left+bmData.bmWidth;
GetParent()->ScreenToClient(rectCtrl);
MoveWindow(rectCtrl);
}
//#include "stdafx.h"
#include "SignalLamp.h"
#include "SignalLampCtrl.h"
// CSignalLampCtrlIMPLEMENT_DYNAMIC(CSignalLampCtrl, CWnd)CSignalLampCtrl::CSignalLampCtrl()
{
//注册控件类
RegisterCtrlClass(); nIDBitmap = IDB_BITMAP_GREEN;
问题一:控件类必须要进行注册吗???
}CSignalLampCtrl::~CSignalLampCtrl()
{
}
问题二:“析构”只是实现了一下,但是并没有写“析构”过程啊,这是怎么回事???
void CSignalLampCtrl::RegisterCtrlClass()
问题三:这是一个注册类的方法,这个方法是怎样实现的呢???也就是说注册过程是怎样的呢???
{
HINSTANCE hInstance = AfxGetInstanceHandle(); WNDCLASS wndclsCtrl;
ZeroMemory(&wndclsCtrl, sizeof(WNDCLASS)); if(::GetClassInfo(hInstance, STR_CLASS_NAME, &wndclsCtrl))
return; //设置控件类信息
wndclsCtrl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclsCtrl.lpfnWndProc = ::DefWindowProc;
wndclsCtrl.cbClsExtra = 0;
wndclsCtrl.cbWndExtra = 0;
wndclsCtrl.hInstance = hInstance;
wndclsCtrl.hIcon = NULL;
wndclsCtrl.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndclsCtrl.hbrBackground = NULL;
wndclsCtrl.lpszMenuName = NULL;
wndclsCtrl.lpszClassName = STR_CLASS_NAME; //注册控件类
AfxRegisterClass(&wndclsCtrl);
}void CSignalLampCtrl::SetState(StateType nState)
{
switch(nState)
{
case Normal:nIDBitmap = IDB_BITMAP_GREEN;break;
case Warning:nIDBitmap = IDB_BITMAP_RED;break;
case Disable:nIDBitmap = IDB_BITMAP_GRAY;break;
} Invalidate();
}
BEGIN_MESSAGE_MAP(CSignalLampCtrl, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
问题四:“ON_WM_PAINT”这是一个什么样的方法呢???又是什么样的“消息机制”???
// CSignalLampCtrl 消息处理程序void CSignalLampCtrl::OnPaint()
问题五:这里是怎样进行消息处理的?又进行了那些处理呢???
{
CBitmap bmLight;
BITMAP bmData;
CPaintDC dc(this);
CDC* pMemDC = new CDC; bmLight.LoadBitmap(nIDBitmap);
//获取位图数据
bmLight.GetBitmap(&bmData); //创建兼容DC
pMemDC->CreateCompatibleDC(&dc); //贴图
CBitmap *pOldBitmap = pMemDC->SelectObject(&bmLight);
dc.BitBlt(0, 0, bmData.bmWidth, bmData.bmHeight, pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap); delete pMemDC;
}void CSignalLampCtrl::PreSubclassWindow()
问题六:这个方法是进行的什么操作呢???实现了什么功能???
{
CWnd::PreSubclassWindow(); CRect rectCtrl;
CBitmap bmLight;
BITMAP bmData; bmLight.LoadBitmap(nIDBitmap);
//获取位图数据
bmLight.GetBitmap(&bmData); GetWindowRect(rectCtrl);
rectCtrl.bottom = rectCtrl.top+bmData.bmHeight;
rectCtrl.right = rectCtrl.left+bmData.bmWidth;
GetParent()->ScreenToClient(rectCtrl);
MoveWindow(rectCtrl);
}
至于析构,我觉得你要补补以C++的基础知识
onpaint这类的问题不难,当你加入这类消息时消息,消息属性靠下面的条条上都会说明下
2:析构时啥也不做。
3:就是注册窗口类。CreateWindow有个classname,必须找到匹配的窗口类才能创建。
4:这个你要看书。这是MFC有关消息映射的宏,当窗口函数收到WM_PAINT消息,会调用OnPaint
5:此时是要处理WM_PAINT消息,决定窗口画出的外观。
6:MFC的框架会调用此虚函数,让你有机会做一些自己的初始化工作。