第11章 自定义窗口

            前面的章节的内容是关于使用系统内现有的窗口或控件,将窗口或控件关联到对应的窗口派生类在调用类库函数实现对窗口的操作。本章研究的内容是关于如何注册和创建新类型的窗口,即自定义窗口和控件的开发。


第01节    手动创建控件

    在非对话框窗口中,就不能通过可视化编辑来自动创建控件了,只能调用控件类的Create函数手动创建。这是一种包含框架、视图以及对话框等各种类型窗口通用的控件创建方法。

第02节    注册和创建自定义窗口

1)所有控件类的创建函数,都通过调用基类成员函数CWnd::Create来实现。

2)所有控件创建时,都要在CWnd::Create函数中带入窗口ID、风格、位置和父窗口等。

3)所有控件创建时都要在Cwnd::Create函数的第一个参数中带入控件的种类,即窗口类型名。

4)有些控件要有标题文字(如:按钮),在CWnd::Create的第二个参数中代入,否则代入NULL。       

  1.  窗口根据风格分类主要有三大类:

(1)重叠式窗口(WS_TILEDWINDOW或WS_OVERLAPPEDWINDOW),具有应用程序主窗口的全部特点。它的非客户区包括一个可伸缩的框架爱、菜单条、标题栏和最小化、最大化按钮。

(2)弹出窗口(WS_POPUPWINDOW),具有消息框或者对话框的全部特点。它的非客户区是一个固定大小的框架。

扫描二维码关注公众号,回复: 2222638 查看本文章

(3)子窗口(WS_CHILDWINDOW),具有类似控件子窗口的全部特点。它不能作为主窗口,一般不显示非客户区,只有依赖于父窗口才能存在。

#include "MainWnd.h"
BOOL CwdApp::InitInstance()
{
        //CWnd *pWnd = new CWnd();	//在堆内申请窗口对象
        CWnd *pWnd = new CMainWnd();
        m_pMainWnd = pWnd;//把窗口对象的地址交给m_pMainWnd保存
        HBRUSH hBr = (HBRUSH)::GetStockObject(BLACK_BRUSH);//要注册窗口的默认背景色
        HICON hIcon = LoadIcon(IDR_MAINFRAME);//默认图标
        HCURSOR hCursor = LoadStandardCursor(IDC_CROSS);//默认光标
        HMENU hMenu = ::LoadMenu(CWinApp::m_hInstance,MAKEINTRESOURCE(IDR_MENU1));
        LPCTSTR szClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, hCursor, hBr, hIcon);
        pWnd->CreateEx(0, szClass, _T("菜单程序"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        0, 0, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN), NULL, hMenu,0);
        return TRUE;// 如果返回FALSE窗口将转瞬即逝
}
// "MainWnd.h"
#pragma once
#include "afxwin.h"
class CMainWnd :
 public CWnd
{
public:
 CMainWnd();
 ~CMainWnd();
 DECLARE_MESSAGE_MAP()
 afx_msg void OnAppExit();
 virtual void PostNcDestroy();
};
//"MainWnd.cpp"
#include "stdafx.h"
#include "MainWnd.h"
CMainWnd::CMainWnd()
{
}
CMainWnd::~CMainWnd()
{
}
BEGIN_MESSAGE_MAP(CMainWnd, CWnd)
ON_COMMAND(ID_APP_EXIT, &CMainWnd::OnAppExit)
END_MESSAGE_MAP()
void CMainWnd::OnAppExit()
{
// TODO: 在此添加命令处理程序代码
if (IDYES ==AfxMessageBox(_T("确认要退出吗?"),MB_YESNO))
{
DestroyWindow();
}
}
void CMainWnd::PostNcDestroy()
{
// TODO: 在此添加专用代码和/或调用基类
// 在窗口关闭时清除堆空间中申请的CMainWnd对象
delete this;
CWnd::PostNcDestroy();
}


猜你喜欢

转载自blog.csdn.net/weixin_39345003/article/details/80962466