CRichEditCtrlで複数の子ウィンドウを作成したいと思っています。
そのウィンドウは透過にしたいので、Create()ではなくCreateEx()で作成しなければなら
ないと思うのですが、うまくいきません。
VC++は初心者なので、こんな質問をして申し訳ありませんが、助けてください。
環境は、VC++6.0、MFC、WiN98です。
よろしくお願いいたします。
どううまくいきませんか?
書いたコード、出るエラー、ヘルプを見て分からない点などを教えてください。
dairygoodsさん早速ありがとうございます。
ヘルプや分厚い参考書を見て、いろいろ弄りまわしているため、変になってしまっています。
Create()ではできていたのですが、CreateEx()にしたら、リッチエディットコントールは作
成しているようなのですが(デバッグで確認)、左クリックをしてもカ-ソルが変わらなく、文
字入力ができません。本当に初歩の質問で申し訳ありません。
第2パラメータのWindowsのクラス名が原因かと思い、今いじくりまわしている最中です。
public:
int num;
CRichEditCtrl m_rich[10];
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォル
トの処理を呼び出してください
CRect rect(0, 0, 0, 0);
CRect lpRect;
CHARFORMAT cf,*p;
CString winname;
winname = テキスト;
m_rich[num].CreateEx(WS_EX_TRANSPARENT, winname, NULL ,
ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN | WS_CHILD | WS_VISIBLE , rect,
this,num ) ;
// m_rich[num].Create(ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN |
WS_CHILD | WS_VISIBLE , rect, this,num );
m_rich[num].SetWindowPos(&wndTop, point.x, point.y, 400, 100,
SWP_SHOWWINDOW);
m_rich[num].GetRect(lpRect);
m_rich[num].SetWindowPos(&wndTop, point.x, point.y, lpRect.right,
lpRect.bottom, SWP_SHOWWINDOW);
num++;
CView::OnLButtonDown(nFlags, point);
}
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: この位置に固有の作成用コードを追加してください
CString winname;
num = 0;
winname = AfxRegisterWndClass(NULL,0,0,0);
CRect rect(20,20, 250, 150);
m_rich[num].CreateEx(WS_EX_TRANSPARENT, winname, NULL ,
ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN | WS_CHILD | WS_VISIBLE , rect,
this,num );
// m_rich[num].Create(ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN |
WS_CHILD | WS_VISIBLE , rect, this,num );
num++;
return 0;
}
よろしくお願いいたします。
CreateExの第二引数は適当では駄目です。
作りたいコントロールごとに名前が決まっています。
dairygoodsさんご親切にありがとうございます。やはり、第2引数がネックだったのですね。
>>作りたいコントロールごとに名前が決まっています。
リッチエディットコントロールの場合は、どんな名前なのでしょうか。
何もかもわからなくてごめんなさい。
dairygoods さんが載せてくださったサイト(MSDN)に載っていますよ。
<MSDN>
The following predefined control classes can be specified in the lpClassName
parameter.
・・・
RichEdit
・・・
</MSDN>
記憶違いかもしれませんが、WS_EX_TRANSPARENTでは
うまく透過Windowが作れなかった思います。
2000以降ならLayeredWindowが使えますが、
これもトップレベルWindowにしか使えなかった気が・・・
第2引数は、RichEditということでしょうか?
うまくいきません。コントロールも作成していないようです。
いろいろと試してみました。
Create()関数で作成したウィンドウクラス名はRICHEDITでした。
それをCreateEx()関数の第2パラメータにしたのですが、作成できませんでした。
どうも、このクラス名は定義されていないようです。
しかたないので、クラス名 EDITにして作成しましたら、透過ウィンドウができました。
これから、不具合が出るかと思いますが、とりあえず、作成できたのでほっとしました。
dairygoods さん、Blueさん、Kさん本当に有難うございました。今後ともよろしくお願いいた
します。
クラス名は RichEdit でよいはずですが。
(大文字小文字は区別しません)
クラス名 Edit で作られるのはエディットボックスですよ。
アプリケーション起動時に
AfxInitRichEdit/AfxInitRichEdit2
を呼び出していますか?
dairygoods さん、ありがとうございます。
>>クラス名 Edit で作られるのはエディットボックスですよ。
そうですね。エディットコントロールです。CRichEditCtrlのメンバー関数を受け付けないで
す。
たとえば、
m_rich[num].SetSelectionCharFormat(cf);
う~ん、困りました。
subaru さん、ありがとうございます。
>>アプリケーション起動時にAfxInitRichEdit/AfxInitRichEdit2を呼び出していますか?
CRichEditCtrlクラスを使用する場合、どこで初期化すれば良いのですか?
頭痛いです。
> どこで初期化すれば良いのですか?
アプリケーションクラスのInitInstance関数内かなぁ。
できました。
アプリケーション起動時に
AfxInitRichEdit()で初期化したらできました。
嬉しいです。皆さんどうもありがとうございました。