|
|
vs2015 RichEdit2 サンプルへの調査状況 |
H.Kamifuji |
Visual Studio 6.0 で、RichEdit をダイログに挿入すると動作しなくなる問題があり、解決しないで放置していました。VS2015 への移行検討の一旦として、RichEdit を扱って見ました。 その結果、Visual Studio 6.0 で、放置した問題も解決したので、ここで、纏めておきます。 |
Visual Studio 6.0 と同様に、ダイアログベースのMFCアプリのプロジェクトを作成し、RichEdit2 を挿入後、ビルド・実行すると、何も表示なしに終了してしまう。 Visual Studio 6.0 のときには、ここで、諦めたが、取りあえずコントロール変数を追加してみた。すると下記のようなダイアログ表示がありました。 これで、自動的にコードが追加されたと思い、そのままビルドすると大変なことになってしまった。windows の深いところで、例外処理に陥り修復不可になってしまった。 そこで、APP クラスに下記のようにコードを追加してみました。 BOOL CRichEdit3App::InitInstance() { //TODO: call AfxInitRichEdit2() to initialize richedit2 library. // *** 省略 **** InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); AfxInitRichEdit2(); // RichEdit2 を使用するときには必須 H.Kamifuji // ダイアログにシェル ツリー ビューまたはシェル リスト ビュー コントロールが // 含まれている場合にシェル マネージャーを作成します。 // *** 省略 **** // ダイアログは閉じられました。アプリケーションのメッセージ ポンプを開始しないで // アプリケーションを終了するために FALSE を返してください。 return FALSE; } 上記にコードを追加することで、無事に RichEdit2 を扱えるようになりました。 それにしても、警告出すなら、コードも自動で入力してくれても良いと思うが如何なものか。 警告ダイアログは、一度しか表示されず見逃すと大変な事になってしまいます。要注意
|
Visual Studio 2015 と windows 10 の評価を兼ねて、下記のようなダイアログベース MFC アプリを作成してみました。 通常の Edit Control では、右クリックで、標準的なポップアップメニューが表示されますが、Rich Edit2 では、自ら実装する必要があるようです。そこで、上記のようなポップアップメニューを実装してみました。 WM_CONTEXTMENU メッセージに対して、下記のようなコードを作成します。 void CRichTextEdit2Dlg::OnContextMenu(CWnd *, CPoint point) { // TODO: ここにメッセージ ハンドラー コードを追加します。 CRect rc, rc2; CMenu *menuPopup; CMenu cMenu; if (point.x == -1 && point.y == -1) { LONG start, end; m_richEdit.GetSel(start, end); point = m_richEdit.PosFromChar(end); m_richEdit.ClientToScreen(&point); } // 座標がリッチエディットコントロール内の場合のみポップアップメニューを表示 m_richEdit.GetClientRect(&rc); m_richEdit.ClientToScreen(&rc); m_richEdit2.GetClientRect(&rc2); m_richEdit2.ClientToScreen(&rc2); if (rc.PtInRect(point)) { cMenu.LoadMenu(IDR_POPUP_EDIT); menuPopup = cMenu.GetSubMenu(0); menuPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, point.x, point.y, this); cMenu.DestroyMenu(); // DestroyMenu( menuPopup ); m_p1x = point.x; m_p1y = point.y; m_nRE = 1; } else if (rc2.PtInRect(point)) { cMenu.LoadMenu(IDR_POPUP_EDIT); menuPopup = cMenu.GetSubMenu(0); menuPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, point.x, point.y, this); cMenu.DestroyMenu(); // DestroyMenu( menuPopup ); m_p1x = point.x; m_p1y = point.y; m_nRE = 2; } } [ 切り取り(T) ] , [ コピー(C) ] および [ 貼り付け(P) ] メニューには、下記のようなコードを追加しました。 void CRichTextEdit2Dlg::OnEditCut() { // TODO: ここにコマンド ハンドラー コードを追加します。 if (m_nRE == 1) { m_richEdit.Cut(); } else if (m_nRE == 2) { m_richEdit2.Cut(); } } void CRichTextEdit2Dlg::OnEditCopy() { // TODO: ここにコマンド ハンドラー コードを追加します。 if (m_nRE == 1) { m_richEdit.Copy(); } else if (m_nRE == 2) { m_richEdit2.Copy(); } } void CRichTextEdit2Dlg::OnEditPaste() { // TODO: ここにコマンド ハンドラー コードを追加します。 if (m_nRE == 1) { m_richEdit.Paste(); } else if (m_nRE == 2) { m_richEdit2.Paste(); } } [ 要素編集(E) ] メニューについては、次の項で説明します。 |
ポップアップから [ 要素編集(E) ] メニューを実行すると、下記のようなダイアログが表示されます。 上記で、フォント名の右側の [ 参照 ] ボタンをクリックすると ChooseFont 関数が起動され、下記のようなダイアログが表示されます。 フォントの選択、スタイル、サイズ、文字飾り、文字色などを選択指定できます。 上記で、ペン色およびブラシ色の右側の [ 参照 ] ボタンをクリックすると ChooseColor 関数が起動され、下記のようなダイアログが表示されます。 それぞれの色を選択できます。背景色は、 ChooseFont では、指定できないので、ここで指定して下さい。 [ 取り消し線 ] 、[ 下線 ] 、[ 斜体 ] および [ 太字 ] のチェックボックスで、直接に指定することも可能です。文字サイズもスピンコントロールで、または直接キーインでも指定することができます。 ここで、指定状況は、中央の RichEdit2 コントロールに即時に表示されます。以下に適用するコードを示します。 void CEditItem::RichApply() { CHARFORMAT2 cf; CMyString myStr; char *ptr[2]; cf.cbSize = sizeof(cf); cf.dwMask = CFM_STRIKEOUT | CFM_BOLD | CFM_COLOR | CFM_SIZE | CFM_ITALIC | CFM_UNDERLINE | CFM_BACKCOLOR | CFM_FACE; cf.dwEffects = 0; if (m_CheckItalic == TRUE) { cf.dwEffects |= CFE_ITALIC; } if (m_CheckBold == TRUE) { cf.dwEffects |= CFE_BOLD; } if (m_StrikeOut == TRUE) { cf.dwEffects |= CFE_STRIKEOUT; } if (m_UnderLine == TRUE) { cf.dwEffects |= CFE_UNDERLINE; } cf.yHeight = m_charSize * 20; cf.crTextColor = myStr.strtoul(m_penColorHex, ptr, 16); cf.crBackColor = myStr.strtoul(m_brushColorHex, ptr, 16); lstrcpy(cf.szFaceName, m_fontName); m_richEdit1.SetSel(0, -1); m_richEdit1.SetSelectionCharFormat(cf); } メインのダイアログ画面左下の [ 合否表示サンプル ] ボタンをクリックすると、下記のように右上部に合否表示されます。 Border を False にして、背景色を廻りと合わすとスタチックテキスト風に表示することができます。 以下に、参考コードを示します。 void CRichTextEdit2Dlg::OnBnClickedButtonDsp() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 CHARFORMAT2 cf; SetDlgItemText(IDC_RICHEDIT22, _T("合格")); m_richEdit3.SetSel(0, -1); m_richEdit3.SetBackgroundColor(FALSE, RGB(240, 240, 240)); cf.cbSize = sizeof(cf); cf.dwMask = CFM_STRIKEOUT | CFM_BOLD | CFM_COLOR | CFM_SIZE | CFM_ITALIC | CFM_UNDERLINE | CFM_BACKCOLOR; cf.dwEffects = CFE_BOLD; cf.yHeight = 48 * 20; cf.crTextColor = RGB(0, 0, 255); cf.crBackColor = RGB(240, 240, 240); m_richEdit3.SetSelectionCharFormat(cf); } |
このアプリから Copy & Paste で、Word2010 , Excel2010 および PowerPoint2010 へ貼り付けてみました。文字サイズが微妙に異なるのは、何故なのか。 下記は、Word2010 に貼り付けた事例です。 下記は、Excel2010 に貼り付けた事例です。 下記は、PowerPoint2010 に貼り付けた事例です。 通常は、デバイスの表示分解能( dpi )を見て、それなりに補正し表示する手法がある。印刷時に画面表示と微妙にずれる(三者とも)のは、この辺なのかもと推測している。 当方で提供している LogGraph は、この辺を確実に補正している。画面表示では、小さいフォント指定では、若干の表示ずれがあるが、印刷結果は、問題ない。 |
VS2015 移行への調査状況 VS2015 unicode プロジェクトでマルチバイト文字列をインターフェース |