// 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);
}

解决方案 »

  1.   

    想用自己编的控件必须得注册,之前我编了个,注册简单
    至于析构,我觉得你要补补以C++的基础知识
     onpaint这类的问题不难,当你加入这类消息时消息,消息属性靠下面的条条上都会说明下
      

  2.   

    自己定义的类操作系统不识别自然需要注册,LZ应该看看MFC入门类的书籍,如孙鑫的《VC++深入详解》,里面有对Windows程序过程、消息机制等有讲解。
      

  3.   

    1:不宜在构造函数里注册。
    2:析构时啥也不做。
    3:就是注册窗口类。CreateWindow有个classname,必须找到匹配的窗口类才能创建。
    4:这个你要看书。这是MFC有关消息映射的宏,当窗口函数收到WM_PAINT消息,会调用OnPaint
    5:此时是要处理WM_PAINT消息,决定窗口画出的外观。
    6:MFC的框架会调用此虚函数,让你有机会做一些自己的初始化工作。