- ベストアンサー
CEditクラスの透過について
- CEditクラスの派生による透過処理について
- 親ウィンドウの画面をコピーしてCEditクラスに貼り付ける方法
- 文字の部分の処理方法について
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
WM_CTLCOLOREDITに対する戻り値、間違ってますね。 背景ブラシのハンドルを返せばいいんですよ。 そのままWndProcに渡しちゃってますけど。 >もっとスマートに出来るかもしれないので スマートにというのでしたら、CEditの派生クラスを作る必要も無いってことかな。 OnCtlColorのハンドラですが、MFCではWin3.1のころとの互換性のために、WM_CTLCOLORに対するハンドラを作成し、その中で、コントロールの種別を判断していきます。 なので、WndProcをオーバーライドする必要は無いです。 で、この中でTRANSPARENTに指定すれば問題ないはずです。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.onctlcolor.asp ということで、ヘルプに思いっきりサンプルありますね。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
SetBkMode(TRANSPARENT)で透過にして、 OnCtlColorを処理して背景色を変更すれば出来た気が。 で、thulalaさんがかかれた処理、どこのメッセージハンドラに書かれてるんですか?
お礼
すみません、いつもお世話になっています。 質問したときはよくわからなかったのですが その後も考えました。 Viewにて、 LRESULT CTransEditView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 if(message==WM_CTLCOLOREDIT) { HDC hDC = (HDC)wParam; HWND hCtrl = (HWND)lParam; SetBkMode(hDC, TRANSPARENT); // 背景を塗りつぶし SetTextColor(hDC, RGB(255,0,0)); // テキストの色 SetBkColor(hDC,RGB(192,192,192)); // テキストが書かれている部分のテキストの背景の色 } return CView::WindowProc(message, wParam, lParam); } BOOL CTransEditView::OnEraseBkgnd(CDC* pDC){return 0;} としました。 BOOL mEdit::OnEraseBkgnd(CDC* pDC) { // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 return 0; return CEdit::OnEraseBkgnd(pDC); } CEditの派生クラスmEditで、 void mEdit::OnEnChange() { // TODO : これが RICHEDIT コントロールの場合、まず、CEdit::OnInitDialog() 関数をオーバーライドして、 // OR 状態の ENM_CORRECTTEXT フラグをマスクに入れて、 // CRichEditCtrl().SetEventMask() を呼び出さない限り、 // コントロールは、この通知を送信しません。 GetParent()->Invalidate(); // TODO : ここにコントロール通知ハンドラ コードを追加してください。 } としましたら出来ているような気がします。 一応出来たのですが、 もっとスマートに出来るかもしれないので 教えていただいた方法もやらせていただきます。 ありがとうございました。
補足
CEditの派生クラスmEditを以下のようにしました。 // mEdit.cpp : 実装ファイル // #include "stdafx.h" #include "TransEdit.h" #include "mEdit.h" #include ".\medit.h" // mEdit IMPLEMENT_DYNAMIC(mEdit, CEdit) mEdit::mEdit() { } mEdit::~mEdit() { } BEGIN_MESSAGE_MAP(mEdit, CEdit) ON_WM_ERASEBKGND() ON_CONTROL_REFLECT(EN_CHANGE, OnEnChange) END_MESSAGE_MAP() // mEdit メッセージ ハンドラ BOOL mEdit::OnEraseBkgnd(CDC* pDC) { return 0; return CEdit::OnEraseBkgnd(pDC); } void mEdit::OnEnChange() { GetParent()->Invalidate(); } LRESULT mEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { /*if(message==WM_CTLCOLOREDIT) {*/ HDC hDC = (HDC)wParam; HWND hCtrl = (HWND)lParam; SetBkMode(hDC, TRANSPARENT); SetTextColor(hDC, RGB(255,0,0)); SetBkColor(hDC,RGB(192,192,192)); /*}*/ return CEdit::WindowProc(message, wParam, lParam); } それで、 if(message==WM_CTLCOLOREDIT)の部分が親ウインドウの部分らしいので 動作しませんでした。 WM_CTLCOLOREDITの代わりになるメッセージは何なんでしょうか? よそしくお願いします。
お礼
回答ありがとうございます。 ご意見のとおりやってみましたら、出来ました。 Edit.Create()ひとつで透過させたかったのですが、 CEditの派生クラスを作る必要ないかもしれないですね。 ありがとうございました。 HBRUSH mEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/) { pDC->SetBkMode(TRANSPARENT); //return (HBRUSH)NULL_BRUSH; return NULL; }