文章目录
前言
在继承自CWnd的窗口上创建控件,CListBox显示系统所有安装的字体,然后在显示在CStatic控件上,涉及到 函数:- ::EnumFontFamilies((HDC)dc,NULL,(FONTENUMPROC)EnumFontFamProc,(LPARAM)this);
- static int CALLBACK EnumFontFamProc(ENUMLOGFONT *lpelf, // logical-font data
NEWTEXTMETRIC *lpntm, // physical-font data
DWORD FontType, // type of font
LPARAM lParam // application-defined data
);
EnumFontFamProc为静态的原因是由于回调函数在C++应用程序中要求专门的处理。Windows 严格地定义了回调函数的接口,即通过参数列表传递的参数。
当C++类的成员函数被声明时,编译程序会自动附加一个额外的参数来保存 this 指针。不幸的是,附加了参数就使回调函数的参数列表与Windows期望的参数列表不匹配了,
由此会导致各种问题出现,
甚至包括无效内存访问错误,是Windows程序员的灾难。有几种解决此问题的方法,而将回调函数声明为静态成员函数是其中最简单最直接的一种。
在C++ ,不给静态成员函数传递this指针,因此它的参数列表不会改变
- SetFont(CFont* pFont, BOOL bRedraw)
- CreatePointFont(80, _T(“MS Sans Serif”));
- CreateEx(WS_EX_CLIENTEDGE, _T(“listbox”), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, rect, this, IDC_LISTBOX, NULL);
- SetRect
- CreateFont(-2 * m_cyChar, 0, 0, 0, FW_NORMAL, 0, 0, 0,
DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, strFontFace);
一、实现自定义窗口类
实现自定义窗口类
1.注册窗口类
- 在构造函数里面实现
CFontView::CFontView()
{
CString strWndClass = AfxRegisterWndClass(
NULL, // Class style
AfxGetApp()->LoadStandardCursor(IDC_ARROW), // Class cursor
(HBRUSH)(COLOR_3DFACE + 1), // Background brush
AfxGetApp()->LoadStandardIcon(IDI_WINLOGO) // Class icon
);
...//省略
}