Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
Windows SDK 编程的一般步骤为:
1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx.
2. 创建窗口, 函数 CreateWindowEx.
3. 消息循环, 结构 MSG, 函数 GetMessage, TranslateMessage, DispatchMessage.
4. 进入无限循环, 消息处理 :-)
下面是代码, 当然, 还有分析:
#include <windows.h> //包含 Windows 相关的 API 函数 //这里就是所谓的消息处理函数了
//CALLBACK 说明当前函数是回调函数, 就是说明调用约定
//hwnd:窗口句柄, uMsg:收到的消息, wParam, lParam:与该消息有关的参数
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg) //消息选择
{
//这里我添加一个左键按下的消息
case WM_LBUTTONDOWN:
MessageBox(hwnd, "左键按下", "提示", MB_OK);
return 0; case WM_DESTROY: //当前窗口被销毁时
PostQuitMessage(0); //发出退出程序的消息
return 0; //如果处理了该消息, 就返回 0 来告知 Windows case WM_CLOSE: //当用户点击窗口右上角的关闭按钮时
DestroyWindow(hwnd); //销毁窗口
return 0; case WM_PAINT: //当窗口需要重绘时
{
PAINTSTRUCT ps = {0};
BeginPaint(hwnd, &ps); //开始重绘 EndPaint(hwnd, &ps); //结束重绘
return 0;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
//对于我们不想处理的消息, 比如鼠标在窗口上移动时发出的消息
//我们就原样传给默认的窗口消息处理函数处理, 不然应用程序会失去响应
} int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//注意 Windows 程序应该使用 WinMain 入口函数了, 不再使用 main 函数
//当然, 如果不创建窗口, 不使用窗口 也可以使用 main.
WNDCLASSEX wc = {0}; //窗口类结构, 为注册窗口类作准备
wc.cbClsExtra = 0; //附加的类信息, 没有, 设为0
wc.cbSize = sizeof(wc); //WNDCLASSEX结构的大小
wc.cbWndExtra = 0; //窗口额外内存, 没有, 设为0
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 这里使用灰色背景
wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //应用程序使用的鼠标类型
wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光标类型
wc.hIconSm = NULL; //应用程序程序的小光标, 不管, 设为 NULL
wc.hInstance = hInstance; //应用程序程序实例句柄, 由 WinMain 函数传递过来
wc.lpfnWndProc = WndProc; //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址
wc.lpszClassName = "vbgk_class"; //创建类时使用的类名, 可以自定义
wc.lpszMenuName = NULL; //菜单, 没有, 就使用 NULL
wc.style = CS_HREDRAW | CS_VREDRAW; //类的风格, 垂直重绘, 水平重绘 if(!RegisterClassEx(&wc)) //注册窗口类
{
MessageBox(NULL, "Register Class Failed!", NULL, MB_OK);
return 1;
} //创建窗口咯, 介绍一下 CreateWindowEx 函数的参数
HWND hWnd = CreateWindowEx(
0, //扩展窗口风格
"vbgk_class", //这里就是我们刚才创建的窗口类名
"木木ing",
WS_OVERLAPPEDWINDOW,//窗口风格
CW_USEDEFAULT, //初始化时的 X 坐标
CW_USEDEFAULT, //Y坐标
320, //窗口宽度, 我们这里设为 320
240, //窗口高度
NULL, //父窗口句柄, 没有
NULL, //菜单, 没有
hInstance, //实例句柄, 来自WinMain
NULL //发送 WM_CREATE 消息时的附加参数, 一般为零
);
if(!hWnd)
{
MessageBox(NULL, "CreateWindowEx Failed!", NULL, MB_OK);
return 2;
} UpdateWindow(hWnd); //更新窗口
ShowWindow(hWnd, nCmdShow); //显示窗口 MSG msg;
BOOL bRet;
//进入消息循环
while((bRet = GetMessage(&msg, NULL, 0, 0)) != -1)
{
if(bRet == 0)
{
break;
} TranslateMessage(&msg); //翻译消息
DispatchMessage(&msg); //分发消息
} return msg.wParam; //WinMain函数结束, 整个程序退出
}

Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环的更多相关文章
- windows sdk编程 richedit创建,像十六进制编辑器一样显示文件
编译环境 :windows 7 64位 vs2010,工程创建选择"win32项目" 注意添加几个头文件 #include <WinBase.h> #include & ...
- Windows编程___创建窗口
创建Windows窗口不难,可以简要的概括为: 1,# 注册一个窗口类 填充WNDCLASS结构 书写窗口消息处理函数WinProc 2,# 创建一个窗口 填写基本的窗口信息 3,# 显示窗口 4,# ...
- win32 sdk 环境下创建状态栏
今天在学习状态栏,出了好多的问题,这里记录下. 要创建状态栏用:CreateStatusWindow CreateStatusWindow函数创建一个状态窗口,通常用于显示应用程序的状态.窗口通常显示 ...
- <转载>Win32控制台工程中创建窗口
有的时候,用控制台同步输出调试信息.程序状态量,比出Log.弹出报错对话框等方法来得有效.那么如何做到呢?如下: 简而言之,用GetModuleHandle()函数获得当前程序实例句柄,其它地方与常见 ...
- Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决
最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...
- (一)Win消息机制,SDK编程基础
一,基本概念 SDK:软件开发工具包(缩写:SDK.外语全称:Software Development Kit) API:应用程序接口 WINAPI:Windows平台下的系统调用,包含 window ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI
第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...
- Win32 程序开发:创建一个应用程序窗口
一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...
- Win32 SDK程序创建一些控件(简单调用InitCommonControlsEx,并指定ICC_LISTVIEW_CLASSES控件就可以了)
在Win32 SDK中创建一些控件的时候需要注意一下(具体是哪些控件请参看MSDN文档中列出来的) /* MSDN:Carries information used to load common co ...
随机推荐
- 给tableView设置headerView时遇到的问题
在ViewDidLoad里面设置了 self.tableView.tableHeaderView = 自定义的View 然后在模拟器上运行后,发现这个HeaderView挡住了后面的Cell,也就是c ...
- zoj 1938 Binomial Showdown 组合数裸基础
Binomial Showdown Time Limit: 2 Seconds Memory Limit: 65536 KB In how many ways can you choose ...
- DataGrid 如何得到DataGridRow 和DataGridCell 对象
第一行为不可编辑 DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(0); ...
- cocos2dx - 节点管理
接上一节内容:cocos2dx - v2.3.3编辑器骨骼动画 本节主要Cocos2dx中节点的管理及应用 一般用法 用过Cocos2dx应该都有用过addChild,removeChild方法.或者 ...
- python第五课——自定义线程池
内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...
- C 结构体零散知识点
1.结构体无法把自己作为成员,但可以包含指向自己的指针成员 2.定义不完整结构类型(类型,结构,占用空间无法确定,如void指针,声明没有指明数组长度数组)只能使用小标签,即struct struct ...
- APUE 4 - 线程<2> : 线程同步
当控件的多个线程共享统一内存时,我们需要确定各个线程访问到的数据的一致性.在cpu结构中,修改操作由多个内存读写周期(memory cycle),而在这些内存周期之间, 有可能会发生其他线程的内存读操 ...
- OpenCV4Android背景建模(MOG、MOG2)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 很久以前的笔记了,分享给大家吧...OpenCV4Android中用于背景建模的类主要 ...
- thinkphp3.2开发网页实现第三方登录
1.在要添加登录的html里添加登录按钮: <a href="{:U('Public/login/',array('type'=>'weixin'))}">< ...
- ArrayList 源码(基于Java1.8)
ArrayList 源码 ArrayList 基于数组实现,也就是类对变量 Object[]系列操作,封装为常用的add,remove,indexOf, contains本质是通过 size 计数器对 ...