VC改变窗口大小和样式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

改变窗口的外观和大小

改变窗口的外观和大小需要在窗口创建以前改变。所以我们可以在CMainFrame的PreCreateWindow中改变CREATESTRUCT 结构体的值就行了。

E.G.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

改变窗口的大小-> cs.cx = 300; cs.cy = 200;

改变窗口的显示位置坐标是 cs.x 和 cs.y

这里常用的一个函数是::GetSysMetrics(SM_CXSCREEN);

::GetSysMetrics(SM_CYSCREEN);

用来取得屏幕的大小。

要改变窗口标题栏的字符串:

cs.lpszName = "Seven"; 会发现标题栏不会改变窗口的标题栏的上的字符串。

改变单文档应用程序的标题栏的字符串参考MSDN window

styles/Frame-window styles 下面有一个Changing the styles of a window create by MFC./ The SDI Case

默认的情况是WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE styles FWS_ADDTOTITLE is add the document title to the window’s caption.

去掉FWS_ADDTOTITLE 就可以更改窗口标题栏字符串。

cs.style &= ~FWS_ADDTOTITLE;

cs.lpszName = "Seven";

如果我们需要改变背景,画刷,光标等等时候。

我们可以在:PreCreateWindow中创建窗口类,WNDCLASS wndClass;

把这个类里的值改变成自己想要的内容就可以了。

E.G.

wndClass.cbClsExtra = 0;

wndClass.cbWndExtra = 0;

wndClass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);

wndClass.hCursor = LoadCursor(NULL, IDC_WAIT);

wndClass.hIcon = LoadIcon(NULL, IDI_WARNING);

wndClass.hInstance = AfxGetInstanceHandle();

获取应用程序的实例句柄可用AfxGetInstanceHandle函数,这个函数是一个全局的函数,前面有一个AFX表示是一个应用程序框架类函数,哪里都可用。

wndClass.lpfnWndProc = ::DefWindowProc;

我们只是想要改变窗口的图标,光标,不想改变条用过程所以用defWindowProc函数来处理。

因为在CWnd中也有一个defWindowProc函数,比全局的函数少一个参数如果不加::

的话调用就要报错。

wndClass.lpszMenuName = NULL;

创建菜单并不是在在设计窗口类的时候创建,菜单的创建实在

CStyleAPP::InitInstance函数中将菜单的标识传进去。

wndClass.style = CS_HREDRAW | CS_VREDRAW;

这里的style并不是窗口的类型而是窗口类的类型。

RegisterClass(&wndClass);

注册窗口类。

cs.lpszClass = "GL";

后来把我们刚刚设计好的类赋值个cs.lpszClass。

运行程序之后我们会发现只有图标改变了,cursor 和brush都没有改变。这是因为,我们是在frame中改变的,在frame上边还覆盖一个子窗口类。所以我要改变这些需要把在子窗口的View类中PreCreateWindow中把类名复制。

E.g

在CStyleView中cs.lpszClass = "GL";

就可以把我们刚刚的想要的类型来改变view中的窗口类型,因为“GL”窗口类已经在CMainFrame框架类中已经注册了,所以我们可以直接赋值就可以了。

在frame中只可以改变ICON ,为了改变图标我们重写窗口类我很不划算,在MFC中为我们提供了一个函数AfxRegisterWndClass直接改变icon详见MSDN cs.lpszName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, 0, 0,

LoadIcon(NULL, IDI_WARNING));

这样就直接改变了frame中Icon。

我们也可以在CStyleView中调用这个函数来改变窗口的画刷,光标。

窗口创建之后改变外观

用SetWinowLong函数具体见MSDN

LONG SetWindowLong( HWND hWnd, // handle of window

int nIndex, // offset of value to set

LONG dwNewLong// new value );

在CMainFrame的OnCreate中调用SetWindowLong

SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);

这样就可以去掉了文档标题是窗口标题了。

我们可以通过GetWindowLong函数得到当前窗口的类型。详见MSDN

SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) & ~WS_MAXIMIZEBOX);

这样就可以灰掉窗口的最大化窗口了。

窗口创建之后改变窗口类

上面的是改变窗口的大小和最大化最小化等等的按钮。

我们可以用SetClassLong来改变创建之后的窗口类的参数例如光标,鼠标,画刷等等。

相关文档
最新文档