我做了一个对话框, 背景贴上位图, 中间放一个编辑控件.
属性TRANSPARENT设为真. 属性MULTILINE设为假.问题1: 此时的编辑控件不为透明, 如果把MULTILINE设为真, 编辑控件此时为透明, 是我想要的结果, 但是对于MULTILINE总觉得不是我要的.耿耿于怀.问题是为什么要把MULTILINE设为真
问题2: 在MULTILINE为真的情况下, 编辑控件为透明, 但是在编辑时按退格不会擦除最后一个输入的字符.但是可以看到光标退后了一格. 如果你再输入一个字符号, 这个最新的字符就会重叠在那个擦不掉的字符上, 一片狼籍.
如果MULTILINE为假的情况下, 尽管不是我要的透明效果, 但是退格效果正常.
结论: 是不是因为在透明情况下, 因为系统无法确定在位图上的原先未输入字符的原始状态, 于是就采取了回避问题的措施?请高手解释, 并能给出比较理想的解决方案. 我现在采用了INVALIDATE后重画对话框的方法, 但是引起了屏幕闪烁, 不太理想. 谢谢
属性TRANSPARENT设为真. 属性MULTILINE设为假.问题1: 此时的编辑控件不为透明, 如果把MULTILINE设为真, 编辑控件此时为透明, 是我想要的结果, 但是对于MULTILINE总觉得不是我要的.耿耿于怀.问题是为什么要把MULTILINE设为真
问题2: 在MULTILINE为真的情况下, 编辑控件为透明, 但是在编辑时按退格不会擦除最后一个输入的字符.但是可以看到光标退后了一格. 如果你再输入一个字符号, 这个最新的字符就会重叠在那个擦不掉的字符上, 一片狼籍.
如果MULTILINE为假的情况下, 尽管不是我要的透明效果, 但是退格效果正常.
结论: 是不是因为在透明情况下, 因为系统无法确定在位图上的原先未输入字符的原始状态, 于是就采取了回避问题的措施?请高手解释, 并能给出比较理想的解决方案. 我现在采用了INVALIDATE后重画对话框的方法, 但是引起了屏幕闪烁, 不太理想. 谢谢
解决方案 »
- 关于 AppendMenu使用中的问题
- 求助~~和COMBOBOXINFO有关
- 如何删除光盘的驱动,都有哪些函数。
- 平面坐标中 直角三角形 已知两点坐标和邻边与斜边夹角 求另一点坐标!
- 在对话框显示时设置按钮焦点
- VC程序启动时的错误
- 请问哪位大下我建了一个单文档工程,为什么在ClassView中看不到MyView类,而在FileView里可以看到,我该怎么办呀?
- MFC中使用水晶报表的问题。。急急急
- view更新问题,在线等待,希望高手帮助解决
- vs2010 窗口体分割
- 我想学tcp/ip,望高手能提供相关书籍或者资料
- 我写了个gui的扫描器,但是只要多个扫描线程启动后,界面就不能动了,相应不了用户操作
需要subclass自己处理编辑控件的窗口过程,处理WM_HSCROLL,WM_VSCROLL,WM_CHAR,WM_KEYDOWN消息,在这几个消息里先CallWindowProc默认处理,然后InvalidateRect(hWnd,NULL,TRUE);
cwndMy = GetDlgItem(IDC_USERID);
CRect rc;
cwndMy->GetClientRect(&rc);
::InvalidateRect(cwndMy->m_hWnd,(LPCRECT )rc,TRUE);
不知道我的这些对不对.对于LendyZhang(Lendy Zhang)的方法, 我不知道如何取得制定窗口的位图.
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个消息。
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上先前原始的图象, 和恢复这个小图象的问题
我也正在研究编辑控件加背景图的问题,发现在WIN98下编辑控件加背景图没有问题,但是在Win2000下发现编辑控件必须是MULTILINE才会表现正常,如果不是MULTILINE,文字背景变成了默认背景色,覆盖背景图案。再研究一下源代码,发现多行和单行的确是分别处理的,Win2000在绘制文字时先SetBkMoke设成不透明,没办法让其不透明。你MULTILINE设为假,仔细观察应该能发现控件中间有一圈(宽度为一个象素)是有背景的。这个问题我还没想出来怎么解决。
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.一个很好的例子! 希望你有用!
曾经想做成象windows里的画图透明文字那样,最后以失败告终 >_<
不过,现在好象想到办法了,试试先,kaka..
你提供的例子在WIN2000下试过吗?EDIT控件其他部分有图案,文字背景还是不透明的。