Windows核心编程05-窗口类的注册

窗口类

  窗口类包含了窗口的各种参数信息的数据结构。每个窗口都具有窗口类,基于窗口类创建窗口。每个窗口类都具有一个名称,使用前必须注册到系统。

窗口类的分类

  -系统窗口类

  系统已经定义好的窗口类,所有应用程序都可以直接使用

  -应用程序全局窗口类

  由用户自己定义,当前应用程序的所有模块都可以使用 容易产生冗余

  -应用程序局部窗口类

  由用户自己定义,当前应用程序中本模块可以使用 建议使用这个,局部窗口类可以代替全局窗口类

系统窗口类的注册

  不需要注册,直接使用窗口类即可。系统已经定义好相应名称,例如

    按纽-BUTTON

    编辑框-EDIT

  Windows下只要有形状的东西都是窗口 大到全屏界面小到按纽编辑框等。。。  

应用程序窗口类的注册

  RegisterClass/RegisterClassEx

  ATOM RegisterClass(

  CONST WNDCLASS *lpWndClass //窗口类的类型

  ); 注册成功后,返回一个数字标识。

  ATOM RegisterClassEx(

  CONST WNDCLASSEX *lpwcx//窗口类的类型

  )

  typedef struct {
      UINT cbSize; //结构体大小
      UINT style;//窗口类的风格
      WNDPROC lpfnWndProc; //窗口处理函数
      int cbClsExtra;//窗口类的附加数据buffer的大小
      int cbWndExtra;//窗口的附加数据buffer的大小
      HINSTANCE hInstance; //当前模块的实例句柄
      HICON hIcon;//窗口图标句柄
      HCURSOR hCursor;//鼠标的句柄
      HBRUSH hbrBackground;//绘制窗口背景的画刷句柄
      LPCTSTR lpszMenuName;//窗口菜单的资源ID字符串
      LPCTSTR lpszClassName;//窗口类的名称
      HICON hIconSm;//窗口的小图标句柄
  } WNDCLASSEX, *PWNDCLASSEX

  应用程序全局窗口类的注册,需要在窗口类的风格中增加CS_GLOBALCLASS 例如WNDCLASSEXwce{0};

  wce.style = ...|CS_GLOBALCLASS;

  应用程序局部窗口类

    在注册窗口类时,不要添加CS_GLOBALCLASS风格

  Style所有成员

    CS_GLOBALCLASS 应用程序全局窗口类

    CS_BYTEALIGNCLIENT 窗口客户区水平位置8倍数对齐

    CS_BYTEALIGNWINDOW 窗口的水平位置8倍对齐

    CS_HREDRAW 当窗口水平变化时,窗口重新绘制

    CS_VREDRAW 当窗口垂直变化时,窗口重新绘制

    CS_CLASSDC 该类型的窗口,都是有同一个绘图(DC)设备

    CS_PARENTDC 该类型的窗口,每个窗口都是用自己的绘图(DC)设备

    CS_SAVEBITS 允许窗口保存成图(位图),提高窗口的绘图效率,但是耗费内存资源

    CS_DBLCLKS 允许窗口接收鼠标双击消息

    CS_NOCLOSE 窗口没有关闭按钮

窗口类的创建  

  CreateWindow

HWND CreateWindow(          LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent,
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

  1 系统根据传入的窗口类名称,在应用程序局部窗口类中查找,如果找到执行2,如果未找到执行3

  2 比较局部窗口类与创建窗口时传入的HINSTANCE变量。如果发现相等,创建和注册窗口类中同一个模块,创建窗口返回。如果不相等,继续执行3。/*局部窗口类只能自己的进程使用,HINSTANCE相同则为同一进程创建,此步骤对比窗口类和HINSANCE*/

  3 在应用程序全局窗口类,如果找到,执行4,如果未找到执行5

  4 使用找到的窗口类的信息,创建窗口返回

  5 在系统窗口类中查找,如果找到创建窗口返回,否则创建窗口失败

  CreateWindowEx

    CreateWindowEx是CreateWindow的升级版

HWND CreateWindowEx(          DWORD dwExStyle,
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle, //窗口的扩展风格,比CreateWindow多的参数
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent,
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);
时间: 2024-10-07 17:17:42

Windows核心编程05-窗口类的注册的相关文章

Windows核心编程05-窗口类的创建

创建主窗口: 创建主窗口这段代码经常要用到,先存起来 #include "stdafx.h" HINSTANCE g_hInstance = 0; //接收应用程序实例句柄 //主窗口处理函数 LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam) { switch(nMsg) { case WM_DESTROY: PostQuitMessage(0); break; } return DefW

WINDOWS程序设计(003)----窗口类的注册

应该结合(002)中的程序例子好好地理解,有十分大的帮助. 链接:WINDOWS程序设计(002)--HELLOWIN程序(源代码及详细解析) WINDOWS程序原理 1.WNDCLASS类型结构的定义 在WinMain中,我们通常用如下形式定义一个WNDCLASS类型的结构.(定义方式参考后面的附表) 然后对该结构的10个字段进行初始化,并调用RegisterClass函数. 在WNDCLASS结构中,两个最重要的字段是第二个字段和最后一个字段. 第二个字段(lpfnWndProc)是用于基于

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

《Windows核心编程》读书笔记 上

[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLas

C++Windows核心编程读书笔记

转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔记": 关键词:c++windows 核心 编程 读书笔记 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁

Windows核心编程(1)

一.创建过程 消息循环 1.WinMain首先调用Api函数RegisterClass注册一个窗口类,这个类定义 了窗口重要属性,如窗口过程地址, 默认背景色, 图标. 通过WNDCLASS结构字段 来定义,  程序生成一个窗口时,必须制定窗口类, 在类被使用之前,必须先对其进行注册, 这就是为什么RegisterClass在程序的开始即被调用的原因, 2.一旦WNDCLASS被注册,WinMain讲调用最重要的CreateWindow函数生成应用程序 3.一个MFC程序你看不到WinMain函

Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windows核心编程的坑啦,哈哈~ 学习目标 每一章的学习都要明确一个目标,就是你学完这一章之后你能做些什么?好的,我们一步步来学习第一章节错误处理.以下是这一章节的学习目标:1.了解Windows函数的错误机制2.了解GetLastError和SetLastError函数的使用3.了解FormatMess

【windows核心编程】DLL相关(2)

关于DLL的延迟加载 延迟加载DLL,使用的是隐式加载方式,当为exe使用的DLL指定为延迟加载的时候,连接器会将exe的[导入段]中去除该DLL的相关信息,同时在exe中嵌入一个新的[延迟加载段]表示要从该DLL中导入哪些函数. 通过让对延迟加载函数的调用跳转到delayimp.lib中的__delayLoadHelper2函数,来完成对延迟加载的DLL的解析. 当exe中第一次调用了一个延迟加载的DLL中的某个导出函数时,加载器才会将该DLL加载到进程地址空间中.需要注意的是:虽然此时已经加

【windows核心编程】DLL相关(3)

DLL重定向 因为DLL的搜索路径有先后次序,假设有这样的场景:App1.exe使用MyDll1.0.dll, App2.exe使用MyDll2.0.dll, MyDll1.0 和 MyDll2.0是同一个DLL的两个版本,1.0为旧版本,2.0为新版本. 而如果MyDll2.0.dll的存放路径的优先次序比较靠前时,那么App1.exe就会去加载MyDll2.0.dll,这就可能引发 DLL地狱问题,因此DLL重定向可解决这个问题. 加载程序总是先检查应用程序目录,我们所要做的就是如下: ①在