Windows SDK编程之一 窗口示例程序

/*Win32应用程序框架主要由"初始化窗口类","窗口注册类","窗口的创建"以"窗口消息函数"等组成*/
#include "stdafx.h"


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明

/*
WinMain函数是所有windows应用程序的入口,类似于C语言中的Main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。WinMain函数实现以下功能。
1. 注册窗口类,建立窗口及执行其它必要的初始化工作;
2. 进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程
3. 当消息循环检索到WM_QUIT消息时终止程序运行。

WinMain函数有三个基本的组成部份:函数说明、初始化和消息循环。

WinMain函数的说明如下:
int WINAPI WinMain( //WinMain函数说明
HINSTANCE hInstance, //程序当前实例句柄
HINSTANCE hPrevInstance, //应用程序其它实例句柄
LPSTR lpCmdLine, //指向程序命令行参数的指针
int nCmdShow //应用程序开始执行时窗口显示方式的整数值标识
)
由于Window操作系统是多任务的操作系统,能进行多任务的管理,因此,windows应用程序可能被并行的多次执行,因而可能出现同一个程序的多个窗口同时存在的情况,Windows系统将应用程序每一次执行称为该应用程序的一个实例(Instance),并用一个实例句柄唯一的标识它。

*/
int APIENTRY WinMain(HINSTANCE hInstance, //WinMain函数说明
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
/*
建议采用Pascal的变量定义风格,即在程序(函数)开始处定义所有变量
虽然C++的变量定义比较灵活,本程序为了使程序易于理解,未采用这种方法
*/

char lpszClassName[]="窗口"; //窗口类名
char lpszTitle[]="Windows SDK编程之一 窗口示例程序"; //窗口标题名

//---------------窗口类定义-------------------------------------
/*
窗口类的定义
在Windows应用程序中,窗口害定义了窗口的形式与功能。窗口类定义通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包括窗口类的各种属性,在窗口类定义过程中常用到以下函数:
*/
WNDCLASS wndclass;
wndclass.style=0; //窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //窗口处理函数为WndProc
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //使用缺省图标
/*
LoadIcon():在应用程序中加载一个窗口图标
LoadIcon()函数原型为:
HICON LoadIcon(
HINSTANCE hInstance,//图标资源所在的模块句柄,为NULL则使用系统预定义图标
LPCTSTR lpIconName //图标资源名或系统预定义图标标识名
)
*/


wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
/*
LoadCursor():在应用程序中加载一个窗口光标
LoadCursor()函数原型为:
HCURSOR LoadCursor(
HINSTANCE hInstance,//光标资源所在的模块句柄,为NULL则使用系统预定义光标
LPCTSTR lpCursorName //光标资源名或系统预定义光标标识名
)
*/

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色
/*
GetStockObject():获取已经定义的画笔、画刷、字体等对象的句柄
GetStockObject()函数原型为:
HGDIOBJ GetStockObject(int fnObject); //fnObject为对象的标识名

*/

wndclass.lpszMenuName=NULL; //窗口中无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名为'窗口实例'

//------------------以下是进行窗口类的注册---------------------------

/*
注册窗口类
Windows系统本身提供部份预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由注册函数RegisterClass()实现。其形式为:
RegisterClass(&wndclass)
&wndclass为窗口类结构
RegisterClass函数的返回值为布尔值,注册成功则返回真
*/
if (! RegisterClass(&wndclass)) //注册窗口,若失败,则发出声音
{ MessageBeep(0);
return FALSE;
}

/*
创建窗口实例
创建一个窗口类的实例由函数CreateWindow()实现,该函数的原型为:
HWND CreateWindow(LPCTSTR lpszClassName, //创建窗口,窗口类名
LPCTSTR lpszTitle, //窗口实例的标题名
DWORD dwStyle, //窗口的风格
int x, //窗口左上角坐标
int y, //窗口左上角坐标
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hwndParent, //此窗口父窗口
HWENU hMenu, //此窗口主菜单
HINSTANCE hInstance, //应用程序当前句柄
LPVOID lpParam); //指向一个传递给窗口的参数值的指针
*/

//创建窗口操作
HWND hwnd; //窗口结构
hwnd=CreateWindow(lpszClassName, //创建窗口,窗口类名
lpszTitle, //窗口实例的标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT,CW_USEDEFAULT, //窗口左上角坐标为缺省值
CW_USEDEFAULT,CW_USEDEFAULT, //窗口的高度和宽度为缺省值
NULL, //此窗口无父窗口
NULL, //此窗口无主菜单
hInstance, //应用程序当前句柄
NULL); //不使用该值

ShowWindow(hwnd,nCmdShow); //显示窗口

UpdateWindow(hwnd); //绘制用户区


/*
消息循环
windows应用程序的运行以消息为核心。windows将产生的消息放入应用程序的消息队列中而应用程序WinMain函数的消息循环提取消息队列中的消息,并将其传递给窗口函数为相应处理过程处理。
MSG msg; //消息结构

while( GetMessage(&msg,NULL,0,0)) //消息循环
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
*/

MSG msg; //消息结构
/*GetMessage()作用:从消息队列中读取一条消息,并将消息放在一个MSG结构中:
BOOL GetMessage(
LPMSG lpMsg, //指向MSG结构的指针
HWND hWnd,
UINT wMsgFilterMin, //用于消息过滤的最小信息号值
UINT wMsgFilterMax //用于消息过滤的最大信息号值 如最小值和最大值均为0, 则不过滤消息
);
当GetMessage返回0时,即检索到WM_QUIT消息,程序将结束循环并退出

BOOL TranslateMessage( const MSG *lpMsg ); 负责把消息的虚拟键值转换为字符信息
LRESULT DispatchMessage( const MSG *lpmsg ); 将参数lpmsg指向的消息传递给指定的窗口

*/
while( GetMessage(&msg,NULL,0,0)) //消息循环
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam; //程序终止时,将信息返回操作系统
}


//-----------------------------窗口函数---------------------------------------
/*
窗口消息处理函数定义了应用程序对接收到的不同消息的响应,它包含了应用程序对各种可用接收到的消息的处理过程,通常 ,窗口函数由一个或多个switch...case语句组成,每一条case语句
对应一种消息,当应用程序接收到一个消息时,相应的case语句被 激活并执行相应的响应程序模块。
窗口函数的一般形式如下:
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
Parameters

hwnd :[in] Handle to the window.
uMsg :[in] Specifies the message.
wParam:[in] Specifies additional message information. The contents of this parameter depend on the value of the uMsg parameter.
lParam:[in] Specifies additional message information. The contents of this parameter depend on the value of the uMsg parameter.
Return Value 
The return value is the result of the message processing and depends on the message sent.

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case ...
....
break;
.........
case WM_DESTROY:
//void PostQuitMessage(int nExitCode)函数的作用是向程序发送WM_QUIT消息,nExitCode应用程序退出代码
PostQuitMessage(0); //调用该函数发出WM_QUIT消息
default: //缺省消息处理函数,以保证所的发往窗口的消息都能被处理
return DefWindowProc(hwnd,message,wParam,lParam);
}

return (0);
}

*/
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0); //调用该函数发出WM_QUIT消息
default: //缺省消息处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}

return (0);
}
/*
注:
事件驱动的特点:
Windows程序设计围绕着事件或消息的产生驱动产生运行消息处理函数。Windows程序的执行顺序取决于事件发生的顺序,程序的执行是由顺序产生的消息驱动的,程序员可以针对消息类型编写消息处理程序以处理接收的消息,或者发出其他消息以驱动其他处理程序,但是不必预先确定消息的产生顺序。这是面向对象编程中事件驱动的显著特点。
事件驱动编程方法对于编写交互程序很有用处,用这一方法编写的程序使程序避免了死板的操作模式,从而使用户能够按照自己的意愿采用灵活多变的操作模式。
Windows应用程序中的消息传递机制:
VC中存在几种系统定义的消息分类,常用的消息由窗口消息、初始化消息、输入消息、系统消息、剪切板消息、文当界面消息、DDE(动态数据交换)消息、应用程序自定义消息等。应用程序发送的消息发送至消息队列,系统根据消息到达的顺序对消息进行处理,并调用响应的消息处理模块代码。*/

转载于:https://www.cnblogs.com/draeag/archive/2007/09/26/906681.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下用apache+perl搭建最简单的聊天室

最近学习了下perl,尝试自己搭建一个聊天室,现已搭建成功,但设计方法很简陋,误见笑,收获在于对apache、html、perl都有了些许认识,后面打算学习LAMP(LinuxApacheMySQLPHP)搭建一个在线…

闲聊型对话系统之NLG总结报告

文章目录1 项目介绍1.1 背景知识介绍1.2 NLG的实现方式1.2.1 基于模板1.2.2 检索式1.2.3 生成式1.3 数据集介绍2 技术方案梳理2.1 模型介绍2.2 评价指标2.3 模型实现2.3.1 数据处理2.3.2 构建dataset2.3.3 模型定义2.3.4 训练相关参数2.3.5 训练结果1 项目介绍 1.1 背景知识介…

spring mvc学习(50):java.lang.ClassNotFoundException: org.springframework.web.servlet. DispatcherSe

今天朋友发了个maven项目给我看,问我为什么启动不了。说实话,一直用Jfinal都快不会用spring了… 还是决定看看。 接收了文件,是maven构建的,打开eclipse,导入maven项目,然后部署到tomcat,启动t…

Luogu2439 [SDOI2005]阶梯教室设备利用 (动态规划)

同上一题&#xff0c;区间改左闭右开就双倍经验了。貌似可以跑最长路。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a (b); a < (c); a) #defi…

Python是如何进行内存管理的

从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 Python内部使用引用计数&#xff0c;来保持追踪内存中的对象&#xff0c;所有对象都有引用计数。 引用计数增加的情况&#xff1a; 1&#xff0c;一个对象分配一个新名称 2&#xf…

spring mvc学习(51):jsonp

引入jar包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

抓狂

每次要给财务提交timecard报表&#xff0c; 就会遇到那些乱七八糟的事情&#xff0c; 浪费时间而无意义&#xff0c; 几个小时之后&#xff0c;我真的都想杀人&#xff0c; 在杀人与不杀之间徘徊良久&#xff0c;终于忍住&#xff0c; 那些PM根本就不负起自己的责任&#xff0c…

什么是word2vector

原文地址&#xff1a;https://www.julyedu.com/questions/interview-detail?quesId2761&cateNLP&kp_id30 什么是 Word2vec? 在聊 Word2vec 之前&#xff0c;先聊聊 NLP (自然语言处理)。NLP 里面&#xff0c;最细粒度的是 词语&#xff0c;词语组成句子&#xff0c…

spring mvc学习(52):json数据类型提交

引入jar包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

关注:Eclipse,转贴eclipse CDT的开发文章

致谢&#xff1a;Tinyfool的鼎立相助&#xff01; cdt是在eclipse中编写C程序的插件&#xff0c;虽然还不是很完美&#xff0c;但是是在windows中编写linux下C程序&#xff08;GNU C&#xff09;的一个好途径。按照eclipse的官方网站的要求&#xff0c;要下载如下的东东…

[译作]Class in Jscript Part I

【原文地址】 Classes in Jscript - Part I 【原文发表日期】 Monday, September 24, 2007 9:23 AM by don.raman 我是Ritesh Parikh&#xff0c;最近刚转入Jscript Team作一名SDET&#xff08;译注&#xff1a;我也不知道SDET是什么样的岗位:(&#xff09;。我刚接触Jscript…

第三课 SVM(2)

1 线性可分的数据集 1.1 超平面 SVM的思想是找到最大间隔的分隔超平面。 在两个分类中&#xff0c;找到能够一条线&#xff0c;以最好地区分这两个分类。这样如果有了新的点&#xff0c;这条线也能很好地做出分类。 这样的线在高维样本中的时候就叫做超平面。 1.2 几何间隔与…

musql-mmm

http://mysql-mmm.org/转载于:https://www.cnblogs.com/fanweixiao/archive/2010/11/05/1870267.html

《C Traps and Pitfalls》 笔记

这本书短短的100多页&#xff0c;很象是一篇文章。但是指出的很多问题的确容易出现在笔试的改错题中--------------------------------------------------------------------第1章 词法陷阱1.1 和 1.3 词法分析的"贪心法则"编译器从左到右读入字符&#xff0c;每个符…

spring mvc学习(53):回顾和springmvc返回值类型总结

媒体类型 MIME媒体类型&#xff08;简称MIME类型&#xff09;是描述报文实体主体内容的一些标准化名称&#xff08;比如&#xff0c;text/html、image/jpeg&#xff09;。 因特网有数千种不同的数据类型&#xff0c;HTTP仔细地给每种要通过web传输的对象都打上了名为MIME类型的…

2019hdu多校1

1009 考虑贪心&#xff0c;暴力枚举一位。 $o(676n)$ #include<bits/stdc.h> using namespace std; const int N1e5333; int n,m,zl; int pos[26],cnt[N],t[26],az[N]; char s[N],st[N]; int l[N],r[N],nx[N],zzq[26]; int main(){ios::sync_with_stdio(0);//freopen(&qu…

关于梅花雪的js树

最近一段时间&#xff0c;为了学习java&#xff0c;天天在看别人的框架&#xff0c;为了实现一颗树&#xff0c;找到了一个改写梅花雪的js&#xff0c;下面是一个基本的结构<% page language"java" import"java.util.*" pageEncoding"GBK"%&g…

总和最大区间问题

题目和解题思路来源于吴军著作《计算之魂》。本题目是例题1.3。 文章目录1 问题描述2 解题思路2.1 三重循环2.2 两重循环2.3 分治法2.4 正反两遍扫描的方法2.5 再进一步&#xff0c;假设失效3 应用动态规划1 问题描述 总和最大区间问题&#xff1a;给定一个实数序列&#xff0…

spring mvc学习(54):简单异常处理

引入jar包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

【原】docker部署单节点consul

docker下部署单节点的consul&#xff0c;最重要的是在run consul时&#xff0c;配置-bootstrap-expect1 docker run --name consul1 -d -p 5902:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 10.109.30.246:5901/daily_docker/consul:1.4.5 agent -server -boots…