///改变窗口外观(大小,位置,窗口style之类,总之就是CreateWindow()里面可以设置的)
(1)在窗口创建之前改变
在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数里有参数CREATESTRUCT& cs这个参数,这个参数是个结构体,里面的成员是CreateWindow()函数的各个参数,改变这个参数的值,就能在创建窗口之前改变它的外观
(2)在窗口创建完成之后改变
12345 LONG SetWindowLong(
HWND hWnd, // handle to window
int nlndex, // offset of value to set
LONG dwNewLong // new value );
第二个参数:
GWL_ID
| -12 |
GWL_STYLE
| -16 |
设定一个新的窗口风格。
|
GWL_WNDPROC
| -4 |
为窗口过程设定一个新的地址。
|
创建完之后再改变,就应该在OnCreate()函数里面调用这个函数了,CMainFrame::OnCreate()函数里面会调用基类的OnCreate()函数创建窗口,在return 之前调用这个函数就能改变窗口的风格了。
//改变窗口光标,图标,背景
窗口的光标,图标和背景这些参数都是设计窗口类的时候确定的,那个CREATESTRUCT参数里面并没得改,SetWindowLong()函数也没得改。
(1)在窗口创建之前修改
虽然CREATESTRUCT结构体没有Icon,Cursor这些参数,但是它有lpszClass这个参数,只要自己写个新的窗口类并且注册,让那个参数创建我们自己写的窗口类就能得到修改了的图标,光标和背景之类了。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
WNDCLASS cls;
cls.cbClsExtra=0;
cls.cbWndExtra=0;
cls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
cls.hCursor=LoadCursor(NULL,IDC_HAND);
cls.hIcon=LoadIcon(NULL,IDI_ERROR);
cls.hInstance=AfxGetInstanceHandle();//这个AfxGetInstanceHandle()函数返回的就是当前应用程序的实例句柄
cls.lpfnWndProc=::DefWindowProc;
cls.lpszClassName=_T("myclass");
cls.lpszMenuName=NULL;//菜单并不是在设计窗口的时候创建的,设为NULL,不会影响菜单的建立
cls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&cls);
cs.lpszClass=_T("myclass");
cs.style=WS_OVERLAPPEDWINDOW;
return TRUE;
}
这里还有个要注意的,视类窗口覆盖在主框架上,对光标和背景的修改会被覆盖掉,所以应该在View类的PreCreateWindow()函数里也把cs.lpszClass修改了才行。
除此之外还有利用AfxRegisterWndClass(UNIT nClassStyle,HCURSOR hCursor=0,HBRUSH hBrush=0,HICON hIcon=0);函数返回值就直接是注册之后的类名,直接赋给cs.lpszclass就能改变背景,图标,光标了。
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
(2)创建窗口之后修改
主要是利用
DWORD WINAPI SetClassLong(
_In_ HWND hWnd,
_In_ int nIndex,
_In_ LONG dwNewLong
);
参数一:指定要设置属性的窗口句柄 参数二:GCL_HBRBACKGROUND(设置新画刷) GCL_HCURSOR(设置新光标) GCL_HICON(设置新图标)
参数三:新的属性(记得强制转型为LONG)