如何在桌面上显示文字?

时间:2021-08-21 23:46:18
想不通过对话框而直接在屏幕显示文字,来发布公司的通知
CRect rect;
CDC *pDc;
CDC mDc;

pDc = GetDC();

........//在mDc里写了些字

rect.SetRect(200,600,1000,800);
pDc->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&mDC,0,0,SRCCOPY); 

结果什么都没有

但是把前面换成
GetClientRect(&rect);
pDc = this->GetDC();

则可以看到有字飘过

16 个解决方案

#1


HDC hDC = ::GetDC(NULL);

...显示文字。

::ReleaseDC(NULL, hDC);

#2


楼上说的对

#3


  hwin=GetDesktopWindow();//获取桌面窗口句柄
  dc=GetWindowDC(hwin);//获取桌面窗口DC
  GetWindowRect(hwin,&rect);//获取桌面窗口大小

#4


引用 1 楼 lwx300 的回复:
HDC hDC = ::GetDC(NULL); 

...显示文字。 

::ReleaseDC(NULL, hDC); 


HDC 怎么显示文字,应该不是用BitBlt

#5


引用 3 楼 levelmouse 的回复:
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
   dc=GetWindowDC(hwin);//获取桌面窗口DC 
   GetWindowRect(hwin,&rect);//获取桌面窗口大小

dc->DrawText

#6


引用 4 楼 scate 的回复:
引用 1 楼 lwx300 的回复:
HDC hDC = ::GetDC(NULL); 

...显示文字。 

::ReleaseDC(NULL, hDC); 
 

HDC 怎么显示文字,应该不是用BitBlt


HDC hDC = ::GetDC(NULL); 

//可以使用 TextOut(hDC....);   显示文字。

::ReleaseDC(NULL, hDC); 

#7


引用 5 楼 zhangzii 的回复:
引用 3 楼 levelmouse 的回复:
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
  dc=GetWindowDC(hwin);//获取桌面窗口DC 
  GetWindowRect(hwin,&rect);//获取桌面窗口大小 
 
dc->DrawText

dc=GetWindowDC(hwin);//获取桌面窗口DC 

dc->drawText
dc->textOut
都可以。
不过要实现复杂并且可控的窗口 最好是创建一个透明窗口。然后在这个窗口上画文字。所谓的酷狗,QQ音乐什么什么歌词显示就是这样一个窗口。你可以用spy++抓一下看看。
用一个API来实现 这个API好像是叫做 updatelayeredwindowattbr....哦 创建窗口的时候 还必须指定 EX_Layered属性。就是0x80000那个属性。
对话框可以在oninitidlg里面用setwindowlong给它加上这个属性。
CSDN下载中心有这样的例子。
祝你好运。

#8


标志

#9


引用 7 楼 glunoy 的回复:
引用 5 楼 zhangzii 的回复:
引用 3 楼 levelmouse 的回复: 
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
  dc=GetWindowDC(hwin);//获取桌面窗口DC 
  GetWindowRect(hwin,&rect);//获取桌面窗口大小 

dc->DrawText 
 
dc=GetWindowDC(hwin);//获取桌面窗口DC 

dc->drawText 
dc->textOut 
都可以。 
不过要实现复杂并且可控的窗口 最好是创建一个透明窗口。然后在这个窗口上画文字。所谓的酷狗,QQ音…


看来还是要使用透明窗口,如果直接用HDC画在桌面上,使用内存来双缓冲防闪动就比较难搞了,那个例子叫啥?

#10


OnInitDialog:
ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(1,2,3), 0, LWA_COLORKEY);

BOOL CerereDlg::OnEraseBkgnd(CDC* pDC)
{
RECT rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc, RGB(1,2,3));
return TRUE;
}

#11


http://download.csdn.net/source/940629 例子好像在这里。
不过作者封装的稍微麻烦化了。其实不需要这么麻烦。你把功能函数抠出来就OK了。
祝你好运

#12


帮顶...

#13


int i = 0 ;
while( i < 600)
{
RECT rc;
TCHAR szText[] = _T("Hello,World!");
HWND hWndDT = GetDesktopWindow();
HDC hdc = GetWindowDC(hWndDT);
SetBkMode(hdc,TRANSPARENT);
GetWindowRect(hWndDT,&rc);
int iX = rc.right/2 ;
int iY = rc.bottom/2 ;
TextOut(hdc , iX, iY ,szText , _tcslen(szText));
ReleaseDC(hWndDT,hdc);
i++;
Sleep(100);
}

#14


老板娘的意思是能让行政部出的通告以大号字体直接显示在桌面的最前端,还要是滚动的,现在工作基本完成,但是使用大号字体就要使用大框体的对话框来承载,虽然弄成了透明,但发现放在最前端时用户无法点击到被透明的对话框隔开的图标之类的东西,目前也只能这样了,但如果以后公告比较长或者需要持续显示的话,就要另想办法了

#15


搞定了,现在就算不停滚动公告,鼠标也能点到图标了

#16


透明窗口是可以点击到下面的图标或者窗口的。不会遮盖。

#1


HDC hDC = ::GetDC(NULL);

...显示文字。

::ReleaseDC(NULL, hDC);

#2


楼上说的对

#3


  hwin=GetDesktopWindow();//获取桌面窗口句柄
  dc=GetWindowDC(hwin);//获取桌面窗口DC
  GetWindowRect(hwin,&rect);//获取桌面窗口大小

#4


引用 1 楼 lwx300 的回复:
HDC hDC = ::GetDC(NULL); 

...显示文字。 

::ReleaseDC(NULL, hDC); 


HDC 怎么显示文字,应该不是用BitBlt

#5


引用 3 楼 levelmouse 的回复:
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
   dc=GetWindowDC(hwin);//获取桌面窗口DC 
   GetWindowRect(hwin,&rect);//获取桌面窗口大小

dc->DrawText

#6


引用 4 楼 scate 的回复:
引用 1 楼 lwx300 的回复:
HDC hDC = ::GetDC(NULL); 

...显示文字。 

::ReleaseDC(NULL, hDC); 
 

HDC 怎么显示文字,应该不是用BitBlt


HDC hDC = ::GetDC(NULL); 

//可以使用 TextOut(hDC....);   显示文字。

::ReleaseDC(NULL, hDC); 

#7


引用 5 楼 zhangzii 的回复:
引用 3 楼 levelmouse 的回复:
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
  dc=GetWindowDC(hwin);//获取桌面窗口DC 
  GetWindowRect(hwin,&rect);//获取桌面窗口大小 
 
dc->DrawText

dc=GetWindowDC(hwin);//获取桌面窗口DC 

dc->drawText
dc->textOut
都可以。
不过要实现复杂并且可控的窗口 最好是创建一个透明窗口。然后在这个窗口上画文字。所谓的酷狗,QQ音乐什么什么歌词显示就是这样一个窗口。你可以用spy++抓一下看看。
用一个API来实现 这个API好像是叫做 updatelayeredwindowattbr....哦 创建窗口的时候 还必须指定 EX_Layered属性。就是0x80000那个属性。
对话框可以在oninitidlg里面用setwindowlong给它加上这个属性。
CSDN下载中心有这样的例子。
祝你好运。

#8


标志

#9


引用 7 楼 glunoy 的回复:
引用 5 楼 zhangzii 的回复:
引用 3 楼 levelmouse 的回复: 
  hwin=GetDesktopWindow();//获取桌面窗口句柄 
  dc=GetWindowDC(hwin);//获取桌面窗口DC 
  GetWindowRect(hwin,&rect);//获取桌面窗口大小 

dc->DrawText 
 
dc=GetWindowDC(hwin);//获取桌面窗口DC 

dc->drawText 
dc->textOut 
都可以。 
不过要实现复杂并且可控的窗口 最好是创建一个透明窗口。然后在这个窗口上画文字。所谓的酷狗,QQ音…


看来还是要使用透明窗口,如果直接用HDC画在桌面上,使用内存来双缓冲防闪动就比较难搞了,那个例子叫啥?

#10


OnInitDialog:
ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(1,2,3), 0, LWA_COLORKEY);

BOOL CerereDlg::OnEraseBkgnd(CDC* pDC)
{
RECT rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc, RGB(1,2,3));
return TRUE;
}

#11


http://download.csdn.net/source/940629 例子好像在这里。
不过作者封装的稍微麻烦化了。其实不需要这么麻烦。你把功能函数抠出来就OK了。
祝你好运

#12


帮顶...

#13


int i = 0 ;
while( i < 600)
{
RECT rc;
TCHAR szText[] = _T("Hello,World!");
HWND hWndDT = GetDesktopWindow();
HDC hdc = GetWindowDC(hWndDT);
SetBkMode(hdc,TRANSPARENT);
GetWindowRect(hWndDT,&rc);
int iX = rc.right/2 ;
int iY = rc.bottom/2 ;
TextOut(hdc , iX, iY ,szText , _tcslen(szText));
ReleaseDC(hWndDT,hdc);
i++;
Sleep(100);
}

#14


老板娘的意思是能让行政部出的通告以大号字体直接显示在桌面的最前端,还要是滚动的,现在工作基本完成,但是使用大号字体就要使用大框体的对话框来承载,虽然弄成了透明,但发现放在最前端时用户无法点击到被透明的对话框隔开的图标之类的东西,目前也只能这样了,但如果以后公告比较长或者需要持续显示的话,就要另想办法了

#15


搞定了,现在就算不停滚动公告,鼠标也能点到图标了

#16


透明窗口是可以点击到下面的图标或者窗口的。不会遮盖。