4.win32注册窗口类和创建窗口

1.注册窗口类函数

  (1)RegisterClass/RegisterClassEx

    ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

    ATOM RegisterClassEx(CONST WNDCLASSEX *lpwcx);

    注册成功后,返回一个非0数字标识,失败返回0。

  (2)窗口类的风格

    CS_GLOBALCLASS - 应用程序全局窗口类

    CS_BYTEALIGNCLIENT - 窗口客户区的水平位置8整倍数据对齐

    CS_BYTEALIGNWINDOW - 窗口的水平位置8整倍数据对齐

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

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

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

    CS_PARENTDC - 该类型的窗口,使用它的父窗口的绘图(DC)设备

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

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

    CS_DBLCLKS - 允许窗口接收鼠标双击

    CS_NOCLOSE - 窗口没有关闭按钮

下面是简单的示例代码:    

#include "stdafx.h"

void AppReg()
{
    //注册窗口类
    WNDCLASSEX wce = { 0 };

    wce.cbSize        = sizeof(wce);               //大小
    wce.cbClsExtra    = 0;                         //窗口类附加数据buffer的大小
    wce.cbWndExtra    = 0;                         //窗口的附加数据buffer的大小
    wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  //背景为白色
    wce.hCursor       = NULL;                      //默认光标
    wce.hIcon         = NULL;                      //默认大图标
    wce.hIconSm       = NULL;                      //默认小图标
    wce.hInstance     = g_hInstance;               //当前程序实例句柄
    wce.lpfnWndProc   = DefWindowProc;             //系统默认窗口处理函数
    wce.lpszClassName = "Main";                    //窗口类名
    wce.lpszMenuName  = NULL;                      //窗口菜单
    wce.style         = CS_HREDRAW | CS_VREDRAW;   //窗口风格

    //将以上赋值写入操作系统
    ATOM nAtom = RegisterClassEx(&wce);

    if (nAtom == 0)
    {
        MessageBox(NULL, "注册失败", "Info", MB_OK);
        return;
    }

    HWND hWnd = CreateWindow("Main", "Window", WS_OVERLAPPEDWINDOW,
                             100, 100, 500, 500, NULL, NULL, g_hInstance, NULL);
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    MSG uMsg = { 0 };
    while (GetMessage(&uMsg, NULL, 0, 0))
    {
        TranslateMessage(&uMsg);
        DispatchMessage(&uMsg);
    }
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       cCmdShow)
{
    g_hInstance = hInstance;
    AppReg();
    return 0;
}

2.创建窗口

  (1)创建窗口函数CreateWindow

  (2)内部执行过程

    CreateWindow用其中两个参数用来确定窗口,CreateWindow("Main", ..., g_hInstance, ...),即窗口类名和当前程序实例句柄。  

    a.系统根据传入的窗口类名称,在应用程序局部窗口类中查找,如果找到执行b,否则执行c。

    b.比较局部窗口类与创建窗口时传入的HINSTANCE变量。如果发现相等,创建和注册的窗口在同一模块,创建窗口返回。否则执行c。

    c.在应用程序全局窗口类中查找,如果找到,执行d,否则执行e。

    d.使用找到的窗口类的信息,创建窗口返回。

    e.在系统窗口类中查找,如果找到,创建窗口,否则窗口创建失败。

    若创建窗口成功,那么CreateWindow就申请内存,将传入的参数写入到内存中,返回这块内存的句柄。

时间: 2024-08-05 07:04:54

4.win32注册窗口类和创建窗口的相关文章

C语言调用WIN32 API教程之1创建窗口

本学习笔记基于VC++6.0开发环境,通过c语言编程语言,调用win32 API进行windows系统应用程序开发. 1,打开VC++6.0,点击 文件->新建->工程->Win32 Application 工程名填写example1,点击确定,选择 一个空工程,点击完成. 2,点击"新建文件" 按钮,新建一个空白文件,点击 文件->另存为 输入文件名example1.c 选择工作空间对应的文件夹,保存. 3,点击FileView,右击Source File,点

基于OpenGL编写一个简易的2D渲染框架01——创建窗口

最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的是 vs2013,使用C++语言编写项目.这个小项目叫Simple2D,意味着简易的2D框架.最终的目的是可以渲染几何图形和图片,最后尝试加上一个2D粒子系统和Box2D物理引擎,并编译一个简单的游戏. 第一步,就是创建一个Win32项目. 接下来,生成一个窗口.编写一个RenderWindow类,

Win32API全局窗口类的注册与创建

  Win32API全局窗口类的注册 应用程序全局窗口类的注册 typedef struct tagWNDCLASSEX { UINT      cbSize; //结构体的大小,用sizeof得出 UINT      style; //窗口类的风格,默认设置左右画出 WNDPROC   lpfnWndProc; //回调函数,窗口处理函数,干活的人 int       cbClsExtra; //窗口类的附加数据Buff的大小 int       cbWndExtra; //窗口的附加数据Bu

VC++编程之第三课笔记——MFC窗口创建过程以及窗口类的封装

第三课 MFC窗口创建过程以及窗口类的封装 MFC的每一个类都是以C开头的,表明这是一个Class. 工程包含(单文档) 创建工程名为aaa的工程(单文档)时,在类视图中可看见五个类: CAboutDlg CMainFrame CAaaApp CAaaDoc CAaaView 其中: 类CAboutDlg继承自CDialog类,对话框的类 类CMainFrame继承自CFrameWnd类,创建整个程序的框架窗口 类CAaaApp继承自CWinApp类,创建唯一的应用程序对象 类CAaaDoc继承

消息循环,注册窗口,创建窗口【图解】

本文是Win32编程基础 尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键 DirectX编程也是建立在这个基础之上的,所以,在你可以熟练的进行简单的Win32编程之后DirectX编程也就触手可得. 1.1 简单的WIN32程序 在以前的C语言编程中,一个最简单的程序可以只有两行. void main(void) { printf "Hello World!"; } 而要实现同样功能的Window

注册窗口类

一.MFC应用程序与win32应用程序的区别 Win32编程:是调用Win32SDK中的API函数进行编程,注册窗口类,建立窗口,现实窗口,设置消息循环……等等的方式建立Windows程序,以前的Windows程序都这样开发的,写程序要写大量代码. MFC库:后来微软为了方便编程人员开发,将Win32SDK中的函数进行C/C++封装,于是就是MFC库(架构),开发程序比以往的Win32SDK方式更加简便快捷. 相同:调用的API都是Win32SDK的API 不同:MFC的程序执行起来慢,而且用M

3.win32窗口类

1.窗口类 窗口类包含了窗口的各种参数信息的数据结构.每个窗口都具有窗口类,基于窗口类创建窗口.每个窗口类都具有一个名称,使用之前必须注册到系统. 2.窗口类的分类 1)系统窗口类 系统已经定义好的窗口类,所有应用程序都可以直接使用. 2)应用程序全局窗口类 由用户自己定义,当前应用程序所有模块都可以使用. 3)应用程序局部窗口类 由用户自己定义,当前应用程序中本模块可以使用. 3. 系统窗口类 注册窗口类的步骤必须要做,但是系统窗口类不需要(程序员)注册,直接使用窗口类即可.系统已经定义好的相

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

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

Window 窗口类

窗口类 WNDCLASS 总结 总结为下面的几个问题: 1. 什么是窗口类 2. 窗口类的三种类型 3. 窗口类各字段含义 4. 窗口类的注册和注销 5. 如何使用窗口类,子类化.超类化是什么 下面分别描述: 1. 什么是窗口类? 窗口类定义了一系列属性,系统使用这些属性作为模板来创建出一个或多个 window (窗口). 每个窗口类都关联了一个窗口过程函数(window procedure), 由窗口类创建出的所有窗口(window), 都共享同一个窗口过程函数. 在进程中创建窗口之前必须先注