• ベストアンサー

MFCのエディットボックスについて

WindowsのPCにてMFCを使い、ダイアログボックスを作成しています。 ダイアログボックスの中にエディットボックスを作成したのですが、複数行、改行許可の項目を両者ともチェックしたのにも関わらず、改行してくれません。 表示内容は、以下のループで取得し、 while(m_isize > 0) { BYTE ch = m_Data[m_nPos]; if(isalnum(ch)) { m_Ascii += ch; } else { m_Ascii += " "; } m_Dmy.Format("%02X", ch); m_Dmp +=m_Dmy; m_nPos++; m_isize--; if((m_nPos%16)== 0) { m_Addr.Format("%08X:", m_nPos-16); SetDump(); m_Dmp = " "; m_Ascii =" "; } m_Total+=m_DmpLog; m_Total+= "\r\n"; } m_Total(CString)が取得した値を、エディットボックスで表示します。 しかし何故か、上書きされて、最終的に表示されません。 試しに、m_Total+="\n";だけにしてみると、スペースが空き、改行はされないものの表示されます。 初歩的な質問かとは思いますが、教えていただければと思います。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.3

nanami_wic さん、はじめまして。 上げていただいたソースの内容を見た限り、おそらくバッファ(m_Data[])の中身を16バイト毎に 下記のようなフォーマットでダンプ表示させる処理部分だと解釈しました。  <ダンプ表示のフォーマット>  XXXXXXXX: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX   ↑       ↑                                  ↑  アドレス   16進文字列でのダンプ                      ASCII文字のダンプ 上記の前提でソースを少し変更してみました。 ・関数 SetDump() をダンプ文字列編集用の関数だと解釈してその部分も追加してみました。 ・エディットボックスへの文字列追加の部分も追加してみました。 ※下記ソースにおいて、"//## ~~~~~" となっている部分はオリジナルソースでの変更前 の表記です。 /* * 【メイン部分】 * ※予め、m_Data[] にダンプ元のデータ、m_isize にデータの総バイト長が * セットされているものとします。 */ void Cxxxxx::DumpOut() { m_nPos = 0; m_Ascii = ""; m_Addr = ""; m_Dmy = ""; m_Dmp = ""; m_DmpLog = ""; m_Total = ""; while(m_isize > 0) { BYTE ch = m_Data[m_nPos]; //## if(isalnum(ch)) if((ch >= 0x20) && (ch <= 0x7f)) //ASCIIコードの 0x20~0x7f まではそのまま表示 { m_Ascii += ch; } else //それ以外は '.' (ピリオド)で表示 { //## m_Ascii += " "; m_Ascii += "."; } //## m_Dmy.Format("%02X", ch); m_Dmy.Format("%02X ", ch); //16進文字2桁+スペース m_Dmp +=m_Dmy; m_nPos++; m_isize--; //## if((m_nPos%16)== 0) if(((m_nPos%16) == 0) || (m_isize == 0)) //16バイト毎およびデータ末尾の時にダンプ文字列編集 { //## m_Addr.Format("%08X:", m_nPos-16); m_Addr.Format("%08X:", ((m_nPos-1)/16*16)); //表示アドレスを16バイト単位に補正 SetDump(); //ダンプ文字列編集 m_Total+=m_DmpLog; m_Total+= "\r\n"; //## m_Dmp = " "; //## m_Ascii =" "; m_Dmp = ""; m_Ascii =""; } //## m_Total+=m_DmpLog; //## m_Total+= "\r\n"; } SubAddDump(); //エディットボックスへのダンプ文字列追加 } /* * SetDump : ダンプ文字列編集 */ void Cxxxxx::SetDump() { CString strWkDmp(' ', (16*3)); //16進ダンプエリアの表示幅のスペース文字列を作成 CString strWkAsc(' ', 16); //ASCIIダンプエリアの表示幅のスペース文字列を作成 strWkDmp = m_Dmp + strWkDmp; strWkAsc = m_Ascii + strWkAsc; strWkDmp = strWkDmp.Left((16*3)); //16進ダンプ文字列を作成(表示幅に満たない部分はスペース充填) strWkAsc = strWkAsc.Left(16); //ASCIIダンプ文字列を作成(表示幅に満たない部分はスペース充填) m_DmpLog = m_Addr + " "; m_DmpLog += strWkDmp; m_DmpLog += strWkAsc; } /* * SubAddDump : エディットボックスへのダンプ文字列追加 */ void Cxxxxx::SubAddDump() { // "m_ctrEdit2" はダンプ表示用のエディットボックスに対応づけた // CEditコントロールのメンバとします。 int nLine = m_ctrEdit2.GetLineCount(); //エディットボックスの行数を取得 int nCulm = m_ctrEdit2.LineIndex(nLine-1); //最終行の先頭の文字インデックスを取得 int nStartChar = nCulm; int nEndChar = nStartChar; m_ctrEdit2.SetSel(nStartChar, nEndChar, FALSE); //エディットボックスの最後の文字位置をセレクト m_ctrEdit2.ReplaceSel(m_Total, FALSE); //セレクト位置にダンプ文字列を挿入 } 以上です。参考になれば幸いです。 因みに自分の環境(Windows98+Visual C++ 5.0 ・・・古いですが^_^;)でテストして動作確認しています。 nanami_wic さんのお使いの環境でも上手くいけば良いのですが...(ダメだったら御免なさい。m(__)m)

その他の回答 (2)

  • goo39
  • ベストアンサー率36% (13/36)
回答No.2

> しかし何故か、上書きされて、最終的に表示されません。 > 試しに、m_Total+="\n";だけにしてみると、スペースが空き、改行はされないものの表示されます。 との事ですので"\r\n"では改行されていると思われます。 上書きされているのではなくて、別の理由で思う結果が出ていないのでしょう。 エディットボックスに垂直スクロールバーを付ければ 何かわかるかもしれませんよ。

回答No.1

 こんにちは。  ダイアログエディターのエディットボックスプロパティで、「複数行」の項目にチェックが入っているかどうかを確認してみて下さい。

関連するQ&A

  • エディットボックスの改行

    MFC ダイアログベースでプログラミングしています。 エディットボックスに改行が入らないのですが何故ですか? 以下のソースで実行すると、「1 2」と表示されます。 m_Display = "1 \x0d\x0a 2"; UpdateData(FALSE); UpdateWindow(); また、 int a; の値をエディットボックスに表示させるにはどうしたらよいですか? よろしくお願いします。

  • 親ウィンドウの領域外でも表示されるエディットボックスについて

    親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。

  • VC++2010のエディットボックスの出力について

    VC++2010のエディットボックスの出力について質問させていただきました。 シリアル通信でデータを毎秒受信するプログラムを作成しており、 9_27_23.4_33.00 というデータを受信して エディットボックスに表示しているんですが 9_27_23.4_33.00 9_27_23.4_33.00 9_27_23.4_33.00 ・ ・ ・ という表示を期待しているんですが 改行されず上書きされてしまいます CString szRecvの中に受信データが格納されており szRecv = szRecv +"\r\n"を記述しても 改行されませんでした。 どのようにしたら うまく 改行されて表示されるのか よろしくお願いします

  • エディットボックスの改行について

    よろしくお願いいたします。 環境 WIN98 VC++6.0 MFC にて 改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。 ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。 ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。 次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。 そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。 これで、読み出すときはendを目印に必要な行数を読み出せます。 しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。 長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか? お分かりの方よろしくお願いいたします。

  • 複数行のエディットボックスで改行入力

    複数行のエディットボックスで改行入力 MFC ダイアログベースで、簡単なテキストエディタを作成しています。 エディットボックスは固定サイズで、縦横スクロール無しにしています。 上記エディットボックスに、改行の無い2行分の文字列を出力すると自動的に折り返され、 2行で表示されるのですが、そのとき、2行目の行頭でEnterキーを押すと、 カーソル位置で改行し、空行が挿入されます。(計3行分の表示となる) 10文字文の幅のエディットボックスにて、 文字列 "12345678901234567890" をエディットボックスに出力 エディットボックスでは下記の用に表示。 1234567890 1234567890 2行目の先頭でEnterキー押下で3行表示となる 1234567890 (空行) 1234567890 実際には、1行目の終わりに改行コードが挿入されているので 空行ではなく、改行された状態の2行表示としたいのですが、 どのようにすれば、よいでしょうか? よろしくお願いします。

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

  • エディットボックスで改行

    お世話になっております。 VC++でプログラムを組んでおり、下記の要領でエディットボックスに文字を表示しています。 _itoa(inputData[i], receivedChar, 16 );//数値を文字列に変換 SetDlgItemText(argThr1->hWnd, IDC_EDIT2, receivedChar); このとき、エディットボックス内で、任意の位置で改行しながら表示する方法はありますでしょうか? よろしくお願い致します。 表示例 ABC(改行) DEF(改行)

  • エディットボックス

    VC++、APIでwindowsプログラムを書いています。ダイアログボックスで質問があります。 case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT1, "0"); return TRUE; で読み取り専用エディットボックス内に初期値を書き case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam ; SetTextColor( hdc, RGB( 255, 255, 255)) ;// 白色 SetBkMode(hdc, TRANSPARENT); // 背景を透過 return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ; } でダイアログボックス内のスタティックテキストと読み取り専用エディットボックスの背景を同時に透過させているのですが、エディットボックス内の文字を void ddd( HWND hDlg, int xxx) { char ttt[100]; sprintf(ttt,"%d",xxx); SetDlgItemText(hDlg, IDC_EDIT1, ttt); return ; } で書き換えると古いテキストが残ったように表示されます(背景に色を指定すれば古いテキストは残らない)。 うまく表示させるにはどういった方法があるでしょうか? ご存知の方、よろしくお願いします。 ちなみにダイアログボックスにはビットマップが貼ってあります。

  • エディットボックスのフォントを変えたい

    MFCで作ったダイアログ上の他のコントロールはいじらずに、 エディットボックスのフォントだけを大きく変えたいのですが、 行間が変わらない為か、文字の下のほうが切れてしまいます。 色々試してみていますが、どうしても出来ません。 元のダイアログのフォントは12ptです。 OnInitDialog関数内で、 CFont m_font;(メンバ変数)に以下を設定し、 m_font.CreateFont( 20, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, 0, SHIFTJIS_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS P ゴシック" ); OnCtlColor関数内で、該当エディットボックスの場合だけ pDC->SelectObject( &m_font ); しています。 CreateFontのパラメータが間違っているのでしょうか? それとも、これら関数を呼び出す場所が間違っているのでしょうか? ご回答お待ちしております。

  • MFC:リッチエディットからUnicode文字列を受け取りたい

    MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

専門家に質問してみよう