質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

3414閲覧

無効化したエディットボックスの文字の色を変更するには?

mery

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2020/02/29 05:21

編集2020/03/01 11:30

前提・実現したいこと

エディットボックスを無効化すると文字の色がグレー表示になってしまうので、文字の色を変更したいのですがうまくいきません。
エディットボックスは複数行表示でスクロールバーがついています(他のコントロールからスクロールメッセージを送ってスクロールするようにしてます)。
背景色は下のソースコードのやり方でうまくいきましたがSetTextColorの部分が結果に反映されません。
どうすれば文字の色を出来ますか?

該当のソースコード

エディットボックスはEnableWindow(hedit2,FALSE);で無効化済み

c

1case WM_CTLCOLORSTATIC: 2 hdc=(HDC)wp; 3 hctrl=(HWND)lp; 4 if(hctrl==hedit2){ 5 SetBkMode(hdc,OPAQUE); 6 SetTextColor(hdc,RGB(0,0,0)); 7 SetBkColor(hdc,RGB(255,255,255)); 8 9 return(LRESULT)GetStockObject(WHITE_BRUSH); 10 } 11 12 break;

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2010 Express C言語
WIN32 ユニコードビルド Windows7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

無効化した EDIT の文字色は変更できませんので方法として2つ挙げます。

(1) オーナードローする

文字を描画する位置は EM_GETRECT メッセージで取得します。

(2) 疑似的に無効化状態にする

コンテナとなる親ウインドウを作成し、その子ウインドウとして EDIT を作成します。
親ウインドウを無効化することで入力を受け付けなくなりますが、EDIT そのものは有効な状態なので文字色を変更することができます。

#追記
オーナードローのサンプルです。
EDIT をサブクラス化し、無効状態なら自前で描画します。

C

1LRESULT CALLBACK EditWndProc(HWND hWnd, UINT message, WPARAM wp, LPARAM lp) 2{ 3 switch (message) 4 { 5 case WM_PAINT: 6 { 7 if (!IsWindowEnabled(hWnd)) 8 { 9 HDC hdc; 10 PAINTSTRUCT ps; 11 int textLen; 12 LPWSTR text; 13 RECT rc; 14 hdc = BeginPaint(hWnd, &ps); 15 GetClientRect(hWnd, &rc); 16 FillRect(hdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH)); 17 textLen = GetWindowTextLength(hWnd); 18 if (textLen > 0) 19 { 20 textLen = (textLen + 1) * 2; 21 text = (LPWSTR)malloc(textLen); 22 GetWindowText(hWnd, text, textLen); 23 SetTextColor(hdc, RGB(0, 0, 255)); 24 SendMessage(hWnd, EM_GETRECT, NULL, (LPARAM)&rc); 25 DrawText(hdc, text, -1, &rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EDITCONTROL); 26 free(text); 27 } 28 EndPaint(hWnd, &ps); 29 return 0; 30 } 31 else { 32 return CallWindowProc(prevEditWndProc, hWnd, message, wp, lp); 33 } 34 } 35 default: 36 return CallWindowProc(prevEditWndProc, hWnd, message, wp, lp); 37 } 38}

投稿2020/02/29 16:01

編集2020/03/01 08:54
KOZ6.0

総合スコア2622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mery

2020/03/01 01:32

回答ありがとうございます。(2)の方法ではエディットボックスが2つあり1つだけ無効化したい場合も簡単にできるのですか?またキャレットは消えますか?もう少し詳細にやり方が知りたいです。
KOZ6.0

2020/03/01 02:58

別々に無効化したい場合は EDIT ひとつに親ウインドウひとつです。 キャレットは ES_NOHIDESEL スタイルによります。 残すこともできるし消すこともできます。
mery

2020/03/01 11:28

回答ありがとうございます。質問に書き忘れたのですがエディットボックスは複数行表示でスクロールバーがついています(他のコントロールからスクロールメッセージを送っている)。オーナードローのサンプルからDT_SINGLELINE を取り除いて試したら、文字の色は変更でき、正しく表示できましたが、スクロールした場合に画面外にあった文字が正しくスクロールされてきません。エディットボックスについているスクロールバーの機能を残した状態で文字の色を変更する方法は無いでしょうか?
KOZ6.0

2020/03/01 12:11 編集

スクロールバーの機能を残したままにするならキーボードメッセージおよびマウスメッセージを無視する形にしたほうがよさそうです。
KOZ6.0

2020/03/01 12:40

無効化するとキーボードメッセージもマウスメッセージも受け付けなくなるので無効化するのが間違いです。
mery

2020/03/02 10:45

無効化するエディットボックスは表示用に使うだけなので使うのは文字列挿入メッセージとスクロールメッセージだけです。無効化するとキャレットも消えるしスクロールメッセージをSendMessageで送ればちゃんとスクロールできたのでやりたいことはできたのですが、文字の色を変えれないのだけが気になるのでそこだけ解決したいです。
KOZ6.0

2020/03/02 11:55

オーナードローは、クライアント領域に対する表示をすべて自前で行います。 スクロールしたら、その状態を描画することになり、ものすごく面倒な処理になるので (2) の方法をお勧めします。
guest

0

ベストアンサー

https://rarara.org/community/programming/%E7%84%A1%E5%8A%B9%E3%81%AE%E3%82%A8%E3%83%87%E3%82%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E6%96%87%E5%AD%97%E8%89%B2%E3%81%AE%E5%A4%89%E6%9B%B4/
上記のサイトが参考になります。方法としては、

  1. 読み込み専用にして、フォーカスを得たらキャレットを削除する
  2. エディットボックスをサブクラス化して自前で描画する
  3. 描画直前にSetSysColorで無効エディットの色設定を変更、描画直後に元に戻す(非推奨)
  4. 描画直前にGetSysColor関数をフックして、黒を返す関数にすりかえる(下記URL参照)

あたりが現実的だと思います。

https://qiita.com/kobake@github/items/8d3d3637c7af0b270098

投稿2020/02/29 15:27

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mery

2020/03/01 00:26

回答ありがとうございました。エディットボックスをサブクラス化する方法を試してみましたがうまくいきませんでした。下のプログラムのようにやってみたら文字が背景色と同じになってしまい見えなくなってしまいました。WM_PAINTの中でTextOut関数などで表示した場合は文字色は変わりましたがSendMessage関数などで追加した文字列の色は変わりませんでした。サブクラス化してやる方法はプログラム全体を書き換えなければいけないような複雑な方法なんですか? LRESULT CALLBACK newedit2(HWND hwnd,UINT message,WPARAM wp,LPARAM lp){ HDC hdc; PAINTSTRUCT ps; switch(message){ case WM_PAINT: hdc=BeginPaint(hwnd,&ps); SetTextColor(hdc,RGB(0,0,0)); EndPaint(hwnd,&ps); return 0; } return CallWindowProc(oldedit2proc,hwnd,message,wp,lp); }
KOZ6.0

2020/03/01 08:32

見えなくなってしまったのは描画していないからです。 テキストは GetWindowText で取得して TextOut してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問