社区
界面
帖子详情
请问 如何实现透明的edit?
platinum15
2005-09-26 04:12:58
请问 如何实现透明的edit?
...全文
257
2
打赏
收藏
请问 如何实现透明的edit?
请问 如何实现透明的edit?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dawndu
2005-09-26
打赏
举报
回复
做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠标消息的时候 ,还有就是在接收到WM_PAINT消息。刷新的时候也不是全部重画,所以想通过在继承的Edit类中处理WM_PAINT消息是行不通的。但是Edit控件自己总是知道怎么去刷新,因此只要给控件发消息,让其自己来刷新就可以了。通过使用spy++的得知需要刷新有几个时机,一个是按键的时候,内容变化,另一个是选择变化的时候,前者Edit控件会接收到GetCtlCode和KeyUp 消息,后者会接收到GetCtlCode和CaptureChange消息或KeyUp消息,因此在GetCtlCode里调用ReDrawWindow来强迫Edit刷新 整个控件。在ReDrawWindow中通过使用参数RDW_ERASE可以使控件重画背景,即调用OnEraseBkgnd(CDC* pDC),在该函数中重 画背景。比较特殊的情况是按住鼠标左键并来回拖动鼠标的时候,这时候选择要改变,接收的消息是MouseMove,为了正 确响应也要处理该消息,但是在每一个MouseMove中都刷新显示的开销太大,而且不可避免地有闪烁感,因此只有在鼠标左 键按下的时候才刷新显示。
大概的代码如下,主要是继承了一个CEdit的对象CTpEdit,使用的时候可以动态创建,或者采用SubClass的方法。我用的是后者。
class CTESTDLG : public CDialog
{
......
//声明一个CTpEdit的成员变量
private:
CTpEdit m_tpedit;
};
//在OnInitDialog中Subclass对话框模板中的Edit控件
BOOL CTESTDLG::OnInitDialog()
{
CDialog::OnInitDialog();
m_tpedit.SubclassDlgItem(IDC_EDIT,this);
return TRUE;
}
//在OnCtlColor中设置背景的透明,要改变Edit控件字体的颜色也在这里
HBRUSH CTESTDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID()==IDC_EDIT))
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就
//是所谓的空心字,而不是有白的底色
pDC->SetTextColor(RGB(255,0,0)); //改变字体的颜色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr;
}
//CTpEdit对象
class CTpEdit : public CEdit
{
public:
//m_mousedown用来记录鼠标左键是否按下
BOOL m_mousedown;
protected:
//响应如下的消息
//{{AFX_MSG(CTpEdit)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//CTpEdit的消息响应函数如下
//画背景图
BOOL CTpEdit::OnEraseBkgnd(CDC* pDC)
{
//得到Edit控件的外框,即背景区域
RECT updatarect;
GetClientRect(&updatarect);
//画背景,我画的是一个黄色的矩形
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(255,255,200));
CBrush * oldBrush = pDC->SelectObject(&newBrush);
pDC->Rectangle(&updatarect);
pDC->SelectObject(oldBrush);
return TRUE;
}
//强迫Edit控件擦除背景,重写字符
UINT CTpEdit::OnGetDlgCode()
{ RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
return CEdit::OnGetDlgCode();
}
//记录鼠标左键是否按下
void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
m_mousedown = TRUE;
SetCapture();
CEdit::OnLButtonDown(nFlags, point);
}
void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_mousedown)
ReleaseCapture();
m_mousedown = FALSE;
CEdit::OnLButtonUp(nFlags, point);
}
//如果左键按下并且拖动鼠标就要刷新显示
void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_mousedown)
RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
CEdit::OnMouseMove(nFlags, point);
}
//初始化成员变量
CTpEdit::CTpEdit()
{
m_mousedown=FALSE;
}
MFC DirectUI源码
界面库 mfc directui 类似JJ斗地主游戏大厅的源代码。
MFC
透明
Edit
1、 2、 3、 4、
MFC
实现
窗口
透明
,并显示一张
透明
PNG图片
参考了大佬的文章,记录一下过程,帮助记忆。
实现
了窗口背景
透明
,button、
edit
控件不
透明
可以看到窗口变成
透明
的了,并且载入了一张
透明
的png图片 代码如下: 在头文件中加入:CImage img BOOL CMFC301
透明
窗体Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单...
MFC设置
透明
背景,
Edit
Control添加滑轮导致文本出现重叠问题
这个问题我查了好多资料都没解决,我自己最后想了一种办法来解决它,大家一起可以交流。 1、首先创建MFC工程,
edit
control将背景设置
透明
,以及怎么添加滚轮(设置几个属性即可),这些我都不介绍了的童鞋可以下方评论,我会详细讲解。 2、现在问题是当我们滚动滑轮时会出现文字叠影问题。如图: 3、出现这样的问题是由于我们的主界面背景图片与控件
透明
设置冲突造成的,我们只需要在滚轮移动式刷...
DelphiXE
实现
透明
、圆角、随意拖动的窗口
实现
在应用当中我们有时候要
实现
透明
、圆角、随意拖动的窗口在应用的最顶层,那么怎么
实现
呢,下面我列出我的代码。 效果图如下: 代码如下: unit FrmTranWinPas; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Gr...
界面
15,978
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章