关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

时间:2023-02-10 21:01:58
关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

如图所示  
问题有两个:
1.TextOut输出一段文字无法透明
我已经查过好多资料  
”dc.SetBkMode (TRANSPARENT); //背景模式为透明  “这句话我用了  可就是不能透明,背景是白的  是不是和我在桌面上画有关呢?

2.两次输出会重叠的问题:如图 德玛西亚 和后面的字幕重叠 
  我查的资料好多人建议用InvalidateRect() 可是这个参数我不太会填
而且我查的它是指定矩形区域重绘,将来我这几个字时要动的,怎么办呢?



部分关键代码如下

void CDMtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CWindowDC dc(NULL);  
//  CRect rect;
//  GetClientRect(&rect);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("Arial")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/* hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
dc.TextOut(500,500,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
}
}

30 个解决方案

#1


你不能drawtext?

#2


顶起 求关心   关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#4


引用 3 楼 shen_wei 的回复:
http://tech.sina.com.cn/c/1162.html
关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题能说的详细点吗?

#5


保留       CPaintDC dc(this); // 用于绘制的设备上下文

#6


         dc.TextOut(0,0,_T("德玛西亚"));  

#7


引用 5 楼 schlafenhamster 的回复:
保留       CPaintDC dc(this); // 用于绘制的设备上下文

这个我不是太明白

“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,如果保留的话这个dc就只是窗口的了啊

#8


你在
void CDMtestDlg::OnPaint()
没有  CPaintDC dc(this); // 刷新窗口, 使窗口有效.
可能 因为 对话框窗口 总是无效, 而 Onpaint 不止.

 dc.TextOut(0,0,_T("德玛西亚")); 
是让你 把字画到 对话框外.

#9


“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,
这句还是要的!

#10


或者:
// CPaintDC dc1(this); // device context for painting
CDialog::OnPaint();
CWindowDC dc(NULL);  

#11


引用 10 楼 schlafenhamster 的回复:
或者:
// CPaintDC dc1(this); // device context for painting
CDialog::OnPaint();
CWindowDC dc(NULL);  

关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题  我还是没搞好

void CDMtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc1(this);//刷新窗口, 使窗口有效.
CWindowDC dc(NULL);  
//  CRect rect;
//  GetClientRect(&rect);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("Arial")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/* hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
//HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
//InvalidateRect(NULL,FALSE);
dc.TextOut(200,0,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
}
}

onpaint函数里面的else加上了“ CPaintDC dc1(this);//刷新窗口, 使窗口有效.”这行,可是效果还是没变
关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题   可能是我太笨了 

#12


顶一下 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#13


顶一下 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#14


dc.TextOut(500,500,_T("德玛西亚")); 
是透明的.
"hechao" 哪里来的?
现在的图是
"hechao" 在下面. "德玛西亚" 在它上面 (也是透明的)

#15


很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容

#16


所以叫他画到对话框外看看:
dc.TextOut(0,0,_T("德玛西亚")); 

#17


引用 16 楼 schlafenhamster 的回复:
所以叫他画到对话框外看看:
dc.TextOut(0,0,_T("德玛西亚")); 


我这个就是画到了对话框外面 ,我的目的就是在屏幕上任意地方显示这些字...
是不是我一开始采取的方法就不对 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#18


"hechao" 哪里来的?

dc.TextOut(0,0,_T("德玛西亚"));  已经是第二次

#19


引用 15 楼 Idle_ 的回复:
很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容

非常感谢,我稍微明白了:其实他是透明的,只不过透明的背景不是我想要的
我的目的就是在屏幕上任意地方显示这些字...像 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题
这样,该如何改呢? 

#20


参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”

#21


引用 20 楼 schlafenhamster 的回复:
参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”


好的 谢谢 我试着看看

#22


引用 20 楼 schlafenhamster 的回复:
参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”

下载保存待用。

#23


使用双内存缓冲防止闪烁,写入前先刷新背景再写文字。

#24


引用 23 楼 wxhxj0268 的回复:
使用双内存缓冲防止闪烁,写入前先刷新背景再写文字。


不会刷新背景啊  求指点 

#25


桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.
所以首先要创建透明窗口.
BOOL CTextOutDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

//窗口透明化
ModifyStyleEx(NULL, WS_EX_LAYERED);
SetLayeredWindowAttributes(0, 50/*值1-255,越小越透明*/, LWA_ALPHA);
//去掉标题栏
ModifyStyle(WS_CAPTION, 0); 

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTextOutDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("宋体")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/*    hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
dc.TextOut(100,100,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
CDialog::OnPaint();
}
}

#26


引用 25 楼 zwfgdlc 的回复:
桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.
所以首先要创建透明窗口.
BOOL CTextOutDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

//窗口透明化
ModifyStyleEx(NULL, WS_EX_LAYERED);
SetLayeredWindowAttributes(0, 50/*值1-255,越小越透明*/, LWA_ALPHA);
//去掉标题栏
ModifyStyle(WS_CAPTION, 0); 

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTextOutDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("宋体")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/*    hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
dc.TextOut(100,100,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
CDialog::OnPaint();
}
}

照这样做之后,窗口虽然透明了,但是输出的字也透明了 
http://bbs.csdn.net/topics/330203668  这个哥们好像实现了  但是看不太懂

#27


其实 就是 做个 “异型” 窗口。

使用 SetWindowRgn 函数。

1. 创建 内存 DC
2. memDC 背景 填白
3. 把 字符 画到  memDC
4. 遍历 每个 点, 把 白的点 去除, 留下 字符点 成为 一个点 的 rgn, 把 所有点 (rgn) combine 起来 , 成 一个 字符串 rgn
5. SetWindowRgn

#28


void CxxxDlg::StrRgn(CString &str)
{
CRect rc;
GetWindowRect(rc);

CWindowDC dc(this);
CDC memDC;
memDC.CreateComPatibleDC(&dc);

CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
HBITMAP old=(BITMAP)memDC.SelectObject(bmp);
// fill background
memDC.FillSolidRect(&rc,RGB(255,255,255));
// text
HFONT oldFont=(HFONT)memDC.SelectObject(m_Font);// 在初始化时创建
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(2,2,str);
// creat window rgn
int x,y;
CRgn wndRgn,tmpRgn;
wndRgn.CreateRectRgn(0,0,0,0);
// 
for(x=0;x<=rc.Width();x++)
{
    for(y=0;y<rc.Height();y++)
    {
         if(memDC.GetPixel(x,y) < RGB(250,250,250))
         {// add one point
             tmpRgn.CreateRectRgn(x,y,x+1,y+1);// one point rgn
             wndRgn.CombineRgn(&wndRgn,&tmpRgn,RGN_OR);// sum of all points
             tmpRgn.DeleteObject();
         }
    }
}
//
SetWindowRgn((HRGN)wndRgn,TRUE);
// free
memDC.SelectObject(old);
memDC.SelectObject(oldFont);
wndRgn.DeleteObject();
}

// move Window 在字符串里 移动窗口!
UINT CxxxDlg::OnNcHitTest()
{
UINT nHitTest=CDialog::OnNcHitTest();
return(nHitTest==HTCLIENT) ? HTCAPTION : nHitTest);
}

在对话框 初始化中:

StrRgn(CString("哈哈"));

对话框属性 无标题

#29


改进:
CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left,-rc.top);
否则第二次 调用这个函数时 , 坐标会错误。

#30


楼主,我现在要用TextOut编写桌面歌词,能告诉我怎么实现字体背景透明吗?

#1


你不能drawtext?

#2


顶起 求关心   关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#3


#4


引用 3 楼 shen_wei 的回复:
http://tech.sina.com.cn/c/1162.html
关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题能说的详细点吗?

#5


保留       CPaintDC dc(this); // 用于绘制的设备上下文

#6


         dc.TextOut(0,0,_T("德玛西亚"));  

#7


引用 5 楼 schlafenhamster 的回复:
保留       CPaintDC dc(this); // 用于绘制的设备上下文

这个我不是太明白

“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,如果保留的话这个dc就只是窗口的了啊

#8


你在
void CDMtestDlg::OnPaint()
没有  CPaintDC dc(this); // 刷新窗口, 使窗口有效.
可能 因为 对话框窗口 总是无效, 而 Onpaint 不止.

 dc.TextOut(0,0,_T("德玛西亚")); 
是让你 把字画到 对话框外.

#9


“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,
这句还是要的!

#10


或者:
// CPaintDC dc1(this); // device context for painting
CDialog::OnPaint();
CWindowDC dc(NULL);  

#11


引用 10 楼 schlafenhamster 的回复:
或者:
// CPaintDC dc1(this); // device context for painting
CDialog::OnPaint();
CWindowDC dc(NULL);  

关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题  我还是没搞好

void CDMtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc1(this);//刷新窗口, 使窗口有效.
CWindowDC dc(NULL);  
//  CRect rect;
//  GetClientRect(&rect);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("Arial")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/* hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
//HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
//InvalidateRect(NULL,FALSE);
dc.TextOut(200,0,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
}
}

onpaint函数里面的else加上了“ CPaintDC dc1(this);//刷新窗口, 使窗口有效.”这行,可是效果还是没变
关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题   可能是我太笨了 

#12


顶一下 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#13


顶一下 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#14


dc.TextOut(500,500,_T("德玛西亚")); 
是透明的.
"hechao" 哪里来的?
现在的图是
"hechao" 在下面. "德玛西亚" 在它上面 (也是透明的)

#15


很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容

#16


所以叫他画到对话框外看看:
dc.TextOut(0,0,_T("德玛西亚")); 

#17


引用 16 楼 schlafenhamster 的回复:
所以叫他画到对话框外看看:
dc.TextOut(0,0,_T("德玛西亚")); 


我这个就是画到了对话框外面 ,我的目的就是在屏幕上任意地方显示这些字...
是不是我一开始采取的方法就不对 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题

#18


"hechao" 哪里来的?

dc.TextOut(0,0,_T("德玛西亚"));  已经是第二次

#19


引用 15 楼 Idle_ 的回复:
很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容

非常感谢,我稍微明白了:其实他是透明的,只不过透明的背景不是我想要的
我的目的就是在屏幕上任意地方显示这些字...像 关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题
这样,该如何改呢? 

#20


参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”

#21


引用 20 楼 schlafenhamster 的回复:
参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”


好的 谢谢 我试着看看

#22


引用 20 楼 schlafenhamster 的回复:
参考
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”

“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”

下载保存待用。

#23


使用双内存缓冲防止闪烁,写入前先刷新背景再写文字。

#24


引用 23 楼 wxhxj0268 的回复:
使用双内存缓冲防止闪烁,写入前先刷新背景再写文字。


不会刷新背景啊  求指点 

#25


桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.
所以首先要创建透明窗口.
BOOL CTextOutDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

//窗口透明化
ModifyStyleEx(NULL, WS_EX_LAYERED);
SetLayeredWindowAttributes(0, 50/*值1-255,越小越透明*/, LWA_ALPHA);
//去掉标题栏
ModifyStyle(WS_CAPTION, 0); 

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTextOutDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("宋体")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/*    hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
dc.TextOut(100,100,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
CDialog::OnPaint();
}
}

#26


引用 25 楼 zwfgdlc 的回复:
桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.
所以首先要创建透明窗口.
BOOL CTextOutDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

//窗口透明化
ModifyStyleEx(NULL, WS_EX_LAYERED);
SetLayeredWindowAttributes(0, 50/*值1-255,越小越透明*/, LWA_ALPHA);
//去掉标题栏
ModifyStyle(WS_CAPTION, 0); 

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTextOutDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CFont myFont;  
myFont.CreateFont (   
120, // nHeight 字体高度  
40, // nWidth 字体宽度  
0, // nEscapement 显示角度  
0, // nOrientation 字体角度  
FW_NORMAL, // nWeight 字体磅值  
FALSE, // bItalic 是否倾斜  
FALSE, // bUnderline 是否斜体  
0, // cStrikeOut 是否加删除线  
ANSI_CHARSET, // nCharSet 指定字符集  
OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
DEFAULT_QUALITY, // nQuality 指定输出质量  
DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("宋体")); // 指定字体的字样名  
CFont* oldFont = dc.SelectObject ( &myFont);  
dc.SetTextColor (RGB (0,155,255));  
/*    hbr = */
//HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
//dc.SelectObject (hbr);  
//(HBRUSH)GetStockObject(NULL_BRUSH);
dc.SetBkMode (TRANSPARENT); //背景模式为透明  
//InvalidateRect(NULL,true);
//UpdateWindow();
dc.TextOut(100,100,_T("德玛西亚"));  
dc.SelectObject ( oldFont);  
CDialog::OnPaint();
}
}

照这样做之后,窗口虽然透明了,但是输出的字也透明了 
http://bbs.csdn.net/topics/330203668  这个哥们好像实现了  但是看不太懂

#27


其实 就是 做个 “异型” 窗口。

使用 SetWindowRgn 函数。

1. 创建 内存 DC
2. memDC 背景 填白
3. 把 字符 画到  memDC
4. 遍历 每个 点, 把 白的点 去除, 留下 字符点 成为 一个点 的 rgn, 把 所有点 (rgn) combine 起来 , 成 一个 字符串 rgn
5. SetWindowRgn

#28


void CxxxDlg::StrRgn(CString &str)
{
CRect rc;
GetWindowRect(rc);

CWindowDC dc(this);
CDC memDC;
memDC.CreateComPatibleDC(&dc);

CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
HBITMAP old=(BITMAP)memDC.SelectObject(bmp);
// fill background
memDC.FillSolidRect(&rc,RGB(255,255,255));
// text
HFONT oldFont=(HFONT)memDC.SelectObject(m_Font);// 在初始化时创建
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(2,2,str);
// creat window rgn
int x,y;
CRgn wndRgn,tmpRgn;
wndRgn.CreateRectRgn(0,0,0,0);
// 
for(x=0;x<=rc.Width();x++)
{
    for(y=0;y<rc.Height();y++)
    {
         if(memDC.GetPixel(x,y) < RGB(250,250,250))
         {// add one point
             tmpRgn.CreateRectRgn(x,y,x+1,y+1);// one point rgn
             wndRgn.CombineRgn(&wndRgn,&tmpRgn,RGN_OR);// sum of all points
             tmpRgn.DeleteObject();
         }
    }
}
//
SetWindowRgn((HRGN)wndRgn,TRUE);
// free
memDC.SelectObject(old);
memDC.SelectObject(oldFont);
wndRgn.DeleteObject();
}

// move Window 在字符串里 移动窗口!
UINT CxxxDlg::OnNcHitTest()
{
UINT nHitTest=CDialog::OnNcHitTest();
return(nHitTest==HTCLIENT) ? HTCAPTION : nHitTest);
}

在对话框 初始化中:

StrRgn(CString("哈哈"));

对话框属性 无标题

#29


改进:
CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left,-rc.top);
否则第二次 调用这个函数时 , 坐标会错误。

#30


楼主,我现在要用TextOut编写桌面歌词,能告诉我怎么实现字体背景透明吗?