当前位置:C++技术网 > 资讯 > 单文档应用程序实现修改窗口资源

单文档应用程序实现修改窗口资源

更新时间:2016-01-18 21:32:41浏览次数:1+次

MFC中通过重写PreCreateWindow()  虚函数改变AppWizard生成的窗口的默认属性

通过改变CREATSTRUCT结构体中的 lpszName来改变窗口的标题,结果发现没有变,原因是缺省的窗口类型是WS_OVERLAPPEDWINDOW  和FWS_ADDTOTITLE联合。 而FWS_ADDTOTITLE是用来通知框架用文档的标题当作窗口的标题,如果要修改窗口标题我们就要去掉这个属性。

cs.style = cs.style & ~FWS_ADDTOTITLE; 或者 

cs.style &= ~FWS_ADDTOTITLE;                也可以直接对style赋值:

cs.style = WS_OVERLAPPEDWINDOW;
窗口类只是窗口的一部分,完整的窗口修改就是修改CREATSTRUCT结构体,该结构体包括窗口对应的窗口类(通过指定类名来修改窗口对应的窗口类)。
窗口类 WNDCLASS ,可以通过自定义窗口类来改变窗口光标、图标、背景颜色,但是对于SDI单文档程序来说,Frame类上覆盖一个View类,因此在Frame类的PreCreateWindow()函数中改变了窗口类中改变了光标和背景以后,看起来只改变了图标而没有改变光标和背景颜色,这是因为:View类在前,显示的是View类的光标和背景,根据实际需要改变View类的光标和背景颜色即可,由于该窗口类已创建,在View类的PreCreateWindow()函数中给CREATESTRUCT结构体的lpszClass赋值为已注册的新建窗口类即可。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWndEx::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改
//  CREATESTRUCT cs 来修改窗口类或样式
//cs.dwExStyle&= ~WS_EX_CLIENTEDGE;
    cs.style = cs.style &~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX & ~FWS_ADDTOTITLE; 
cs.lpszName = L"我的程序";   

        WNDCLASS wndclass;

wndclass.cbClsExtra = 0;  
    wndclass.cbWndExtra = 0;  
    wndclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);  
    wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);  
    wndclass.hInstance = AfxGetInstanceHandle();   //取得当前应用 程序的句柄  
wndclass.lpfnWndProc = ::DefWindowProc; //缺省窗口过程(见:设计窗口类时设计窗口过程函数的完成代码)。  
    wndclass.lpszClassName = L"测试";  
    wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MAINFRAME);  
    wndclass.style = CS_HREDRAW | CS_VREDRAW;  
    wndclass.hIcon = LoadIcon(NULL, IDI_WARNING);  
    RegisterClass(&wndclass);  
 
cs.lpszClass = L"测试";

return TRUE;
}
BOOL CReviewView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
//  CREATESTRUCT cs 来修改窗口类或样式

cs.lpszClass=L"测试";
return CView::PreCreateWindow(cs);
}
第一句:cs.lpszClass = L"测试";是指mainframe类的窗口的修改,正如之前所说窗口类只是窗口的一部分,完整的窗口修改就是修改CREATSTRUCT结构体,该结构体包括窗口对应的窗口类(通过指定类名来修改窗口对应的窗口类)。我们正是通过类名来修改窗口,不过,我想getclassinfo应该也行,更加简单,读者可以试试。你可以注释掉看看什么效果。