(win32)句柄,消息循环

win32-显示窗口、消息循环、消息队列 阅读详情

句柄 HANDLE

图标句柄HICON

光标句柄HCURSOR

窗口句柄HWND

应用程序实例句柄HINSTANCE

//消息队列的消息结构体

This structure contains message information from a thread's message queue.

typedef struct tagMSG {
  HWND hwnd; //句柄
  UINT message; //Unsigned Int 以WM_开头的宏作为消息的类型
  WPARAM wParam; //整数, 指示消息的附加信息
  LPARAM lParam; //整数, 指示消息的附加信息
  DWORD time; //32位整数, 指示消息传递的时间
  POINT pt; //消息传递的时候当前光标的位置
} MSG;

消息传递的宏, 以WM_开头

WM_message

WM_KEYDOWN

WM_LBUTTONDOWN

按下A键, 收到WM_CHAR消息, (message), 通过wParam 获取A键的ASCII码.

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT;

int WINAPI WinMain(     

    HINSTANCE hInstance, // handle to current instance
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, //commmand line
    int nCmdShow //show state 程序的现实状态.
);

LPSTR LP 表示LONG POINT 长指针, 指向字符串的长指针.

构建一个完整的窗口需要的四个操作步骤

设计一个窗口类

注册窗口类

创建窗口

显示及更新窗口

窗口类

typedef struct {
    UINT style; // 类的类型, 很多.
    WNDPROC lpfnWndProc; //接收函数指针, 回调函数.
    int cbClsExtra;//额外参数, 通常为0
    int cbWndExtra;//额外参数, 通常为0
    HINSTANCE hInstance;//当前实例
    HICON hIcon;//图标句柄使用LoadIcon()
    HCURSOR hCursor;//光标句柄LoadCursor()
    HBRUSH hbrBackground;//画刷句柄, 使用(HBRUSH)GetStockObject()
    LPCTSTR lpszMenuName;//长指针指向常量字符串, 设置菜单的名字.
    LPCTSTR lpszClassName;//长指针指向常量字符串, 窗口的名字.
} WNDCLASS, *PWNDCLASS;

注册窗口RegisterClass(&wndclass)

 

创建窗口

HWND hwnd;

HWND CreateWindow(     

    LPCTSTR lpClassName, //注册的窗口类的类名, 即lpszClassName
    LPCTSTR lpWindowName,//窗口的名字, 即窗口的标题
    DWORD dwStyle, // 窗口的类型.
    int x, // 窗口的x坐标, CW_USEDEFAULT
    int y, // 窗口的y坐标
    int nWidth, //窗口的宽度 CW_USEDEFAULT
    int nHeight, //窗口的高度
    HWND hWndParent, // 指示父窗口的句柄
    HMENU hMenu, //菜单的句柄
    HINSTANCE hInstance, //当前应用程序的句柄
    LPVOID lpParam // 作为WM_CREATE的参数
);

显示窗口及更新窗口

ShowWindow(hwnd, SW_SHOWNORMAL)

UpdateWindow(hwnd)

消息循环!!!

 

BOOL GetMessage(     

    LPMSG lpMsg, // 消息
    HWND hWnd, // 获取哪一个窗口的信息, NULL 为调用线程的任何窗口的信息
    UINT wMsgFilterMin, // 最小的消息值
    UINT wMsgFilterMax // 最大的消息值
);

 

MSG msg;

while (GetMessage(&msg, NULL, 0, 0)

{

TranslateMessage(&msg); //转换消息

DispatchMessage(&msg);//将消息交给回调函数处理

}

回调函数 , 窗口过程函数

LRESULT CALLBACK WindowProc(     

    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)

{

HDC hdc;

PAINTSTRUCT ps;

switch (uMsg)

{

case WM_CHAR:

char szChar[20];

sprintf(szChar,

}

}

int MessageBox(
  HWND hWnd, //拥有该消息的窗口句柄
  LPCTSTR lpText, // 显示的文本
  LPCTSTR lpCaption, // 标题
  UINT uType  //消息窗口类型
);

// 设备上下本句柄, DC句柄

HDC hDC; // DC Device Context

hDC  = GetDC(hwnd);

TextOut(hDC, 0, 50, "Hello World.", strlen("Hello World."));

ReleaseDC(hwnd, hDC); // 要释放, 不然会内存泄露.

break;

WM_PAINT

窗口重绘的处理

hdc = BeginPaint(hwnd, &ps);//只能在WM_PAINT使用

TextOut(hdc, 0, 0, "Hello", strlen("Hello"));

EndPaint(hwnd, &ps);//只能在WM_PAINT使用

break;

WM_CLOSE

if(IDYES == MessageBox(hwnd, "Exit ?", "Notice", MB_YESNO)

{

DestroyWindow(hwnd); //销毁窗口

}

break;

WM_DESTROY

PostQuitMessage(0);

break;

default

DefWindowProc(hwnd, uMsg, wParam, lParam);

CALLBACK __stdcall

WINAPI  __stdcall

WINAPIV  __cdecl // VC默认使用此项

#include <Windows.h>

#include <stdio.h>

LRESULT CALLBACK WinSunProc(

   HWND hwnd,

   UINT uMsg,

   WPARAM wParam,

   LPARAM lParam

   );

int WINAPI WinMain(

   HINSTANCE hInstance,

   HINSTANCE hPrevInstance,

   LPSTR lpCmdLine,

   int nCmdShow

   )

{

WNDCLASS wndclass;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);

wndclass.hIcon = LoadIcon(NULL, IDI_ERROR);

wndclass.hInstance = hInstance;

wndclass.lpfnWndProc = WinSunProc;

wndclass.lpszClassName = "Xiaodong";

wndclass.lpszMenuName = NULL;

wndclass.style = CS_HREDRAW | CS_VREDRAW;

RegisterClass(&wndclass);

HWND hwnd;

hwnd = CreateWindow("Xiaodong", "DongDongWindow", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

ShowWindow(hwnd, SW_SHOWNORMAL);

UpdateWindow(hwnd);

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

LRESULT CALLBACK WinSunProc(

HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam

)

{

switch(uMsg)

{

case WM_CHAR:

char szChar[20];

sprintf(szChar, "char is %d", wParam);

MessageBox(hwnd, szChar, "Xiaodong...", 0);

break;

case WM_LBUTTONDOWN:

MessageBox(hwnd, "mouse clicked...", "XiaoDong...", 0);

HDC hdc;

hdc = GetDC(hwnd);

TextOut(hdc, 0, 50, "你好啊...", strlen("你好啊..."));

ReleaseDC(hwnd, hdc);

break;

case WM_PAINT:

HDC hDC;

PAINTSTRUCT ps;

hDC = BeginPaint(hwnd, &ps);

TextOut(hDC, 0, 0, "练习窗口...", strlen("练习窗口..."));

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

if (IDYES == MessageBox(hwnd, "Exit Yes OR No ?", "Notice", MB_YESNO))

{

DestroyWindow(hwnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/hongxdong/archive/2010/09/08/5869934.aspx

win32-注册窗口类、创建窗口 阅读详情

相关推荐

Win32 API开发者手册:Windows编程全指南

本文还有配套的精品资源,点击获取 简介:本书是一本针对Windows平台编程的开发者手册,详尽介绍了Win32 API的关键函数和工具。它包括API的基础知识、WinMain函数、消息循环机制、窗口类和句柄、GDI图形绘制、COM组件交互、Winsock网络通信、错误处理、注册表操作、资源管理、文件I/O以及多线程编程和安全权限管理等内容。手册旨在帮助开发者深入理解并有效应...

weixin_42097508的博客 1708

windows消息循环之手撸一个Win32窗口程序

在Windows操作系统中,一个程序通过不断地接收和处理消息来保持活动状态的一种机制。在Windows编程中,消息循环是处理用户输入、操作系统事件和其他消息的关键部分。在Windows应用程序中,用户与程序交互时,比如点击鼠标、按键盘键等,操作系统会生成相应的消息,并将这些消息发送给程序。程序通过消息循环来接收并处理这些消息,然后做出相应的响应。消息循环通常位于程序的主线程中,不断地等待并处理消息,从而实现用户界面的交互和响应。

qq_43589451的博客 1313

实现通过窗体句柄控制鼠标移动和点击的高级技巧

SPY++是一个Windows调试工具,可以通过图形用户界面来浏览和监视系统中的窗口。它可以帮助开发者获取窗口句柄、消息和线程信息。窗口视图:显示系统中的所有窗口,并且以树状结构展现窗口之间的父子关系。子窗口信息:当选中一个窗口后,此部分将显示该窗口的详细信息,如句柄、类名、父窗口句柄等。消息日志:监视选定窗口的所有消息。线程视图:显示系统中的所有线程,并显示每个线程的创建过程。在Windows编程中,

weixin_35754676的博客 1218

win32编程--消息循环

 第五步骤:消息循环在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断地从消息队列中取出消息,并进行响应。要从消息队列中取出消息,我们需要调用GetMessage()函数,该函数的原型声明如下:  BOOL GetMessage(         LPMSG lpMsg,             // address of structure

winner0703的专栏 999

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

ICC II 时钟树综合(CTS)前奏:从约束定义到NDR规则的全方位设置指南

本文详细介绍了ICC II中时钟树综合(CTS)的前期准备工作,包括约束定义、NDR规则设置和时钟平衡点控制等关键步骤。通过实际案例和代码示例,指导工程师如何优化时钟偏斜、插入延迟和信号质量,确保芯片设计的时序收敛和性能稳定。特别强调了非默认布线规则(NDR)在时钟网络设计中的重要性。

weixin_42530458的博客 212

关于使用DWORD编译时出错

关于使用DWORD等类型编译时出错 问题描述 ​ 使用JNI封装第三方的硬件网卡驱动程序,该程序由C++编写。将头文件和库文件通过visual studio引入项目。编译时出现以下错误。 解决方案 ​ 使用第三方库时,如果第三方库中如果有使用DWORD,UNIT等类型时如果第三方的.h文件中没有添加windows.h和windef.h两个头文件。则会报编译错误。这种错误和多个头文件循环依赖差不多。因此自己项目中引入这些头文件时引入windows.h和windef.h。 ...

Stiles的博客 904

自动控制原理之控制系统的数学模型(类比神经网络学习数学模型)

控制系统的数学模型背景建模方法常用的数学模型时域数学模型的建立建立微分方程的步骤复数域模型的建立传递函数的性质系统的典型环节及传递函数比例环节惯性环节积分环节微分环节理想微分环节一阶微分环节二阶微分环节振荡环节延时环节(时滞环节) 背景 数学模型就像是真实世界的写照,它就像一个虚拟的世界,我们可以通过建模的方式了解这个真实世界的运作规律。 这一点很像强化学习,强化学习需要一个供智能体探索、学习的环境,于是,我们通常会事先建立一个虚拟的仿真环境。举个例子,对于人类来说,可能需要经过不断地尝试,甚至是生命的代价

zbp_12138的博客 6569

win32 c++源码大全_C语言游戏开发《梦幻西游项目》源码课件分享(一)

梦幻西游项目1.Win32窗口的机制控制台应用程序与Windows应用程序的区别:控制台应用程序是没有窗口的, 仅供初学者练习一些基本的语法.Windows系统应用程序是有窗口,就是平时大家用得很多的软件(QQ, 爱奇艺, PS等等).2.什么是实例句柄: 程序的身份证中国14亿人口是怎么区分(身份证). Windows系统中有若干的程序是怎么区分(实例句柄)3.窗口的4个步骤: 设计窗口在设计...

weixin_39896256的博客 1414

人机交互期末复习笔记

人机交互期末复习笔记 进行复习的童鞋们可以跟着清华大学《人机交互基础教程第3版(孟祥旭、李学庆、杨承磊、王璐编著)的书籍参照借阅。上面的一字一句皆是敲键盘敲出来的,并且掌握课本的基本内容。 博客中的知识点有些地方会进行粗略的跳过(主要的大框架没有省略),建议有同样需求的读者结合书本与博客一同借阅。本博客有错误的地方多多指正,谢谢大家~ 文章目录人机交互期末复习笔记第一章 绪论 P11.1 人机交互的概念1.2 人机交互的研究内容1.3 人机交互的发展历史(只介绍人机交互阶段)第二章 感知和认知基础 P122

server643的博客 5023

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2125

win32汇编 第一个窗口程序(二)

上一篇,我们已经知道了,一个窗口程序是以事件作为驱动的,其中事件是由消息循环进行处理,首先用GetMessage得到信息,然后TranslateMessage来对信息进行预处理,最后用DispatchMessage调用窗口对应的窗口过程。  补充:应用程序之间也可以进行通信,PostMessage是把消息放到程序的消息队列,用SendMessage是把消息放到应用程序的窗口过程函数里面。  这...

qq_29263207的博客 616

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 463

第一个Win32窗口程序

1.基本概念 在C语言中,printf、scanf、strlen等是C语言库函数,而在Windows平台下,也有由Windows操作系统提供的各种各样的函数,方便开发Windows应用程序,这些函数就是由Windows提供给应用程序编程的接口,简称API函数,用MSDN手册进行查找使用API函数 SDK是软件开发包,包含API函数库、帮助文档、使用手册、辅助工具等资源,实际就是一个资源的集合 窗口通常包含:标题栏、菜单栏、系统菜单、最小化框、最大化框等。分为客户区和非客户区 句柄是各种资源的标识号。Win

procurar的博客 372

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1086

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

Win32开发知识深度考查:从原理到实战的全面突破

Win32开发在当今Windows平台开发中依然占据重要地位,尤其是在处理系统级开发、游戏编程和高性能专业应用时。Win32API作为Windows操作系统的基石,提供了直接、高效的系统控制和资源管理方法,能够解决程序性能不佳、界面响应速度慢等常见问题。本文详细介绍了Win32开发的基础概念、核心架构、关键机制以及实战技巧,帮助开发者深入理解Windows操作系统的工作原理,并掌握构建高性能应用程序的关键技能。通过Win32开发,开发者可以实现对系统底层的完全控制,优化程序性能,并解决复杂的开发挑战。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 1962

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Win32窗口子类化:使用TAB键切换控件焦点

// Win32Project1.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Win32Project1.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 WCHAR szTitle[MAX_L...

csdn_gddf102384398的博客 1069

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Win32开发

Win32开发之初识 一.Win32 基本简介 Windows被开发出来之后,向上提供了一套16/32位的API接口,我们称之为Win16/Win32,当然Win16已经随着16位Windows操作系统被淘汰,但是Win32 API接口一直延续到现在;早期的应用程序都是采用C/C++配合Win32 API去构建和开发出来的,这种方式我们称之为Windows古典应用程序开发! 下面引用Win32编程书籍中一段话: 二.Win32 基本概念 1. 窗体 Windows窗体其实就是屏幕上的一个矩形区域,可以

qq_32667685的博客 2493

什么是消息循环,一个简单的win32程序如何运行?

  预备知识 1.什么是句柄? (HANDLE) 在win32编程中有各种句柄,那么什么是句柄呢? #defineDECLARE_HANDLE(name) struct name##_ {   int unused; }; typedef struct name_* name; 例如HDC的定义 #define DECLARE_HANDLE(HDC) struct...

dd19921114的博客 297

WPARAM 和 LPARAM,消息响应机制

WPARAM 和 LPARAM,消息响应机制 wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:  一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。 到了Win32API中,原来的16位变量也被扩展为32位,因

einstein991225的专栏 531

杂记

2008-05-22DLL 自己的消息循环(win32 DLL):在DLL中,通过CreateWindow创建窗口。就利用该窗口的消息循环作为DLL的消息循环。通过map把消息ID和消息响应函数关联起来,这个工作在程序初始化的时候完成(还没有进行消息循环)。关联需要处理的消息(包括系统消息和自定义消息)后, 再创建窗口。 该窗口的处理函数中,通过消息ID在map中查找该消息的处理函数,如果

FISH 的专栏 940

Windows(一):窗口开发原理

窗口开发原理 一:几个概念 API : 应用程序编程接口(Application Programming Interface),如同C语言的库函数一样,Windows中也有封装好的函数和接口用于操作Windows应用与操作系统即Windows API。头文件为:Windows.h(在VS2019中大概有一万个函数)。我们可以在离线或者在线MSDN中查阅这些API,离线MSDN下载:MSDNLib...

weixin_44795839的博客 2267

Win32编程2

一、Win32编程中的宏 学习windows编程是一个比较难的过程,主要的障碍是因为windows程序中很多新的东西,我们一下子不能适应,下面我们就来扫清这些障碍: ?    我们在上一课中看到了一个简单的windows程序,大家会发现windows程序中有很多全部大写定义的东西,这就是我们的障碍之一,因为,太多的东西我们以前没有见过。   Windows程序中全大写的东西可以分为三种:

woshisaoge的专栏 1425

Wparam与Lparam的区别

在Win32 SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的:  typedef struct tagMSG { // msg  HWND hwnd; //窗口句柄  UINT message; //消息常量标识符  WPARAM wParam; //32位消息的特定附加信息,具体表示什么

Tumbler 1万+
上一篇: d3dUtility.h头文件
下一篇: (根据物品多次建图+最小费用最大流) poj 2516 Minimum Cost
Hashmat
博客等级 码龄16年 14粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值