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. ASP.Net MVC 布局页 模板页 使用方法详细说明

    一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...

  2. codesmith连接Mysql提示“找不到请求的 .Net Framework Data Provider。可能没有安装。"

    1,首先需要将MySql.Data.dll复制到codesmith安装目录下bin文件夹下,注意dll的版本 2,其次因为codesmith7采用的是.net4.0的配置文件,(64位系统)找到C:\ ...

  3. 大数据算法设计模式(1) - topN spark实现

    topN算法,spark实现 package com.kangaroo.studio.algorithms.topn; import org.apache.spark.api.java.JavaPai ...

  4. plsql部分字段中文乱码,sqlplus中文乱码

    PLSQL中文乱码 问题: 解决: 思路1:设置 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 结果:并不能解决问题!   ...

  5. mysql执行sql脚本

    最近用mysql执行sql脚本,遇到一些问题,顺便记录一下笔记. 首先,先开启mysql服务,创建一个空数据库(脚本里没有创建数据库) 执行脚本有两个方法 1.未连接数据库:在Windows下使用cm ...

  6. win10 uwp 圆角按钮

    本文讲的是如何做圆角按钮,我们在UWP本来的按钮都是矩形,圆角Radius没有,所以本文就用简单方法去做圆角按钮. 我们按钮需要圆角,而自带没有,其实做一个很简单,把原来的按钮变为背景透明,然后使用矩 ...

  7. vi 编辑器笔记

    摘要: vi从安装到使用 vi从菜鸟到高手 0. vim - Vi IMproved, a programmers text editor 分为 VI和VIM,现在流行的发行版里面VI=VIM 是一个 ...

  8. SrpingDruid数据源加密数据库密码

    前言 在工作中遇到这样一个问题:开发过程中将数据库的账号.密码等信息配置在了一个单独的properties配置文件中(使用明文).但运维人员要求在配置文件中的密码一律不得出现明文. 环境 Spring ...

  9. 主键乱序插入对Innodb性能的影响

    主键乱序插入对Innodb性能的影响 在平时的mysql文档学习中我们经常会看到这么一句话: MySQL tries to leave space so that future inserts do ...

  10. js原生API妙用(一)

    复制数组 我们都知道数组是引用类型数据.这里使用slice复制一个数组,原数组不受影响. let list1 = [1, 2, 3, 4]; let newList = list1.slice(); ...