WEB开发网
开发学院软件开发VC 关于如何换肤、子类化的解决方案 阅读

关于如何换肤、子类化的解决方案

 2010-06-23 20:40:47 来源:WEB开发网   
核心提示:我在我的 CStaticNew 类中只重载了 OnPaint,里面只处理文字和图标的绘制,关于如何换肤、子类化的解决方案(4),背景的绘制留给父窗体完成,这样的处理在 MessageBox 和自己的 AboutDlg 中都没有问题,目前主要就是这三个问题了,希望大家能展开讨论,Static 控件的背景就是父窗口的背景,

我在我的 CStaticNew 类中只重载了 OnPaint,里面只处理文字和图标的绘制,背景的绘制留给父窗体完成。这样的处理在 MessageBox 和自己的 AboutDlg 中都没有问题,Static 控件的背景就是父窗口的背景,可是在 CFileDlg 中背景就没有重绘了:

void CStaticNew::OnPaint()
{
   CPaintDC dc(this); // device context for painting
   // TODO: Add your message handler code here
   CRect rt;
   GetWindowRect(rt);

   // 绘制背景
   dc.SetBkMode(TRANSPARENT);

   // 绘制文字
   CFont *pfont, * pOldFont;
   pfont = GetFont();
   if (pfont)
     pOldFont = dc.SelectObject(pfont);

   CString szTitle;
   GetWindowText(szTitle);
   dc.DrawText(szTitle, CRect(0, 0, rt.Width(), rt.Height()), DT_LEFT | DT_WORDBREAK );

   if (pfont)
     dc.SelectObject(pOldFont);

   // 绘制图标
   if ((GetStyle() & SS_ICON) != 0)
   {
     dc.DrawIcon(0, 0, GetIcon());
   }
   // Do not call CStatic::OnPaint() for painting messages
}

类名的识别问题,到现在为止,我所使用的子类化方法都是基于GetClassName这个函数获得窗口类名,再根据用spy++所得到的知识,如"#32770"表示对话框,"ToolbarWindow32"是工具栏,等等。但是窗口类名是可以在创建时任意指定的呀,而像CMainFrame的类名根本就不能够确定,例如记事本主窗体的类名是"Notepad",写字板主窗体的类名是"WordPadClass"。这样的话,子类化如何去进行呢。真想知道windows是怎么做的,skinmagic又是怎么做的。目前主要就是这三个问题了。希望大家能展开讨论,给出一个换肤的完善的解决方案。

上一页  1 2 3 4 5 6  下一页

Tags:关于 如何 子类

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接