はじめまして、xuanといいます。

VC++を使っているのですが、エディットボックスを読取専用にすると自動的に色が灰色っぽくなってしまいますけれども、こちらを元のように白色に変更するにはどうすればいいのでしょうか?

とりあえずctlColor()を使えば出来るらしいということは分かったのですが、他に何をすればいいのかということが良く分かりません。
よろしければ、細かい部分まで教えていただきたいのですが…。

お手数ですが、よろしくお願いします。

A 回答 (2件)

横槍回答っす。



ES_READONLYは関数じゃなくて、スタイル設定用のマクロです。
Create関数を自作するんじゃなくて、
Createを呼ぶときdwStyleにES_READONLYを指定すれば
(スタイルがそれだけじゃマズイけど)、読み取り専用になります。

RECTはただの構造体です。
名前のとおり長方形を表し、left、top、right、bottomの四つの要素を持ちます。
この場合はウィンドウの大きさを指定するためにウィンドウの座標を
スクリーン座標で代入すればいいんではないかと思います。
あ、RECT&の&は「参照」ですよ、念のため。

>私はプロパティの方で読取専用に
MFC(ですよね?)はよく判らないのでこの部分が掴めませんが…
クラスウィザードでOnCtlColorStaticみたいなメッセージハンドラを作って、
そのなかに
if(HWND(lParam) == hEdit)
return (LRESULT)GetStockObject(WHITE_BRUSH);
に相当するコードを書けばオッケなのではないかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど、そういう意味だったのですか…。どうも、何を見てもどういう意味なのか良く分からなかったのです。
プログラムは(という言い方をして良いのかどうかよく分かりませんが)確かにMFCです。
この質問をした当時はMFCという種類があって、他の種類があるとは知らなかったものですから…。

本当にありがとうございました。
参考にさせていただいて、また頑張ってみようと思います!

お礼日時:2002/04/15 00:07

ES_READONLY であれば EDIT でも WM_CTLCOLORSTATIC が発生。



 case WM_CTLCOLORSTATIC:
  if(HWND(lParam) == hEdit)
   return (LRESULT)GetStockObject(WHITE_BRUSH);
 break;
    • good
    • 0
この回答へのお礼

返事の方遅れてしまい、申し訳ありませんでした。

こちらの方を見させていただきまして、しばらく自分でやってみようと思ったのですが、分からない部分が出てきてしまいましたので、よろしければ教えていただきたいのですが…。

ES_READONRYの意味がどうしてもよくわからないのです。
私はプロパティの方で読取専用に設定したのですが、読取専用にした地点でこのような関数が出来ているのでしょうか?
ヘルプで見てみたところ、ES_READONLYの参照のところにCEdit::Createとあり、そこに
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
を使うというようなことがあったのですが、これを参考に自分で作ればよいのでしょうか?
ただ、これを使ってみようと思ったもののrectの意味がよく分からないのです。

お手数ですが、よろしければお願いします。

お礼日時:2002/03/21 00:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QGetAt・SetAtを用いてエディットボックスに表記するにはどうすれば良いでしょうか?

VC++の初心者です。エディットボックス1で"ON"または"OFF"を入力し、エディットボックス2に"ON"の場合は1を表記し、"OFF"の場合は2をGetAt・SetAtを用いて、表記させたいのですが。初歩的な質問ですみませんが、どうぞよろしくお願い致します。

Aベストアンサー

void CMyDialog::OnButton1Click()
{

UpdateData(TRUE);

if( m_strEdit1 == _T("ON") ) {
m_strEdit2 = _T("1");
}
else if( m_strEdit1 == _T("OFF") ) {
m_strEdit2 = _T("2");
}

UpdateData(FALSE);

}

みたいにすれば、平気かな?

QWin32 API エディットボックス内文字列の色変更

Win32 APIについて質問です。
(Microsoft Visual Studio .NET 2002、XP、API)

エディットコントロールに表示されている文字列の
色(またはフォント)を変更したいと思っています。
エディットボックスに「0」という数字を入力し
その後「更新ボタン」をクリックすると、「0」の
文字色が赤色(または赤太文字)へ変更される
という具合です。

Win32 APIを始めて間もない者(Cも始めて間もないです)
なので、かなり苦戦しております。
「SendMessage() 」みたいな関数を使用しエディット
ボックスのハンドルへメッセージを送ることで
実現させるのかなぁ程度しか理解しておりません。

ご存じの方すいませんがよろしくお願いします。

Aベストアンサー

エディトコントロールの文字色変更は
エディトコントロールを配置してある親ウィンドウのウィンドウプロシージャにて、
「WM_CTLCOLOREDIT」を受け取った時に、処理するとよいです。
パラメタに
HDC hdcEdit = (HDC)wParam;/* エディトコントロールのHDC */
HWND hWndEdit = (HWND)lParam; /* エディトコントロールのHWND */
が送られてくるので、
hWndEditが処理したいエディトコントロールのハンドルと一致する場合に、
文字色を変更する処理を記述します。
SetTextColor(hdcEdit, 色);

詳しくは、APIリファレンスの「WM_CTLCOLOREDIT」を参照してみてください。

QVC++.net SDIで追加したメニューを灰色から黒にする方法

VC++.net 2003 のSDIでプログラムを作っています。
新たにメニューを追加したのですが、実行しても文字が灰色になっており、選択することができません。

手元にある入門書には、フォームアプリケーションの場合は、新たに追加した「メニューをダブルクリックすると、コードエディタに切り替わり、Clickメソッドの枠組みが自動的に生成される」とあるのですが、私の場合、ダブルクリックしても何も起こりません。ネットで検索すると、VC++ ver.6 の情報ばかりで、VC++.net 2003の場合が、いまいちよくわかりません。

「この本に書いてある」という情報でも構わないのでよろしくお願いします。

Aベストアンサー

確信があるわけではありませんが・・・

アプリケーションを実行してメニューを
ダブルクリックしていませんか?
その場合、何も起こらなくて正解です(^^

きっとお手元の入門書にはリソースエディタの
メニューをダブルクリックすると・・・という
趣旨のことが書かれていると思います。

というわけでリソースエディタでメニューを
表示して、それをダブルクリックしてみてください。

QVC++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"を記述しても
改行されませんでした。

どのようにしたら うまく 改行されて表示されるのか よろしくお願いします

Aベストアンサー

CStringが使われているということから、MFCを使っているということでよいでしょうか。

ダイアログクラスの中でどのようにエディットボックスに反映していますか?
MFCでは大きく分けて、DDXによる方法と、直接GetWindowText()/SetWindowText()を使う方法があります。DDXの場合は

UpdateData(TRUE);

でデータを画面からDDX変数(例えばCString型メンバ変数 m_history)に取得し、変数を

m_history = m_history +"\r\n" + szRecv;

のように更新した上で、

UpdateData(FALSE);

を呼び出してDDX変数の内容を画面コントロールに反映させます。

DDXを使わない方法では、エディットコントロール(例えばCEdit型メンバ変数 m_edit)に対して

CString history;
m_edit.GetWindowText(history);
history = history +"\r\n" + szRecv;
m_edit.SetWindowText(history);

とします。

ただし、単に履歴の表示のみで編集する必要がないのであれば、redfox63さんがおっしゃるようにリストボックスやリストビューなどを使用するのが良いです。

CStringが使われているということから、MFCを使っているということでよいでしょうか。

ダイアログクラスの中でどのようにエディットボックスに反映していますか?
MFCでは大きく分けて、DDXによる方法と、直接GetWindowText()/SetWindowText()を使う方法があります。DDXの場合は

UpdateData(TRUE);

でデータを画面からDDX変数(例えばCString型メンバ変数 m_history)に取得し、変数を

m_history = m_history +"\r\n" + szRecv;

のように更新した上で、

UpdateData(FALSE);

を呼び出してDDX変数の内容を画...続きを読む

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

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";だけにしてみると、スペースが空き、改行はされないものの表示されます。
初歩的な質問かとは思いますが、教えていただければと思います。よろしくお願いします。

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...続きを読む

Aベストアンサー

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)

nanami_wic さん、はじめまして。

上げていただいたソースの内容を見た限り、おそらくバッファ(m_Data[])の中身を16バイト毎に
下記のようなフォーマットでダンプ表示させる処理部分だと解釈しました。
 <ダンプ表示のフォーマット>
 XXXXXXXX: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
  ↑       ↑                                  ↑
 アドレス   16進文字列でのダンプ                      A...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報