• 締切済み

EditViewクラス 文字色の変更とクリア

お世話になります。現在MFCでTCP/IPパケットを受信したものをCEdtiViewクラスのViewに表示するプログラムを作成しました。 そこで、わからない事が出てきたので、わかる方々にご教示していただきたく投稿いたしました。 わからない事は、Viewに表示される文字色が現在Black(default??)なのですが、その色を変えたいのですが、どのようにしたらいいのでしょうか? ちなみにViewへの表示はGetEditCtrl()という関数を使用していて、 CString Msg(_T("TEST")); int nLen = GetWindowTextLength(); GetEdtiCtrl().SetSel(nLen,nLen); GetEditCtrl().ReplaceSel(Msg); このような記述をしています。 このGetEditCtrlを使って文字色の変更は出来ないのでしょうか? あとタイトルにも記載したのですが、あるトリガーがあるとそのEditViewクラスの描画文字列をすべてクリアしたいと考えています。 トリガーは簡単にボタンが押されたときに~~~C***Viewの領域クリア このような時はどのようにしたらいいのでしょうか? 初心者ですが、宜しくお願いいたします。 ---------------------------開発環境-------------------------------- WinXP sp2 MFC SDI

  • MON-Q
  • お礼率81% (13/16)

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

CEditViewの派生クラスで色の変更をする場合は CtlColor(CDC* pDC, UINT nCtlColor)を使うことになります # Onが付かないほうです ... Viewクラスのプロパティから メッセージを選択し =WM_CTLCOLORの右側をクリックで追加できます この場合最低でも CBrushクラスの変数を用意して、関数からの戻り値にしないといけないでしょう Viewクラスの OnInitialUpdateメソッドの中などで ブラシを作成してください ドキュメントの内容を削除したいのであればViewクラスの DeleteContens()を呼び出せばいいような気がします ...

MON-Q
質問者

お礼

返答が遅れてしまいまして、本当に申し訳ありません。 >Viewクラスのプロパティから メッセージを選択し =WM_CTLCOLORの右側をクリックで追加できます この部分ですが、追加したところ、OnCtlColorが追加させましたけど、 それで宜しいのでしょうか? >この場合最低でも CBrushクラスの変数を用意して、関数からの戻り値にしないといけないでしょう これは、 CBrush 変数 としてCBrush変数を作成して、CtlColorの return CBrush変数 としてあげればよいのでしょうか? Viewクラスの中のOnInitialUpdateの中で、ブラシを作成しても上手く 行きませんでした。 >ドキュメントの内容を削除したいのであればViewクラスの DeleteContens()を呼び出せばいいような気がします MSDNなどで、DeleteContensを検索しても出てこなかったのですが、 どういう使い方をしたらいいのでしょうか? 返信遅くなってしまいましたが、宜しくお願いいたします。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

デバイスコンテキストクラスの 背景色と文字色を変えることで実装できそうです。 あとはメッセージ云々の処理になりますが、 以下が参考になりそうです。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_EDITcolor.html

MON-Q
質問者

お礼

aris-wiz様 ご回答ありがとうございます。 さっそくリンク先のサイトを見て実行したのですが、EditViewクラスにおいてOnCtlcolorがオーバーライド出来ませんでした。 ちなみに先ほど記述し忘れたのですが、Visual Studio 2005 MFCを使用して います。 自分がやりたい事を簡単に書きますと、 1、C***Viewに描画される文字はすべて(青色)とする。アプリケーション を作動させてる最中に文字色は変更しない! 2、トリガーが与えられると、描画していた文字が消える。 大きく言うと以上2点が出来ればよいのですが、先ほどの参考リンクで、 マネした所うまくいきませんでした。 自分のやり方がいけないのでしょうか? アドバイス宜しくお願いいたします。

関連するQ&A

  • クラスビューでクラスがなくなるのはなぜ?

    VC++6.0を使用し始めたものです。 最初にスケルトンを生成し、その後ソースを書き換えていると、 クラスビューを見たら、変更したソースのクラスが消えています。 例えば、TestというプロジェクトをSDIで生成すると CTestDocクラスやCTestViewクラスなどができますよね。 それからTestView.cppを書き換えたりすると、 クラスビューの表示を見たらCTestViewクラスが消えているといった具合です。 どうしてこのようになってしまうのでしょうか? 設定の問題でしょうか? VC++は使い始めて間もないので、よく分かりません。 どうぞ宜しくお願いします。

  • ドキュメントクラスの取得方法

    MFC の SDI でアプリケーション開発をしています。 当方 “Hello, world!” を学び始めて数ヶ月のビギナーです。 ドキュメント・ビュー構造では ビュークラスからは GetDocument() 関数を使って, ドキュメントクラスの public な領域を操作することができます。 ここで質問です。 自分の作った,独自のクラスから,ドキュメントクラスを取得する には,どうしたらいいのでしょうか? GetDocument() 関数はビュークラスにしか(?)備わっていないようで,困っています。 ドキュメントクラスの ID でも分かれば GetDlgItem() が使えるかもしれない(?)などと思ったのですが。 初心者につき,変な質問をしているかもしれませんが,ご教授いただけると幸いです。

  • CStringの文字列検索&抜き出しについて

    お世話になります。 ///////////開発環境/////////// WinXP VisualStudio 2005 SDI MFC 以上の環境にてプログラムしています。 現在CString型の変数の中にある文字列操作について悩んでいます。 例えば、 CString Test(:program!~program@123.456 TEST :message); このような内容が入ってるとします。 こんな時に例えばTESTを抜き出したい時にどうすればいいでしょうか? なお、毎回TESTという文字列ではなくTEST2などの文字列が変わるもの だとするとバイト数指定が出来なくて困っています。 バイト数指定しないでTESTのTのアドレスをGETしてそれを'\0'までを 切り抜くと:messageの部分まで取れてしまいます。 でもバイト指定が可変なので、出来ない・・。どうすればいいのでしょうか?? 同様にmessageの部分も毎回変わっていてバイト数指定出来ません。 こちらの方は、文字列の最後から:を探していって:が見つかったらその アドレスから'\0'までを切り出せばいいと思うのですが、もし messageの部分に:mess:ageこういうメッセージが送られて来た時に、 :ageしか取れなくなり、本当はmess:ageを切り抜きたいのです。 せっかくMFCのCStringを使っているので、strtokやstr~などのC言語関数 は避けたいのですが、何かいい案ありますでしょうか?? ご教示宜しくお願いいたします。

  • 文字列の変換

    超 C++ 初心者です。 コンソールで "Hello, world!" を学んでからニ,三ヶ月程度です。 C++ の string クラスのメンバ関数 c_str() を用いることで /**  * string(C++ の文字列)から C の文字列(文字配列)を取り出し  * その先頭のアドレスを返す  */ ということができるのを学びました。 今 C++ の string および VC++ の CString の変換をしたいと思っています。 例えば VC++ で MFC アプリケーションを作っているとき, C++ の string である temp を VC++ の CString として使えるように するには,どういう手段をとればよいのでしょうか。 逆に VC++ の CString である temp を C++ の string として使うとき の方法もご教授ねがえれば幸いです。 超初心者につき,方法があまりにも難しいようでしたら断念することも考えています。

  • MFC 分割ウィンドウのそれぞれ窓の描画に関して

    MFCプログラミング初心者ですが、宜しくお願いいたします。 ---------------プログラム環境--------------- WinXP2 Visula Studio 2005 Pro -------------------------------------------- 現在、上記の環境で、SDIプログラムを書いています。 ご教示していただきたいことは、分割ウィンドウにおけるそれぞれの窓の 表示内容を変えたいということです。TCP/IPのプログラムで、受信したMessageをstrstrなどで振り分けて、各々の窓に表示したいのですが、 どういう風にやればいいのですか?? なお、一つのViewに受信メッセージを表示させることは出来ました。 非常に困っています。 現在、CMainFrame::OnCreateClient(~~~)とMainFrame.cppに書き、 ウィンドウを3分割にしております。 m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter.CreateStatic(&m_wndSplitter,2,1,WS_CHILD | WS_VISIBLE,WS_BORDER,m_wndSplitter.IdFromRowCol(0,1)); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(??View)),~~ m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(??View)),~~ m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(??View)),~~ この用に記述しております。 説明しずらいのですが、??Viewの箇所にスケルトンの時にできていたView クラスを入れてやると、そのエリアに受信メッセージが表示されます。 初心者なので、まと外れかもしれませんが、新しいViewクラスを作成して なにかやれば、よいのでしょうか?? 現在3つのウィンドウにそれぞれの メッセージを表示させたいので、Viewクラスはそれぞれ3個なければ、いけないのでしょうか?? わかりずらい説明で申し訳ないですが、宜しくお願いいたします。

  • 重いグラフィックス処理

    Windows VisualC++/MFC でのご質問です。 大きなグラフィックスデータをSDIアプリケーションで表示しているのですが、データが重く描画に10数秒時間を要してしまいます。1mil1画素といった具合に割り当てているのですが、あまりにも重過ぎます。描画を早くしたいのですが、何か良い手はありますでしょうか? 現在はDCに直接描画しています。メモリDCも試しましたが、サイズが大きすぎてbitmapが作れまずあきらめました。 以上、ご指導よろしくお願いします。

  • OnDrawが呼び出されません

    一つの画面をコントロール部と描画部にわけたものを作ろうとしています. (VC++6.0 MFC使用) ・CMyViewクラス(CFormViewクラス派生・コントロール部) ・CTest1Viewクラス(CViewクラス派生・描画部)(CTest1Docに関連付け) ・CTest1Docクラス MyViewのボタン入力でTest1Viewの画面を再描画させたいのですが,MyView内から以下のようにしてもTest1ViewのOnDrawが呼び出されません. (OnUpdateは呼び出されるようです) CTest1Doc *pDoc=(CTest1Doc *)GetDocument(); pDoc->UpdateAllViews(NULL, 1, NULL); 再描画させるにはどうすればよいのでしょうか.

  • 基本クラスCEditViewでのテキストの最後の検索とテキスト設定

    [開発環境]:Visual C++ 6.0 現在、Visual C++ 6.0を使ったMFCプログラミングの勉強をしています。 基本クラスをCEditViewとしてSDIアプリケーションを MFC AppWizard (exe)で作成しました。 このテキストエディタにタイマを発行させて、 ある一定の時間が経過した時に編集中のテキストの最後を検索して、 その場所に特定の文字列(例えば"1分経過"等)を表示させたいと考えています。 しかし、編集中テキストの最後を検索する方法と、 その場所へのテキスト設定の方法が分かりません。 ご存じの方、これらについて御教授お願いします。

  • CString を使わないで小数点キャスト

    MFCを使っています。 CString strTest; strTest.Format("%5.2f%", 50.12) としているのを、CStringを使わないでfloatから文字列にしたいのですが、 どのようにすればよいでしょう? 簡単な方法は無いでしょうか? 変換後は DrawText で表示するものです。 よろしくお願いします。

  • 文字化けしない書き方

    CString str = "%#.3f" という文字列に関して、数字部分をint valで置き換えたいなと思っています。 そこで、Formatを使って以下のように書きましたが、%#.が文字化けしてしまいます。 str.Format("%s%df", "%#.", val); 1文字ずつなら表示されるようなのですが、%#あるいは#.とやると文字化け(□)になって しまいます。なので、 str.Format("%s%s%s%df", "%", "#", ".", val); とやると、表示されるには表示されるのですが、str.Format("%s%df", ...)という書き方で 書けたらなと思っています。何か方法はないでしょうか。 よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。

専門家に質問してみよう