|
发表于 2013-11-26 14:31:16
|
显示全部楼层
拈花小仙 发表于 2013-11-26 13:52
嗯嗯,想知道内部怎么初始化的,消息怎么映射的,最好把主要代码拿出来,多一些注释
// 类声明, 自建一个窗口类并让这个窗口显示.
class CMyFrame : public CWnd
{
DECLARE_DYNAMIC(CMyFrame )
public:
CMyFrame ();
virtual ~CMyFrame ();
protected:
DECLARE_MESSAGE_MAP()
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
private:
//此处放一些自己要在窗口上放的元素, 比如button声明的
};
int CMyFrame ::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//下面是根据继承原理, 构造子类前,先构造父类
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//此处是自己创建的窗口的私有元素的初始化
//TODO
return 0;
}
//调用生成代码。在App实例类中进行
CMyFrame * pFrame = new CMyFrame ();
// 上句生成自己的窗口对象(严格说是管理类), 此时对象中的m_hwnd句柄为空,但是可以初始化自己的变量
也就是调用类中的Create函数
pFrame->CreateEx(0,
_T("CFRAME"),
_T("Test"),
WS_POPUPWINDOW | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_THICKFRAME ,
0,0,100,100,NULL,NULL
);
//上句开始做初始化过程.CreateEx为子类CWnd拥有, 所以开始调用CWnd的CreateEx函数
//一下代码在Wincore.cpp中。c++目录下自己找找
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
ASSERT(lpszClassName == NULL || AfxIsValidString(lpszClassName) ||
AfxIsValidAtom(lpszClassName));
ENSURE_ARG(lpszWindowName == NULL || AfxIsValidString(lpszWindowName));
// allow modification of several common create parameters
CREATESTRUCT cs;
cs.dwExStyle = dwExStyle;
cs.lpszClass = lpszClassName;
cs.lpszName = lpszWindowName;
cs.style = dwStyle;
cs.x = x;
cs.y = y;
cs.cx = nWidth;
cs.cy = nHeight;
cs.hwndParent = hWndParent;
cs.hMenu = nIDorHMenu;
cs.hInstance = AfxGetInstanceHandle();
cs.lpCreateParams = lpParam;
if (!PreCreateWindow(cs)) //注意这个函数,就是我们可以实现的虚函数,可以干一些创建之前要干的事情,比如自己注册窗口.
{
PostNcDestroy();
return FALSE;
}
AfxHookWindowCreate(this);
HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass, //此处创建窗口.
cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);、
。。。略。
}
pFrame->ShowWindow(SW_SHOW); //显示自己的窗口
pFrame->UpdateWindow(); //更新自己的窗口.
|
|