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 编程开始, 创建窗口, 消息的处理, 消息循环的更多相关文章

  1. windows sdk编程 richedit创建,像十六进制编辑器一样显示文件

    编译环境 :windows 7 64位 vs2010,工程创建选择"win32项目" 注意添加几个头文件 #include <WinBase.h> #include & ...

  2. Windows编程___创建窗口

    创建Windows窗口不难,可以简要的概括为: 1,# 注册一个窗口类 填充WNDCLASS结构 书写窗口消息处理函数WinProc 2,# 创建一个窗口 填写基本的窗口信息 3,# 显示窗口 4,# ...

  3. win32 sdk 环境下创建状态栏

    今天在学习状态栏,出了好多的问题,这里记录下. 要创建状态栏用:CreateStatusWindow CreateStatusWindow函数创建一个状态窗口,通常用于显示应用程序的状态.窗口通常显示 ...

  4. <转载>Win32控制台工程中创建窗口

    有的时候,用控制台同步输出调试信息.程序状态量,比出Log.弹出报错对话框等方法来得有效.那么如何做到呢?如下: 简而言之,用GetModuleHandle()函数获得当前程序实例句柄,其它地方与常见 ...

  5. Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决

    最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...

  6. (一)Win消息机制,SDK编程基础

    一,基本概念 SDK:软件开发工具包(缩写:SDK.外语全称:Software Development Kit) API:应用程序接口 WINAPI:Windows平台下的系统调用,包含 window ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  8. Win32 程序开发:创建一个应用程序窗口

    一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...

  9. Win32 SDK程序创建一些控件(简单调用InitCommonControlsEx,并指定ICC_LISTVIEW_CLASSES控件就可以了)

    在Win32 SDK中创建一些控件的时候需要注意一下(具体是哪些控件请参看MSDN文档中列出来的) /* MSDN:Carries information used to load common co ...

随机推荐

  1. css3弹性盒模型flex快速入门与上手1

    一.什么是flex? flex是css3中引入的一种布局方式,可以非常灵活高效控制元素的排列与对齐方式,大多人称之为弹性布局. 二.怎么使用flex? 任何一个容器都可以指定为flex布局 #box ...

  2. springboot高并发redis细粒度加锁(key粒度加锁)

    本文探讨在web开发中如何解决并发访问带来的数据同步问题. 1.需求: 通过REST接口请求并发访问redis,例如:将key=fusor:${order_id} 中的值+1: 2.场景: 设想,多线 ...

  3. mac idea sbt工程打jar包

    1.首先保证sbt已下载,否则下载homebrew:在命令行输入/usr/bin/ruby XXX ->下载完成后在终端输入brew install sbt ->安装完毕后可以打jar包 ...

  4. Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  5. 吐槽CSDN--想赚钱想疯了--强行升级皮肤--增加广告位

    一直对CSDN很有好感,和博客园同是技术分享的好平台,但是界面更清爽,用户间互动也较多.在学生时代就一直在用,平时抄个作业,竞赛搜个题,论文需要凑字数等等.当年为了下载一份源代码,或者为了下载某本买不 ...

  6. CSS滤镜效果

    使用 filter: blur() 生成毛玻璃效果 使用 filter: drop-shadow() 生成整体阴影效果 使用 filter: opacity() 生成透明度 blur生成阴影 通常我们 ...

  7. [js高手之路]html5 canvas动画教程 - 下雪效果

    利用canvas,实现一个下雪的效果,我们先预览下效果: 我们先分析下这个效果: 1,随机产生雪花 2,雪花的产生不是同时产生,而是有先后顺序的 3,雪花怎么表示 4,怎么源源不断的下雪 5,雪花有大 ...

  8. PHP 支付

    蚂蚁金服开放平台 2.下载PHP的SDK&demo 3.申请应用 OR 使用沙箱环境 4.生成应用私钥&应用公钥 5.配置config.php 蚂蚁金服开放平台",对,没错, ...

  9. win10 UWP MessageDialog 和 ContentDialog

    我之前开发一个软件 winMarkdown,这个软件在关闭需要提示用户还没有保存东西,需要保存,如果用户选择退出,那么把数据存放. 在Metro程序中,没有传统的窗口,当我们要用需要交互的消息提示时, ...

  10. JavaScript对象之关联数组

    Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要 ...