#include <windows.h>

 

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

//WinMain功能被分配一个WINAPI模式(文件里定义的全部Windows函数都被指定这样的型态),而WndProc函数被指定一个CALLBACK型态。这两个标识符都被定义为_stdcall。表示在Windows本身和使用者的应用程序之间发生的函数呼叫的呼叫參数传递方式。

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,//HINSTANCE运行实体(程序本身)句柄。

hInstance和hPrevInstance的(h表示句柄,匈牙利表示法。小写开头

                    PSTR szCmdLine, int iCmdShow) //PSTR==char *  szCmdLine(sz表示以0结束的字符串)匈牙利表示法。iCmdShow的i表示整数,WinMain的第三个參数的PSTR数据型态是指向一个字符串的指针

{

     static TCHAR szAppName[] = TEXT ("HelloWin") ;//窗体类别的名称

     HWND         hwnd ;//HWND窗体句柄

     MSG          msg ;//MSG消息结构,msg是MSG形态的结构

     WNDCLASS     wndclass ;//窗体类别结构





     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;//两个窗体类别样式,CS_HREDRAW,表示水平,redraw刷新屏幕。每当窗体的水平方向大小(CS_HREDRAW)或者垂直方向大小(CS_VREDRAW)改变之后。窗体要全然重画。

     wndclass.lpfnWndProc   = WndProc ;//lpfnWnproc   l(long)p(指针)fn(函数)==指向函数的长指针

     wndclass.cbClsExtra    = 0 ;//cb前缀表示字节数。用于在窗体类别结构预留一些额外的空间

     wndclass.cbWndExtra    = 0 ;//用于在Windows内部保存的窗体结构中预留一些额外的空间这里没实用到,所以为0

     wndclass.hInstance     = hInstance ;//程序运行的实体句柄,h表示句柄,instance是样例。实例的意思

//要取得预先定义图示的句柄,能够将第一个參数设定为NULL来呼叫LoadIcon。IDI_APPLICATION图标是一个简单的窗体小图形。

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;//icon是图标,loadIcon函数载入图标。对于预先定义图示,此參数是以IDI開始的标识符,IDI是图示ID

//cursor是鼠标,光标的意思。LoadCursor函数载入一个预先定义的鼠标光标(命名为IDC_ARROW),当鼠标光标在根据这个类别建立的窗体的显示区域上出现时,它变成一个小箭头。

     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;//loadcursor载入提前定义的鼠标光标,IDC是游标ID

//hbr前缀代表handle to a brush(画刷句柄)。

画刷是个画图词汇,指用来填充一个区域的着色样式.这里所看到的的GetStockObject呼叫将传回一个白色画刷的句柄:

     wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH) ;//GetStockObject取得一个图形对象。hbr代表一个画刷





     wndclass.lpszMenuName  = NULL ;//lpsz以0结尾字符串的指针,制定菜单

     wndclass.lpszClassName = szAppName ;//定义窗体类别的文字名称





     if (!RegisterClass (&wndclass))//registerclass注冊窗体类别,&wndclass志向wndclass的指针

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"), //messagebox显示消息框

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

     //createwindow 依据窗体类别建立一个窗体,CW建立窗体,WS窗体样式,窗体类别样式,IDI图示ID。IDC游标ID,WM窗体消息

//窗体类别定义了窗体的一般特征,因此能够使用同一窗体类别建立很多不同的窗体。

实际呼叫CreateWindow建立窗体时,可能指定有关窗体的更具体的信息。

     hwnd = CreateWindow (szAppName,                  // window class name窗体的类名。

                          TEXT ("The Hello Program"), // 窗体标题」是显示在标题列中的文字。

WS_OVERLAPPEDWINDOW,        // window style. over(lapped重叠的意思)window创建一个具有WS_OVERLAPPED,WS_CAPTION。WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗体,与WS_TILEDWINDOW风格同样。

                          CW_USEDEFAULT,              // initial x position

                          CW_USEDEFAULT,              // initial y position

                          CW_USEDEFAULT,              // initial x size

                          CW_USEDEFAULT,              // initial y size

                          NULL,                       // parent window handle,在建立一个「最上层」窗体,如应用程序窗体时,凝视为「父窗体句柄」的參数设定为NULL。

                          NULL,                       // window menu handle

                          hInstance,                  // program instance handle

                          NULL) ;                     // creation parameters,最后。「建立參数」指标设定为NULL。能够用这个參数存取稍后程序中可能引用到的数据。

     

     ShowWindow (hwnd, iCmdShow) ;//showwindow在屏幕上显示窗体。第二个參数是作为參数传给WinMain的iCmdShow。

它确定最初怎样在屏幕上显示窗体。是一般大小、最小化还是最大化。在開始菜单中安装程序时。使用者可能做出最佳选择。

假设窗体按一般大小显示,那么WinMain接收到后传递给ShowWindow的就是SW_SHOWNORMAL﹔假设窗体是最大化显示的,则为SW_SHOWMAXIMIZED。而假设窗体仅仅显示在工作列上,则是SW_SHOWMINNOACTIVE。

UpdateWindow (hwnd) ;//指示窗体自我更新

     //getmessage第二、第三和第四个參数设定为NULL或者0。表示程序接收它自己建立的全部窗体的全部消息。

while (GetMessage (&msg, NULL, 0, 0))//getmessage从消息队列中取得消息

     {

//将msg结构传给Windows,进行一些键盘转换。(

          TranslateMessage (&msg) ;//translatemesage转义某些键盘消息

          DispatchMessage (&msg) ;//dispatchmessage将消息发给windows,然后windows呼叫消息处理程序wndproc

     }

     return msg.wParam ;

}

//当Windows还是16位系统时,WndProc的第三个參数被定义为一个WORD,这是一个16位的 无正负号短(unsigned short)整数。而第四个參数被定义为一个LONG,这是一个32位有正负号长整数。从而导致了文字「PARAM」前面加上了前置前缀「W」和「L」。当然。在32位的Windows中,WPARAM被定义为一个UINT。而LPARAM被定义为一个LONG(

//窗体消息处理程序的四个參数与MSG结构的前四个字段是同样的.第一个參数hwnd是接收消息的窗体的句柄,它与CreateWindow函数的传回值同样。对于与HELLOWIN相似的程序(仅仅建立一个窗体),这个參数是程序所知道的唯一窗体句柄。假设程序是根据同一窗体类别(同一时候也是同一窗体消息处理程序)建立多个窗体,则hwnd标识接收消息的特定窗体。

//第二个參数与MSG结构中的message字段同样,它是标识消息的数值。最后两个參数都是32位的消息參数,提供关于消息的很多其它信息。这些參数包括每一个消息型态的具体信息。有时消息參数是两个存放在一起的16位值,而有时消息參数又是一个指向字符串或数据结构的指针。





LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗体处理函数,UINT==unsigned int,LRESULT==LONG。

wParam的w是word,l是long

{

     HDC         hdc ;//设备内容句柄

     PAINTSTRUCT ps ;//画图结构

     RECT        rect ;//矩形结构

     //窗体消息处理程序所接受的每一个消息均是用一个数值来标识的,也就是传给窗体消息处理程序的message參数,以WM开头

     switch (message)

     {

     case WM_CREATE:

//第一个參数是声音文件的名称,第二个參数仅仅有当声音文件是一种资源时才被使用。

第三个參数指定一些选项。在这个样例中。我指定第一个參数是一个文件名称。而且异步地播放声音,

          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//playsound播放一个声音文件

          return 0 ;

          

     case WM_PAINT:

//第一个參数都是程序的窗体句柄,第二个參数是指向型态为paintstruct的结构指针。

PAINTSTRUCT结构中包括一些窗体消息处理程序,能够用来更新显示区域的内容

          hdc = BeginPaint (hwnd, &ps) ;//beginpaint開始绘制窗体

          //第二个參数是一个指标,指向一个RECT型态的rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗体显示区域的尺寸。left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。

          GetClientRect (hwnd, &rect) ;//取得窗体显示区域的大小

          //第一个參数是从BeginPaint传回的设备内容句柄。第三个參数是 -1,指示字符串是以字节0终结的。

          DrawText (hdc, TEXT ("Hello, 黑肥!"), -1, &rect,     //drawtext显示显示字符串

                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;//DrawText最后一个參数是一系列位旗标,旗标指示了文字必须显示在一行上.

          

          EndPaint (hwnd, &ps) ;//结束绘制窗体

          return 0 ;

          

     case WM_DESTROY:

          PostQuitMessage (0) ;//在消息队列中插入一个“退出程序”的消息

          return 0 ;

     }

//结构的wParam字段是传递给PostQuitMessage函数的值(一般是0)。然后return叙述将退出WinMain并终止程序。

return DefWindowProc (hwnd, message, wParam, lParam) ;//呼叫DefWindowProc来为窗体消息处理程序不予处理的全部消息提供内定处理。这是非常重要的。

否则,一般的动作,如该过程的终止。将无法正常运行

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

我的第一次windows规划的更多相关文章

  1. 汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix/linux/windows规划

    中国用户下载真正的澳大利亚sinox说完后sinox没有下载源代码. 这意味着,类似linux如下载linux 开源安装. 要知道.sinox并非linux. 首先,sinox是商业操作系统,就像 w ...

  2. Win32 Windows规划 三

    一.NMAKE 和 Makefile 1.1  NMAKE - 命令解释器. 依据Makefile文件里定义的脚本.完毕项目的编译等操作 1.2 Makefile - 定义编译.连接等脚本语言 1.3 ...

  3. XCODE4.6创建我的第一次ios规划:hello

    对于非常多刚開始学习的人来说,肯定希望自己尝试不用傻瓜的"Single View Application"模板创建一个含有View的窗体.而是希望能从零開始,先建一个空的框架.然后 ...

  4. Windows Developer Day Review

    北京时间 3 月 8 日凌晨 1 点钟,今年的第一次 Windows Developer Day 正式召开.    因为时间太晚看不了直播,我也是第二天早上在公司看的重播.整个会议过程有很多值得去研究 ...

  5. 在 Windows 上可以用 Docker 吗?

    作者:陈计节 个人博客:https://blog.jijiechen.com/post/docker-on-windows/ Docker,或者准确一点说,容器技术,在近几年里几乎成为了应用分发和集群 ...

  6. Oracle迁移:Linux->Windows

    源环境:RHEL6.4 + Oracle 11.2.0.4 目的环境:Windows 2003 需求:研发测试环境的Oracle数据库从Linux迁移到Windows,可以停机. 1.Windows安 ...

  7. 浅谈OA系统与Portal门户的区别

    随着社会信息化的发展与进步,OA办公自动化软件打破了传统复杂的办公方式,使各个行业实现了高效的无纸化办公.由此一来OA快速成长为继财务软件.ERP软件之后的第三大管理软件.随着企业信息化系统的不断增多 ...

  8. OA系统是什么,为什么要用OA系统呢?

    OA系统即是办公自动化(OA),是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统,自1985年国 内召开第一次办公自动化规划会议以来,OA系统在应用内容的深度与广度.IT技术运用等方面都 ...

  9. C# windows ce编程-----我的第一次

    最近公司要求开发抄表软件,软件分为PC端和手持终端(简称HHU),HHU是基于英文版的windows ce6.0操作系统,开发环境要求VS2005+SQLite数据库,开发语言为C#,因为是第一次基本 ...

随机推荐

  1. quick-cocos2d-x游戏开发【4】——加入文本

    文本的加入在quick中被封装在ui类中,它能够创建EditBox.菜单以及文本,文本总得来说能够创建TTF和BMFont两种. api对于它的说明非常具体.ui.newBMFontLabel(par ...

  2. cocos2d-x截图功能clippingnode它也可用于——白费

    许多其他精彩分享:http://blog.csdn.net/u010229677 3.1版本号: 在Director数: bool Director::saveScreenshot(const std ...

  3. Coder的利器

    Coder的利器记载 工作近三年,使用PC快六年,拥抱Mac整一年,投具器石榴裙三年.14年第一次被同事推荐Everything,开启了JeffJade对工具的折腾之旅,并乐此不疲.时去两年,这必然是 ...

  4. HibernateReview Day2–Hibernate体系结构

    本文摘自 李刚 著 <Java EE企业应用实战> 现在我们知道了一个概念Hibernate Session,只有处于Session管理下的POJO才具有持久化操作能力.当应用程序对于处于 ...

  5. hdu - 4975 - A simple Gaussian elimination problem.(最大流量)

    意甲冠军:要在N好M行和列以及列的数字矩阵和,每个元件的尺寸不超过9,询问是否有这样的矩阵,是独一无二的N(1 ≤ N ≤ 500) , M(1 ≤ M ≤ 500). 主题链接:http://acm ...

  6. Node.js : 我只需要一个店小二

    刚刚开始接触Node.js时, google了很多文章,但发现大部分都是泛泛的介绍安装,配置,以及介绍几个小例子 有一种雾里观花的感觉,所以非常困惑,不知道Node.js到底解决了什么问题,它的优势到 ...

  7. hdu-2814-Interesting Fibonacci-斐波那契周期节

    哇,其实我2A该....否1A纯脑损伤.. 乞讨:F(a^b)^(F(a^b) ^ (n-1))%c  既是求F(a^b)^(F(a^b) ^ (n-1)%phi[c]+phi[c])%c 先求x=F ...

  8. 边记边学PHP-(十五)MySQL数据库基础操作2

    四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...

  9. nodeValue的兼容问题

    nodeValue获取Text或Comment元素的文本值. 在IE6.IE7.IE8中游览器会自作聪明的去掉前面的空白字符text,而其它现代游览器则会保留空白 <body> <s ...

  10. 重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush

    原文:重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush [源码下载] 重新想象 Windows 8 Store Apps ...