Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。
     客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
     因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。循环退出后,程序即结束。

下面是一个相应鼠标左键单击事件的小示例:

Code#include <windows.h>

void InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); /********************************************
* WinMain 主程序入口 *
********************************************
* hInstance 面向应用程序的当前句柄 *
* hPrevInstance 此时的当前句柄 *
* lpCmdLine 命令行的字符串 *
* nCmdShow 启动时的显示方式 *
********************************************/
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MessageBox(GetFocus(),"Hello world!","Message",MB_OK);
//MessageBox(NULL,"Hello world!","Message",MB_OK);
//MessageBox(NULL,lpCmdLine,"CmdLine",0);
InitApplication(hInstance);
if(InitInstance(hInstance,nCmdShow))
{
//return 0;
while(GetMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (msg.wParam);
} /************************************
* InitApplication 初始化程序 *
************************************
* hInstance 面对应用的句柄 *
************************************/
void InitApplication(HINSTANCE hInstance)
{
// 注册窗口类
WNDCLASSEX wc;
wc.cbSize=sizeof(wc);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=(WNDPROC)MainWndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="MainClass";
wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
if (!RegisterClassEx(&wc))
{
MessageBox (NULL, TEXT ("RegisterClass Fail!"),
“Message”, MB_ICONERROR) ;
}
} /********************************
* InitInstance 初始化窗口 *
********************************
* hInstance 面对应用的句柄 *
* nCmdShow 启动时的显示方法*
********************************/
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("MainClass", // 窗口类名称
"Image Processing",// 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口风格
CW_USEDEFAULT, // 窗口位置大小
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, // 父視窗的 handle,若本視窗是父視窗,則設為 NULL
NULL, // 選單的 handle
hInstance, // 主程式句柄
NULL); // 額外資料的指標,若無額外資料通常都設為 NULL
if (hWnd==NULL)
return (FALSE);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
} /****************************
* MainWndProc 信息的处理 *
****************************
* hWnd 窗口 *
* message 信息 *
* wParam 字参数 *
* lParam 长参数 *
****************************/
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// 处理感兴趣的消息
switch (message)
{
// 鼠标左键按下事件
case WM_LBUTTONDOWN:
MessageBox(hWnd,"鼠标左键已被按下!","Message",MB_OK);
break; // 当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
case WM_DESTROY:
MessageBox(GetFocus(),"Thank you for used!","Message",MB_OK);
PostQuitMessage(0);
break; // 不感兴趣的消息转交给系统提供的缺省处理函数处理
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}

Windows程序的更多相关文章

  1. 初识Windows程序

    首先,我们创建第一个Windows程序,一共分为4个步骤: 1.打开Visual Studio开发工具 2.选择"文件"→"新建"→"项目" ...

  2. Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  3. Visual Studio 创建C++或C#Windows程序

    使用工具Visual Studio,创建一个C++或C#Windows程序,在主窗口中显示“Hello World”,用户可以用鼠标拖动“Hello World”在主窗口中移动 首先创建一个项目​ 选 ...

  4. Linux下运行windows程序

    现在Winxp停止了支持,那我们的windows程序是否可以再linux上执行呢,如下是一些参考的信息 在您的 Linux/Mac 操作系统上运行 Windows 软件 http://www.wine ...

  5. 深入浅出话VC++(1)——Windows程序内部运行机制

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  6. 通过weburl 启动windows程序

    1. 注册表修改 建立一个reg文件 执行导入  以RunLocal协议为例子 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\RunL ...

  7. 窗体==>>初始Windows程序

    初识Windows程序 01.创建Windows程序(VS) 01.打开Visual Studio开发工具 02.选择"文件"→"新建"→"项目&qu ...

  8. windows程序防狼术入门

    当初由于一些原因以及兴趣,学习了一段时间软件逆向,对于软件加密解密有了点粗略的了解.而后看到某些同学辛辛苦苦的搞出个软件,自己费心费力去加密,但搞出来后往往能被秒破,实不忍心.今天大概总结下一些基本的 ...

  9. Windows程序----初识Windows程序

    先来看一些励志名言来激励一下自己吧!  励志名言:每一发奋发奋的背后,必有加倍的赏赐 1.有无目标是成功者与平庸者的根本差别. 2.成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 3.当 ...

  10. 关于windows程序的学习及思考系列之一

    1.窗口类的注册 a.windows程序中最简单的就是创建一个简单的窗口,而窗口程序的创建是基于窗口类的,窗口类决定了处理窗口消息的过程函数. b.一个窗口类可以用于创建多个窗口,也就是说窗口是窗口类 ...

随机推荐

  1. Spring Security ——AuthenticationProvider

    AuthenticationProvider 目录 1.1     用户信息从数据库获取 1.1.1    使用jdbc-user-service获取 1.1.2    直接使用JdbcDaoImpl ...

  2. [NewCoder 7] 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 水题,直接上代码: class Solution { public: void push(int nod ...

  3. WinForm POST上传与后台接收

    前端 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using ...

  4. dotnet core瘦身发布

    需要安装nuget包Microsoft.Packaging.Tools.Trimming然后利用如下命令发布dotnet publish -r win10-x64 -c release --self- ...

  5. 【译】准备好你求职时候用的 GitHub 账号

    我目前正在招聘,很多人分享了他们的GitHubs个人资料和项目,但是维护得很差,所以我决定为活跃的求职者写一个小指南. 无论是否合理,技术招聘人员倾向于从您的GitHub个人资料中推断出很多关于您的信 ...

  6. Google guava cache源码解析1--构建缓存器(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 下面介绍在LocalCache(CacheBuilder, CacheLoader)中调用的一些方法: Ca ...

  7. Lerning Entity Framework 6 ------ Inserting, Querying, Updating, and Deleting Data

    Creating Entities First of all, Let's create some entities to have a test. Create a project Add foll ...

  8. Http/Https抓包工具Charles最新版破解教程(Windows|Mac)

    Charles介绍 Charles是一款强大的http/https抓包工具,可以抓取各种数据请求,查看请求的头信息,请求信息,返回信息等.本文主要介绍Charles的破解过程,包括Windows平台和 ...

  9. MariaDB 主从同步与热备(14)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  10. 上台阶问题(递归,DFS)

    题目 一共39层台阶.如果我每一步迈上1个台阶或者两个台阶,先迈左脚,再迈右脚,然后左右交换,最后一步迈右脚,也就是一共要走偶数步,那么,上完39级台阶,有多少种不同的方法? 思路 采用递归的思想,边 ...