关于在桌面上用TextOut输出文字遇到的不能透明和两次有重叠的问题 TextOut 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://tech.sina.com.cn/c/1162.html 保留 CPaintDC dc(this); // 用于绘制的设备上下文 dc.TextOut(0,0,_T("德玛西亚")); 这个我不是太明白“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,如果保留的话这个dc就只是窗口的了啊 你在void CDMtestDlg::OnPaint()没有 CPaintDC dc(this); // 刷新窗口, 使窗口有效.可能 因为 对话框窗口 总是无效, 而 Onpaint 不止. dc.TextOut(0,0,_T("德玛西亚")); 是让你 把字画到 对话框外. “CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,这句还是要的! 或者:// CPaintDC dc1(this); // device context for painting CDialog::OnPaint(); CWindowDC dc(NULL); 我还是没搞好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);//刷新窗口, 使窗口有效.”这行,可是效果还是没变 可能是我太笨了 dc.TextOut(500,500,_T("德玛西亚")); 是透明的."hechao" 哪里来的?现在的图是"hechao" 在下面. "德玛西亚" 在它上面 (也是透明的) 很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容 所以叫他画到对话框外看看:dc.TextOut(0,0,_T("德玛西亚")); "hechao" 哪里来的?dc.TextOut(0,0,_T("德玛西亚")); 已经是第二次 参考“桌面小球.zip”“http://download.csdn.net/detail/schlafenhamster/4362660”“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。” 桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.所以首先要创建透明窗口.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 这个哥们好像实现了 但是看不太懂 其实 就是 做个 “异型” 窗口。使用 SetWindowRgn 函数。1. 创建 内存 DC2. memDC 背景 填白3. 把 字符 画到 memDC4. 遍历 每个 点, 把 白的点 去除, 留下 字符点 成为 一个点 的 rgn, 把 所有点 (rgn) combine 起来 , 成 一个 字符串 rgn5. SetWindowRgn 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 backgroundmemDC.FillSolidRect(&rc,RGB(255,255,255));// textHFONT oldFont=(HFONT)memDC.SelectObject(m_Font);// 在初始化时创建memDC.SetBkMode(TRANSPARENT);memDC.TextOut(2,2,str);// creat window rgnint 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);// freememDC.SelectObject(old);memDC.SelectObject(oldFont);wndRgn.DeleteObject();}// move Window 在字符串里 移动窗口!UINT CxxxDlg::OnNcHitTest(){UINT nHitTest=CDialog::OnNcHitTest();return(nHitTest==HTCLIENT) ? HTCAPTION : nHitTest);}在对话框 初始化中:StrRgn(CString("哈哈"));对话框属性 无标题 改进:CRect rc;GetWindowRect(rc);rc.OffsetRect(-rc.left,-rc.top);否则第二次 调用这个函数时 , 坐标会错误。 如何用DOS命令生成reg文件 ATL+MFC 如何取得登录者信息 随即抽取某个数据表中的字段 请问如何用程序的方式判断,现在登陆的用户权限是administrator,PowerUser还是一般用户? 如何锁定窗口的切分条呀?在线等待 VC中EXE的初始化参数 用CRecordset::Update()更新数据,出现异常“参数不足,期待是 3” 100分求助,简单的CSOCKET问题 菜鸟求助:一般的图像处理的开发软件是什么阿 一个十分难的问题,如何把16位的DLL转换成32位(具体步骤) opencv如何对图像中的指定区域进行仿射变换 如何将一个正方形图片裁剪成圆形呢?
void CDMtestDlg::OnPaint()
没有 CPaintDC dc(this); // 刷新窗口, 使窗口有效.
可能 因为 对话框窗口 总是无效, 而 Onpaint 不止. dc.TextOut(0,0,_T("德玛西亚"));
是让你 把字画到 对话框外.
这句还是要的!
// CPaintDC dc1(this); // device context for painting
CDialog::OnPaint();
CWindowDC dc(NULL);
{
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);//刷新窗口, 使窗口有效.”这行,可是效果还是没变
可能是我太笨了
是透明的.
"hechao" 哪里来的?
现在的图是
"hechao" 在下面. "德玛西亚" 在它上面 (也是透明的)
dc.TextOut(0,0,_T("德玛西亚"));
“桌面小球.zip”
“http://download.csdn.net/detail/schlafenhamster/4362660”“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”
所以首先要创建透明窗口.
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 这个哥们好像实现了 但是看不太懂
2. memDC 背景 填白
3. 把 字符 画到 memDC
4. 遍历 每个 点, 把 白的点 去除, 留下 字符点 成为 一个点 的 rgn, 把 所有点 (rgn) combine 起来 , 成 一个 字符串 rgn
5. SetWindowRgn
{
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("哈哈"));对话框属性 无标题
CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left,-rc.top);
否则第二次 调用这个函数时 , 坐标会错误。