リッチエディットでセンタリング

[戻る]
spark 2002/02/25(月) 21:45:09
1行入力のリッチエディットのウインドを作りました。
入力文字をセンタリングするにはどういう方法がありますか?

不良PG 2002/02/25(月) 22:22:39
>1行入力のリッチエディットのウインドを作りました。
どこにどうやって作ったかを明記しましょう。

>入力文字をセンタリングするにはどういう方法がありますか?
出来なかったと思います・・

kazuma 2002/02/26(火) 05:21:38
>入力文字をセンタリングするにはどういう方法がありますか?

ワードパッドが出来るんだから出来るはず。
MFC なら CRichEditCtrl::SetParaFormat とかです。たぶん。

不良PG 2002/02/26(火) 10:39:04
>ワードパッドが出来るんだから出来るはず。
>MFC なら CRichEditCtrl::SetParaFormat とかです。たぶん。
確かにワードパッドは出来ますが、ワードパッドは1行入力ではありません(複数行)
1行入力のリッチエディットコントロールでは、入力文字をセンタリング出来ません

sara 2002/02/26(火) 11:25:37
> 1行入力のリッチエディットコントロールでは、入力文字をセンタリング出来ません

 試してみましたが、1行入力でもCRichEditCtrl::SetParaFormatでセンタリング出来まし
た。

 確かに、リッチエディットプロパティダイアログでは、複数行をチェックしないとテキスト配
置のコンボボックスが有効になりませんが、上記の関数を使えば可能です。

不良PG 2002/02/26(火) 11:45:33
あら・・、出来るんですか?

.dwMask = PFM_ALIGNMENT;
.wAlignment = PFA_CENTER;

で指定したけど変わらなかったから駄目かと思ったのですが・・

どう指定すると変わるのですか?

sara 2002/02/26(火) 13:53:27
 ちょっと試すだけのつもりだったので、MFCでダイアログにリッチエディットコントロールと
プッシュボタンを貼り付けて、ボタンクリックするとセンタリングするようにつくってみたので
すが。指定の仕方は、不良PGさん と同じです。どういう状況だと駄目なのでしょう?

不良PG 2002/02/26(火) 14:23:10
ちなみにOSは、何で試しましたか?
この辺りってNT系と9x系で違いがあったような気がします・・(バグとか・・)

私は、VC6.0−SP5(NT4.0WS−SP6a)ですが・・

sara 2002/02/26(火) 14:25:52
> ちなみにOSは、何で試しましたか?
 Windows2000で VC++6.0 SP5 です。

不良PG 2002/02/26(火) 14:43:33
Windows XPで試してみたら出来ました(^^;

Windows 2000以降では、出来るようですね

あとついでにWindows Meも試しましたが、駄目でした。

sara 2002/02/26(火) 15:02:33
本当ですね。私もNTで試してみましたが、センタリング出来ませんでした。
こんなところにOSの制限があるとは。確認できて良かったです。

kazuma 2002/02/26(火) 18:19:05
となると思いつくのは複数行で作って、改行を入力できなくする。(ペースト時も含めて)
といったところでしょうか。

不良PG 2002/02/26(火) 18:22:18
>となると思いつくのは複数行で作って、改行を入力できなくする。(ペースト時も含めて)
>といったところでしょうか。
そんなところでしょうが・・

1行で済むのならリッチエディットを無理に使わなくてもいいような気がするのは、私だけ?

kazuma 2002/02/26(火) 18:31:43
>1行で済むのならリッチエディットを無理に使わなくてもいいような気がするのは、私だけ?

ねぇ。
色やフォントを文字単位で設定したくてなおかつユーザー入力が必要なら、
リッチエディットを使う価値もあるでしょうが。
あとRTFを読み込んで表示する場合とか。

その辺どうなんでしょう? > spark さん

spark 2002/02/27(水) 12:57:29
複数行で作って、改行を入力できなくする
というのもいいかもしれませんねー。
それまで思いつく方法は、入力文字の幅を調べて
左をスペースで埋める方法。見栄えはまあまあだけど
文字列に余計なスペースが入るし、ソースを書くのが面倒。
他に、透明なセンタリングのエディットボックスに文字を書き、
その下にリッチエディットを表示させるとか。

なぜリッチエディットなのかというと、

hREWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"RICHEDIT","",
        WS_CHILD | WS_VISIBLE | SS_CENTER,
        10,20,30,40,hWnd,NULL,hInst,NULL);

SendMessage(hREWnd, EM_SETBKGNDCOLOR, (WPARAM)0, (LPARAM)255);

これでエディットボックスの背景色を指定しているからです。
これではSS_CENTERが無効でした。

エディットボックスの背景色の指定とセンタリングが
同時に指定したくて、できなくて悩んでいる最中なんです。

MFCを知らないのですが、MFC なら CRichEditCtrl::SetParaFormat
というのはSDKだと別の書き方でできるのですか?

kazuma 2002/02/27(水) 13:14:01
背景色の変更だけなら普通のエディットボックスでも WM_CTLCOLOREDIT で出来ます。

普通のエディットボックスなら複数行でなくてもセンタリング出来ませんかね?
(少なくともWindows2000では出来ますが。)

> MFCを知らないのですが、MFC なら CRichEditCtrl::SetParaFormat
> というのはSDKだと別の書き方でできるのですか?

EM_SETPARAFORMAT メッセージです。

不良PG 2002/02/27(水) 13:40:27
>普通のエディットボックスなら複数行でなくてもセンタリング出来ませんかね?
>(少なくともWindows2000では出来ますが。)

WindowsNTでも出来ますね

spark 2002/02/27(水) 13:41:31
ありがとうございます。
今からEM_SETPARAFORMATをやってみます。

背景色の変更ならエディットボックスでWM_CTLCOLOREDITで出来るんですか?
やってみたけど、背景色は変わったけど、ボックス内の文字部分の
背景色は白です。この白を好きな色にする方法はありませんか?
これさえ分かればリッチエディットも必要ないのに。

kazuma 2002/02/27(水) 13:45:52
> やってみたけど、背景色は変わったけど、ボックス内の文字部分の
> 背景色は白です。この白を好きな色にする方法はありませんか?

WM_CTLCOLOREDIT のハンドラで SetBkColor します。

不良PG 2002/02/27(水) 13:46:38
引数のpDCに対してCDC::SetBkColorすれば良いのでは?

不良PG 2002/02/27(水) 13:50:15
しまった(^^;
引数は、HDCでしたね・・

spark 2002/02/27(水) 14:29:49
    case WM_CTLCOLOREDIT:
    SetBkColor((HDC)wParam, 45678);
    break;

これでは色が変わりませんでした。
これからEM_SETPARAFORMATのほうもやってみます。

kazuma 2002/02/27(水) 14:54:09
WM_CTLCOLOREDIT の戻り値はブラシを返すんですよ。

[spark 2002/02/27(水) 13:41:31] ではそうしてらしたと思うんですが、
それに加えて SetBkColor もするということです。

spark 2002/02/27(水) 14:54:24
ありがとうございます。

リッチエディットならWin98で
ES_MULTILINEスタイルの時のみ

PARAFORMAT pf;
memset(&pf, 0, sizeof(PARAFORMAT));
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
pf.wAlignment = PFA_CENTER;
SendMessage(hRich02, EM_SETPARAFORMAT, 0, (LPARAM)&pf);

でセンタリングできました。


エディットではWin98で

SetBkColor((HDC)wParam, 45678);

で成功していません。
これもOSがWin2000とかだとうまくいくんですか?

不良PG 2002/02/27(水) 14:56:17
SetBkColorだけでなく
ブラシのハンドルも返しましょう

    case WM_CTLCOLOREDIT:
        SetBkColor((HDC)wParam, 45678);
      return ( (LRESULT) hBrush );
        break;

spark 2002/02/27(水) 14:59:07
case WM_CTLCOLOREDIT:
return (LRESULT)(HBRUSH)SetBkColor((HDC)wParam, 45678);
break;

こうですか?
でも、背景色は白でした。

不良PG 2002/02/27(水) 15:02:46
>case WM_CTLCOLOREDIT:
>return (LRESULT)(HBRUSH)SetBkColor((HDC)wParam, 45678);
>break

あの・・、::SetBkColorの戻り値は、COLORREFですよ・・
それをHBRUSHにキャストしてどうするの?

hBrush = ::CreateSolidBrush( 45678 );
のように一度だけブラシを準備しておきましょう

不良PG 2002/02/27(水) 15:04:33
またもや
× のように一度だけブラシを準備しておきましょう
○ のように一度だけブラシを作成しておいて、使いましょう

spark 2002/02/27(水) 15:08:37
return (LRESULT)(HBRUSH)SetBkColor((HDC)wParam, 45678);
はめちゃくちゃです。意味も分からず書いてみました。

ありがとうございました。
リッチエディットなら1行でもES_MULTILINEにする。
エディットなら

hBrush = CreateSolidBrush(123);

 case WM_CTLCOLOREDIT:
  SetBkColor((HDC)wParam, 456);
  return ( (LRESULT) hBrush );
  break;

のように背景色と、文字部分の背景色をそれそれれ指定する。
間違った部分かあったらご指摘お願いします。

不良PG 2002/02/27(水) 15:12:10
忘れていましたが後始末も忘れずに・・

    case WM_DESTORY://例えば
        ::DeleteObject( hBrush );
        break;

spark 2002/02/27(水) 15:29:35
ありがとうございます。
WM_DESTORYで削除ですね。


LRESULT CALLBACK WndProc(
HBRUSH hBrush;

    case WM_CREATE:
    hBrush = CreateSolidBrush(123);
    break;

    case WM_CTLCOLOREDIT:
    //hBrush = CreateSolidBrush(123);
    SetBkColor( (HDC)wParam, 456 );
    return ( (LRESULT)hBrush );
    break;

    case WM_DESTORY:
    DeleteObject( hBrush );
    break;

この場合、//があるとブラシが使えませんでした。
WndProc()のすぐ下でブラシを宣言した場合は
WM_CTLCOLOREDITでブラシを使うにはどうしたらいいんですか?

不良PG 2002/02/27(水) 15:45:11
この辺りは、基本的なことですが・・
>WndProc()のすぐ下でブラシを宣言した場合は
>WM_CTLCOLOREDITでブラシを使うにはどうしたらいいんですか?
hBrushをスタティック変数にする。


あとグローバル変数にする方法もあります。

小タヌキ 2002/02/27(水) 15:47:15
static HBRUSH hBrush;にしないと毎回初期化されるのではないですか?

spark 2002/02/27(水) 15:49:37
[[解決]]
不良PGさん、kazumaさん、saraさんありがとうございます。
スタティックで解決しました。

古いスレッドには追加発言できません。