CreateExの使い方教えてください。

[戻る]
haruko 2006/06/10(土) 07:33:22
CRichEditCtrlで複数の子ウィンドウを作成したいと思っています。
そのウィンドウは透過にしたいので、Create()ではなくCreateEx()で作成しなければなら
ないと思うのですが、うまくいきません。

VC++は初心者なので、こんな質問をして申し訳ありませんが、助けてください。

環境は、VC++6.0、MFC、WiN98です。

よろしくお願いいたします。

dairygoods 2006/06/10(土) 08:06:02
どううまくいきませんか?
書いたコード、出るエラー、ヘルプを見て分からない点などを教えてください。

haruko 2006/06/10(土) 09:05:39
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;
}

よろしくお願いいたします。

dairygoods 2006/06/10(土) 12:21:15
CreateExの第二引数は適当では駄目です。
作りたいコントロールごとに名前が決まっています。

"CreateWindowEx"
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp

haruko 2006/06/10(土) 14:13:27
dairygoodsさんご親切にありがとうございます。やはり、第2引数がネックだったのですね。

>>作りたいコントロールごとに名前が決まっています。

リッチエディットコントロールの場合は、どんな名前なのでしょうか。
何もかもわからなくてごめんなさい。

Blue 2006/06/10(土) 14:25:02
dairygoods さんが載せてくださったサイト(MSDN)に載っていますよ。

<MSDN>
The following predefined control classes can be specified in the lpClassName 
parameter. 
・・・
RichEdit
・・・
</MSDN>

K 2006/06/10(土) 16:12:21
記憶違いかもしれませんが、WS_EX_TRANSPARENTでは
うまく透過Windowが作れなかった思います。

2000以降ならLayeredWindowが使えますが、
これもトップレベルWindowにしか使えなかった気が・・・

haruko 2006/06/10(土) 18:06:47
第2引数は、"RichEdit"ということでしょうか?
うまくいきません。コントロールも作成していないようです。

haruko 2006/06/11(日) 14:46:23
[[解決]]
いろいろと試してみました。
Create()関数で作成したウィンドウクラス名は"RICHEDIT"でした。
それをCreateEx()関数の第2パラメータにしたのですが、作成できませんでした。
どうも、このクラス名は定義されていないようです。
しかたないので、クラス名 "EDIT"にして作成しましたら、透過ウィンドウができました。
これから、不具合が出るかと思いますが、とりあえず、作成できたのでほっとしました。

dairygoods さん、Blueさん、Kさん本当に有難うございました。今後ともよろしくお願いいた
します。

dairygoods 2006/06/12(月) 09:09:50
クラス名は "RichEdit" でよいはずですが。
(大文字小文字は区別しません)

クラス名 "Edit" で作られるのはエディットボックスですよ。

subaru 2006/06/12(月) 10:25:01
アプリケーション起動時に
AfxInitRichEdit/AfxInitRichEdit2
を呼び出していますか?

haruko 2006/06/13(火) 11:11:00
dairygoods さん、ありがとうございます。

>>クラス名 "Edit" で作られるのはエディットボックスですよ。

そうですね。エディットコントロールです。CRichEditCtrlのメンバー関数を受け付けないで
す。
たとえば、
    m_rich[num].SetSelectionCharFormat(cf);

う〜ん、困りました。


subaru さん、ありがとうございます。

>>アプリケーション起動時にAfxInitRichEdit/AfxInitRichEdit2を呼び出していますか?

CRichEditCtrlクラスを使用する場合、どこで初期化すれば良いのですか?


頭痛いです。

Blue 2006/06/13(火) 12:00:50
> どこで初期化すれば良いのですか?
アプリケーションクラスのInitInstance関数内かなぁ。

haruko 2006/06/13(火) 13:26:03
[[解決]]
できました。

アプリケーション起動時に
AfxInitRichEdit()で初期化したらできました。

嬉しいです。皆さんどうもありがとうございました。

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