windows程序设计第五版_程序设计中三种基本结构

windows程序设计第五版_程序设计中三种基本结构WNDCLASS结构参数及其用法WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性基…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

WNDCLASS结构参数及其用法

WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。
结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性

基本信息

要得到某一窗口的WNDCLASS数据,可以用GetClassLong();
RegisterClass()就是在系统注册某一类型的窗体。也就是将你提供的WNDCLASS数据注册为一个窗口类,在WNDCLASS.lpszClassName中定义该WNDCLASS的标识,
无论CreateWindow或CreateWindowEx创建的窗口都必须对应一个WNDCLASS,但一个WNDCLASS可以有多个窗口对象。
有一些系统预定义的窗口类,如:
ClassName=_T(“BUTTON” or “COMBOBOX” or “EDIT” or “LISTBOX” or “MDICLIENT” or “SCROLLBAR” or “STATIC”)
要用这些窗体,直接用CreateWindow创建相应对象就是了。
要得到某一窗口的窗口类,可以用GetClassName();
WNDCLASS中的回调函数是窗体的消息处理函数:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam) //窗口过程函数

窗口属性定义

基本方法
typedef struct _WNDCLASS
{

UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口扩展
int cbWndExtra;//窗口实例扩展
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

举例说明

#include <windows.h>
//包含应用程序中数据类型和数据结构的定义
long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//窗口说明
//WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环
/* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检 测到WM_QUIT消息时终止程序运行 WinMain函数有三个基本部分组成:函数说明、初始化和消息循环*/
//函数说明
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
//初始化
//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分
{ 
   
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口";//窗口类名
char lpszTitle[]="徐新坡"; //窗口标题名
//窗口类定义
//窗口类定义了窗口的形式与功能 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成
//该数据结构中包含窗口类的各种属性
wndclass.style =0; // 窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); // 窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口”
 以下是窗口类的注册 Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类// 窗口类必须先注册 后使用
if(!RegisterClass(&wndclass)) //如果注册失败 发出警告
{ 
   MessageBeep(0); return FALSE;}
///创建窗口 创建一个窗口的实例由函数CreateWindow()实现
hwnd=CreateWindow( lpszClassName, //窗口类名
lpszTitle, //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐标值为缺省值
CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高和宽为缺省值
NULL, //此窗口无父窗口
NULL, //此窗口无子菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL //不使用该值
);
/显示窗口
ShowWindow(hwnd,nCmdShow);
//绘制用户区
UpdateWindow(hwnd);
/消息循环
while(GetMessage(&Msg,NULL,0,0))
{ 
   
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam; //消息循环结束 即程序结束时 将信息返回系统
}
/窗口函数
//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,是消息处理分支控制语句的集合
long CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{ 
   
switch(message)
{ 
   
case WM_DESTROY:
PostQuitMessage(0);
default: //缺省时采用系统消息缺省处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}
return (0);
}

结构说明:

WNDCLASS 结构包含了RegisterClass函数注册的类属性

△(重要)分量简介:

style:
指定类风格。这些风格可通过按位或操作组合起来。风格如下:
CS_BYTEALIGNCLIENT: 在字节边界上(在x方向上)定位窗口的用户区域的位置
CS_BYTEALIGNWINDOW: 在字节边界上(在x方向上)定位窗口的位置
CS_CLASSDC: 该窗口类的所有窗口实例都共享一个窗口类DC
CS_DBLCLKS: 允许向窗口发送双击鼠标键的消息
CS_GLOBALCLASS: 当调用CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的hInstance参数和注册窗口类时传递给RegisterClass 的 hInstance参数不同。如果不指定该风格,则这两个 hInstance 必须相同。
CS_HREDRAW: 当水平长度改变或移动窗口时,重画整个窗口
CS_NOCLOSE: 禁止系统菜单的关闭选项
CS_OWNDC: 给予每个窗口实例它本身的DC。注意,尽管这样是很方便,但它必须慎重使用,因为每个DC大约要占800个字节的内存。
CS_PARENTDC: 将子窗口的裁剪区域设置到父窗口的DC中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从系统缓存中获取DC,而不是使用父窗口的DC。使用该风格可以提高系统性能。
CS_SAVEBITS: 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息。该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失。设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存。
CS_VREDRAW: 当垂直长度改变或移动窗口时,重画整个窗口
lpfnWndProc:
指向窗口过程
cbClsExtra:
指定紧随在 WNDCLASS 数据结构后分配的字节数。系统将其初始化为零。
cbWndExtra:
指定紧随在窗口实例之后分配的字节数,系统将其初始化为零。如果应用程序正在用WNDCLASS结构注册一个在RC
资源描述文件中用CLASS指令创建的对话框时,它必须设置这个字段为 DLGWINDOWEXTRA。
hInstance:
标识了该窗口类的窗口过程所在的模块实例的句柄,不能为NULL。
hIcon:
标识了该窗口类的图标。hIcon字段必须是一个图标的句柄;若hIcon字段为NULL,那么系统将提供一个默认的图标。
hCursor:
标识该窗口类的光标,hCursor必须是一个光标资源的句柄。若hCursor字段为NULL,则无论何时鼠标移到应用程序窗口时,应用程序必须显式设置光标形状。
hbrBackground:
标识了该窗口类的背景画刷。hbrBackground字段必须是用于绘制背景的物理刷子的句柄,或者是一个颜色的值。如果给出一个颜色的值,它必须是下面列出的标准系统颜色之一(系统将对所选颜色加1)。如果给出了颜色值,它必须是转换成下列的HBRUSH类型之一的颜色:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTHSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
当hbrBackground字段为NULL时,每当需要绘制其用户区域时,应用程序必须自己来绘制其背景。应用程序可以通过处理WM_ERASEBKGND 消息或检查由 BeginPaint 函数填写的 PAINTSTRUCT 结构的fErase 字段来确定背景什么时候需要着色。
lpszMenuName :
指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。
lpszClassName :
指向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个字符串,它描述了窗口类名。这个类名可以是由RegisterClass或RegisterClassEx注册的名字,或者是任何预定义的控件类名。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170970.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月18日 上午9:36
下一篇 2022年8月18日 上午9:36


相关推荐

  • latex 公式如何换行

    latex 公式如何换行1、如图所示,我们先写个长公式。2、可以看到,公式没有自动换行,而是跨过了一栏。3、如图所示,在公式上下两端加上split。同时使用\\指明换行的位置。4、如图所示,公式实现了自动换行。5、大家选择换行的位置也很重要。如图所示,选择该处换行6、得到的效果就非常糟糕。承接Matlab、Python和C++的编程,机器学习、计算机视觉的理论实现及辅导,本科和硕士的均可,咸鱼交易,专业回答请走知乎,详谈请联系QQ号757160542,非诚勿扰。…

    2022年5月4日
    320
  • asp数组随机排序

    asp数组随机排序功能 将一个数组打乱它的顺序 显示出来 让每一次显示出来的顺序都不一样 Dimtttt Split 1 2 3 4 5 6 随机排序 nbsp nbsp leng UBound tt randomize nbsp nbsp forii 0toleng 1 nbsp nbsp nbsp b int rnd leng nbsp nbsp nbsp temp tt b nbsp nbsp nbsp tt b tt ii nbsp nbsp nbsp tt ii tempNext nbsp For

    2025年8月20日
    6
  • java去重复元素并打印_Java打印数组中重复元素

    java去重复元素并打印_Java打印数组中重复元素Java打印数组中重复元素1说明在此程序中,我们需要打印数组中存在的重复元素。这可以通过两个循环来完成。第一个循环将选择一个元素,第二个循环将通过将所选元素与其他元素进行比较来遍历整个数组。如果找到匹配项,则打印重复的元素。在上面的数组中,第一个重复项将在索引4处找到,它是索引1处存在的元素(2)的重复项。因此,上面的数组中的重复元素是2、3和8。2算法思路步骤1:开始步骤2:初始化arr[…

    2022年4月30日
    71
  • 高等数学 – 数列极限定义 – 笔记

    高等数学 – 数列极限定义 – 笔记数列极限定义是个很让我费解的内容,所以花了一下午的时间去理解它,并将得到的结论记录在此。专科级理解,各路大神敬请指教。

    2022年6月11日
    46
  • windows下安装informix数据库服务端

    windows下安装informix数据库服务端环境 win10 jdk11informi 版本 ibm ids 14 10 FC4W1 WIN 谨记 无论是否首次安装 informix 都需要系统新建 informix 用户 在用户管理确认自己用户的密码和权限 如果不知道密码 可以删除用户重建 赋予管理员权限 informix 不断点击同意和下一步后 输入相关信息 默认勾选创建实例默认 informix 的服务端口 9090 默认启动服务 并检查服务状态 使用客户端连接

    2026年3月26日
    3
  • think in java interview-高级开发人员面试宝典(八)

    think in java interview-高级开发人员面试宝典(八)JavaIO流的复习。大家平时J2EE写多了,JAVA的IO操作可能都已经生疏了,面试时如果来上这么几道,是不是有点”其实这个问题很简单,可是我就是想不起来“的感觉啊?呵呵!JAVA的IO操作太多,我这边挑腾迅,盛大和百度的几道面试题,并整理出答案来供大家参考。InputFromConsole这个最简单不过了,如果你不复习的话,嘿嘿,还真答不出,来看:packageorg.sky.io;p

    2022年5月30日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号