这个垂直文本,网上很多人都询问过,可惜没有人能给出正确解决这个问题的方法。
几经曲折,终于想出了解决垂直排列文字的策略。
一开始我的想法 是使用VS2005中的 CRichEditCtrl 控件来做, 但是此控件是2.0版本,不支持垂直文本。
后来,查了许多资料,谈到,RICHEDIT 4.1版本支持垂直版本
因此,我就想找个4.1版本的CRichEditCtrl 控件, 可惜的事,找了很久,也没有找到,不得已放弃这个想法。
网上,有很多将CRICHEDITVIEW 提升到4.1版本的方法,可以没有将CRICHEDITCTRL 提升到4.1版本的方法, 此控件是VS2005提供的,是使用2.0版本编写的,因此,除非自己写个4.1版本的控件,否则还真没有找到可行方法。
问题还是要解决的,既然CRICHEDITVIEW 支持垂直文本,那就从这入手吧
首先,测试4.1版本的cricheditview是否真的支持垂直文本
继承CRichEditView 建一个自己的richeditview
在PreCreateWindow()中 更改注册窗口名为4.1版本的窗口名RICHEDIT50W,并设置为垂直文本样式
BOOL CMyrichEditView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此添加专用代码和/或调用基类 BOOL bRes = CRichEditView::PreCreateWindow(cs); cs.style |= ES_VERTICAL; cs.lpszClass = TEXT("RICHEDIT50W"); return bRes; }
在APP的初始化函数中加载4.1版本的DLL------MSFTEDIT.DLL
BOOL CTestApp::InitInstance() { INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); SetRegistryKey(_T("应用程序向导生成的本地应用程序")); if (LoadLibrary(_T("MSFTEDIT.DLL")) == NULL) { AfxMessageBox(_T("Could not load the RichControl Dll."), MB_OK|MB_ICONEXCLAMATION); return FALSE; } CTestDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此处放置处理何时用“确定”来关闭 // 对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用“取消”来关闭 // 对话框的代码 } #ifdef _DEBUG m_msOld.Checkpoint(); #endif // _DEBUG return FALSE; }
经测试, 可以实现垂直文本
好,既然这个View类可以实现垂直文本,那就以此为突破口
因此有了以下思路:
既然视图view类可以实现这个功能,那么我如果能将这个视图嵌入到对话框中,不就也可以实现所要求的功能了吗?
那么,下一步的工作就是,视图能不能嵌入对话框中,能不能嵌入
经查资料,完全可以嵌入对话框 ,而且方法很简单
在对话框中,嵌入支持垂直文本的视图
方法如下: 在对话框初始化函数中添加如下语句
CDialog::OnInitDialog(); //m_pRichEditView=NULL; CCreateContext pContext; CWnd *pFrameWnd=this; pContext.m_pCurrentDoc=((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();// 若无文档 ,可以自己建一个文档类 pContext.m_pNewViewClass=RUNTIME_CLASS(CMyRichEditView); CMyRichEditView *pView=(CMyRichEditView*)((CFrameWnd*)pFrameWnd)->CreateView(&pContext); ASSERT(pView); m_pRichEditView=pView; pView->ShowWindow(SW_NORMAL);
然后通过 pView->MoveWindow() 确定视图的显示位置
经测试, 视图嵌入到了对话框中,并实现了垂直文本功能
效果图如下: