程序中大量使用的MessageBox,弹出提示信息,现在想把整个界面换风格。所有的自定义的对话全部集成一个对话框,并在这个对话框中实现的样式。
但是现在的问题是系统的那些对话框(比如MessageBox、 CFileDialog等)样式怎么能改成自定义的样式呢
谢谢!

解决方案 »

  1.   

    将窗口类的窗口函数改了。1、MessageBox的窗口类类名是“Message”,GetClassInfoEx获取该窗口类的存储在WNDCLASSEX结构中的信息,保存WNDCLASSEX::lpfnWndProc备用。2、使用SetClassLongPtr指定GCLP_WNDPROC,改变该窗口类的窗口函数为你自己定义的函数,在你自己定义的函数中,你处理WM_PAINT消息就可以想怎么画就怎么画了,你不需要特殊处理的消息就拿给在第1步中保存下来的原窗口函数处理就行了。
      

  2.   


    ULONG_PTR WINAPI SetClassLongPtr(
      __in  HWND hWnd,
      __in  int nIndex,
      __in  LONG_PTR dwNewLong
    );hWnd参数怎么复制,MessageBox的句柄怎么获取?
      

  3.   

    就是自己写一个对话框模拟MessageBox的功能
    其实你写一个类再去子类化现有的MessageBox工作量差不多
      

  4.   

    用SPY++看了,类名不是“Message”
    事实上,当弹出MessageBox时,弹出的窗口也是一个顶层窗口,只有弹出了以后,才知道其HWND,如何子类化?行不通吧
      

  5.   

    自己写一个省事。我之前写过一个win32的,接口参照系统MessageBox写。
      

  6.   

    但是现在的问题是系统的那些对话框(比如MessageBox、 CFileDialog等)样式怎么能改成自定义的样式呢?
     hook吧,改下windowproc。
      

  7.   

    如果是afxmessagebox,可以在app::DoMessageBox中实现自己的窗口
    如果是messagebox,需要对其subclass
      

  8.   

    如何subclass之?在弹出前不存在,弹出时就晚了
      

  9.   

    我现在采样的方法是自己做了一个Dialog(CMyDialog)测试时发想这样一个问题,如果父窗口是DoModal出来的没问题。
    如何父窗口是Create出来的,会有这样的问题,当提示框销毁后,父窗口响应不了鼠标按键。
    请问是何原因// 调用
    CMyDialog db(true, this);
    int rc = db.CRHMessageBox(strContext, _CS("警告"), MB_ICONWARNING);int CMyDialogdb::CRHMessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType /*= MB_OK*/)
    {
    // 部分代码
        CRHDisplay();
        CRHSetDefaultButton();
        int rc = RunModalLoop(0);
        return(rc);
    }