使用SetLayeredWindowAttributes函数创建了个完全透明的非模态对话窗口,在透明窗口上用CDC的DrawText输出文本,并得到文本区域的CRect,然后使用SetWindowPos改变透明窗口大小以适应文本区域。现象:
如语句::SetWindowPos(m_TranDlg->GetSafeHwnd(),HWND_NOTOPMOST,fontRc.left,fontRc.top,fontRc.Width(),fontRc.Height(),SWP_NOSIZE|SWP_SHOWWINDOW)这样调用可以显示出透明窗口上的文本,但文本显示不全,长宽被忽略掉了。
可是如此调用::SetWindowPos(m_TranDlg->GetSafeHwnd(),HWND_NOTOPMOST,fontRc.left,fontRc.top,fontRc.Width(),fontRc.Height(),SWP_SHOWWINDOW),即去掉SWP_NOSIZE选项,但透明窗口上根本没显示出文本,或者透明窗口可能就不见了。请路过的兄弟们看看!

解决方案 »

  1.   

    可能是fontRc.Width(),fontRc.Height()这两个值太小了,也可能是,真让你设置成透明了,所以就显示不出来了
      

  2.   

    谢谢回复的弟兄,搞定了。
         先前显示时是在创建非模式透明窗口后,简单ShowWindow下,接着调用自定义函数计算文本区域并显示文本,然后将返回的CRect作为SetWindowPos的参数,如此产生如上问题。
         如eyey1所述,将显示文本的功能另做成一个函数在窗口OnPaint消息函数里调用,而在创建时只计算文本区域,并调用::SetWindowPos(m_TranDlg->GetSafeHwnd(),HWND_NOTOPMOST,fontRc.left,fontRc.top,fontRc.Width(),fontRc.Height(),SWP_SHOWWINDOW)显示就行了。    先前那样处理的考虑是不想在OnPaint里时时调用文本显示函数,只想显示一次就搞定,而事实上产生了如上问题,那么怎么处理下只DrawText一次而又能实现要求的功能?现在的处理达到了自己的效果,对大文本的处理效率上可能就不好意思了?
      

  3.   

    改变窗口大小可以使用MoveWindow