我做了一个对话框, 背景贴上位图, 中间放一个编辑控件.
属性TRANSPARENT设为真. 属性MULTILINE设为假.问题1: 此时的编辑控件不为透明, 如果把MULTILINE设为真, 编辑控件此时为透明, 是我想要的结果, 但是对于MULTILINE总觉得不是我要的.耿耿于怀.问题是为什么要把MULTILINE设为真
问题2: 在MULTILINE为真的情况下, 编辑控件为透明, 但是在编辑时按退格不会擦除最后一个输入的字符.但是可以看到光标退后了一格. 如果你再输入一个字符号, 这个最新的字符就会重叠在那个擦不掉的字符上, 一片狼籍.
如果MULTILINE为假的情况下, 尽管不是我要的透明效果, 但是退格效果正常.
结论: 是不是因为在透明情况下, 因为系统无法确定在位图上的原先未输入字符的原始状态, 于是就采取了回避问题的措施?请高手解释, 并能给出比较理想的解决方案. 我现在采用了INVALIDATE后重画对话框的方法, 但是引起了屏幕闪烁, 不太理想. 谢谢

解决方案 »

  1.   

    不如把源程序发到[email protected]。我看看。
      

  2.   

    如果任何人需要我的程序的话, 留下EMAIL
      

  3.   

    请发一份给我[email protected],我正想弄个MSN的窗口。
      

  4.   

    解决方法(API方式):
    需要subclass自己处理编辑控件的窗口过程,处理WM_HSCROLL,WM_VSCROLL,WM_CHAR,WM_KEYDOWN消息,在这几个消息里先CallWindowProc默认处理,然后InvalidateRect(hWnd,NULL,TRUE);
      

  5.   

    透明控件没有进行Erase Background(不会擦除现有内容),就直接绘制窗口(控件),所以会混在一起。搂主可以试试先在WM_ERASEBKGND里把Background保存到一个CBitmap,然后在WM_PAINT里将这个CBitmap绘制出来,再调用::OnPaint。
      

  6.   

    谢楼上两位, 对于ringphone(临风) 的方法, 我用了以下语句, 好象没有用: CWnd *cwndMy ;
    cwndMy = GetDlgItem(IDC_USERID);
    CRect rc;
             cwndMy->GetClientRect(&rc);
    ::InvalidateRect(cwndMy->m_hWnd,(LPCRECT )rc,TRUE);
    不知道我的这些对不对.对于LendyZhang(Lendy Zhang)的方法, 我不知道如何取得制定窗口的位图.
      

  7.   

    楼主你的代码放在了编辑控件的窗口过程外面是不行的,要这样:CWnd *cwndMy ;
    cwndMy = GetDlgItem(IDC_USERID);
    WNDPROC defEditProc = ::SetWindowLong(cwndMy->m_hWnd,GWL_WNDPROC,(LONG)MyEditProc);LRESULT CALLBACK MyEditProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    switch(uMsg)
    {
    case WM_HSCROLL:
    case WM_VSCROLL:
    case WM_CHAR:
    case WM_KEYDOWN:
    {
    LRESULT res = CallWindowProc(defEditProc,hWnd,uMsg,wParam,lParam);
    InvalidateRect(hWnd,NULL,TRUE);
    return res;
    }
    }
    return CallWindowProc(defEditProc,hWnd,uMsg,wParam,lParam);
    }其实你应该从CEdit派生一个类,处理上面4个消息。
      

  8.   

    谢谢临风:我不是很理解你的解决问题的方法, 也许和我要求的有点远了, 事实上LendyZhang(Lendy Zhang) 的方法是确实可行的, 尽管他没有给我具体的代码, 但是给我一个解决问题的思路, 我按照这个死路走了下去, 正好看到候捷先生的书上如何在控件上设置颜色的章节, 我做了以下的改动:CWnd* pWnd = GetDlgItem(IDC_USERID);CDC* pControlDC = pWnd->GetDC();
    pWnd->Invalidate();
    pWnd->UpdateWindow();pControlDC->SelectStockObject(WHITE_BRUSH);
    CRect rc;
    pWnd->GetClientRect(&rc);
    pControlDC->Rectangle(rc.left, rc.top, rc.Width(), rc.Height());pWnd->ReleaseDC(pControlDC);
    现在的问题就是如何保存在EDIT上先前原始的图象, 和恢复这个小图象的问题
      

  9.   

    可以用CreatePatternBrush把背景图生成一个BRUSH,用这个BRUSH画背景。不过要计算一下控件在这个图上的位置,SetBrushOrgEx,把原点设置到与对话框背景重合。
    我也正在研究编辑控件加背景图的问题,发现在WIN98下编辑控件加背景图没有问题,但是在Win2000下发现编辑控件必须是MULTILINE才会表现正常,如果不是MULTILINE,文字背景变成了默认背景色,覆盖背景图案。再研究一下源代码,发现多行和单行的确是分别处理的,Win2000在绘制文字时先SetBkMoke设成不透明,没办法让其不透明。你MULTILINE设为假,仔细观察应该能发现控件中间有一圈(宽度为一个象素)是有背景的。这个问题我还没想出来怎么解决。
      

  10.   

    http://www.codeguru.com/Cpp/controls/editctrl/transparent/article.php/c3921/Shailesh N. Kanzariya (view profile)
    January 23, 2003  
    Environment: Tested Platforms: Windows 98, Windows 2000, Windows NTI have written this article to make an edit box transparent. It is very easy to make it transparent when there isn't a bitmap image in the dialog background. But, if you have a bitmap in your dialog background and you make editbox transparent, it will become transparent but will not be redrawn properly.I have found <B>many programmers suffering with this problem,</B> including me, until I wrote this article. The problem was that making an edit box transparent is very easy in a common case, but whenever you use a bitmap background, it will become a little hard to do. The main problem is that the contents of the edit box will not be redrawn properly.Here, with this cool code, I have solved this problem. I hope it will be helpful to someone.一个很好的例子! 希望你有用!
      

  11.   

    噢,难题哦~~~
    曾经想做成象windows里的画图透明文字那样,最后以失败告终 >_<
    不过,现在好象想到办法了,试试先,kaka..
      

  12.   

    to Hotthing(豪星) :
    你提供的例子在WIN2000下试过吗?EDIT控件其他部分有图案,文字背景还是不透明的。
      

  13.   

    To: ringphone(临风)那个例子确实可行, 非常理想, 我已经用上了, 谢谢你们几位