Windows程序设计入门教程
前骤:

1.第一个windows程序:

先讲几个专有名词:HINSTANCE 由handle(句柄)和instance(实例)
句柄,类似于C中的指针,指向资源,是资源的标识。操作系统要管理和操作这些资源,都是通过句柄(HANDLE)来找到对应的资源。按资源的类型可以分为:

窗口句柄——HWND
实例句柄——HINSTANCE
图标句柄——HICON
光标句柄——HCURSOR
画刷句柄——HBRUSH
设备内容句柄——HDC

下面是一个简单的windows程序。

[Copy to clipboard]
CODE:
#include <windows.h>

int WINAPI WinMain
(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow)
{

MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);

return 0 ;

}

WinMain的原函数
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)
这个函数照着原函数写就行。

MessageBox的原函数:
MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
参数解释:
  hWnd:为窗口句柄,h代指handle[句柄]
  lpText:要显示的消息,  lp代指 long point[长指针]
  lpCaption:消息框的标题
  uType:消息框的按扭的样式
其中lpText和lpCaption的内容可以用TEXT(“………… ”)或直接用(“…………”)

编写自己的窗口:
#include<windows.h>
一:主函数——程序的入口点
int WINAPI WinMain(  )
{
①        设计窗口类:
WNDCLASS  wndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;
  .

……                                                十个字段
……       
……

wndclass.lpszClassName=”Lei”;

②        注册窗口类:
RegisterClass(&wndclass);

③        创建窗口:
HWND  hwnd;
hwnd=CreateWindow();

④        显示及更新窗口:
ShowWindow();
UpdateWindow();

⑤        消息循环:
MSG msg;
While(GetMessage(&msg,NULL,0,0))
{
TranlateMessage(&msg);
DispatchMessage(&msg)
}
return msg.wParam;
}

二:消息处理函数——操作系统调用
LRESULT CALLBACK WndProc(            )
{ PAINTSTRUCT ps;
  HDC hdc;
  RECT rect;

switch(message)
{
case WM_PAINT:
    ……
return 0;
case WM_DESTORY:
    ……
return 0;
}
return DefWindowProc() ;
}

上面只是给出了一个窗口程序的模板块,也就是说一个窗口程序主要由这些组成。由上面我们知,要编出一个窗口程序,就要经过 设计窗口类、注册窗口类、创建窗口、显示及更新窗口。再通过系统调用WndProc函数(消息处理函数)来使程序不断运行以及使程序停止。

下面我们一个一个完成这些模块。

第零大块:程序入口点WinMain函数。照写。

第一大块:设计窗口类:
窗口依照某一窗口类别建立,窗口类别用以标识处理窗口消息的窗口消息处理程序。
先定义wndclass结构。接着初始化这结构的10个字段。。

WNDCLASS  wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;              //定义窗口类的样式
//CS为CLASS和STYLE的第一个字母的缩写
wndclass.lpfnWndProc = WndProc ;                  //lpfn代指:指向函数的长指针,
//fn为function的缩写。
              //WndProc就是消息处理函数,这个函数名可以改,但一定要跟
//下文定义的函数名一样,不过,没必要改。这个函数通过系统//调用,但代码必需我们写。
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
//这两个字段用于在窗口类别结构和Windows内部保存的窗//  口结构中预留一些额外空间
                      //设定为0,表示不使用它们。
wndclass.hInstance = hInstance ;  //程序的执行实体句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;  //加载图标,当加载的图
//标是标准的图标时,LoadIcon的第一个参数必
//需指定为NULL。IDI为ID和I(ICON)的组合。
                            //IDI_APPLICTION为应用程序的图标。
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;  //同上。IDC中的C为CURSOR
      //IDC_ARROW表示当我们的鼠标移到这个应用程序上的时候为一个前头光标。
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
                  //取得绘制窗口背景的画刷对象  (HBRUSH)为强制转换类型。//这里指定为白色画刷,即这个程序得到的是白色背景。
wndclass.lpszMenuName  = NULL ;  //这个例子无菜单,所以菜单名为NULL
wndclass.lpszClassName = “Lei”  //这个类的类名。注意,这里的类名和下文
//的CreateWindow的第一个参数必需相同。这里定义这个类名为Lei

第二大块:注册窗口:
RegisterClass(&wndclass);

第三大块:建立窗口(哈,终于到了创建窗口的时刻)
先定义窗口句柄:HWND hwnd;
然后调用创建窗口函数CreateWindow;
即为:
HWND hwnd;
hwnd = CreateWindow (“Lei”,    //窗口类名,必需和上面的一致。
          TEXT ( "The Hello Program"), // 窗口的标题
          WS_OVERLAPPEDWINDOW,    // 窗口的样式,以WS_开头的宏。
//#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED    | /
                          //                          WS_CAPTION        | /
                        //                            WS_SYSMENU        | /
                        //                              WS_THICKFRAME    | /
                      //                              WS_MINIMIZEBOX    | /
                      //                              WS_MAXIMIZEBOX)
                          // 可以看出这个窗口是一个既有标题(WS_CAPTION)又有系//统菜单(WS_SYSMENU  ),也有最小化最大化按扭
//(WS_MINIMIZEBOX  | WS_MAXIMIZEBOX)
          CW_USEDEFAULT,          // 初始化X的坐标位置
          CW_USEDEFAULT,          //初始化Y的坐标位置

CW_USEDEFAULT,            //初始化窗口的宽度
          CW_USEDEFAULT,          //初始化窗口的高度
          NULL,                        //父窗口句柄,这里没有,所以设为NULL
          NULL,                    // 窗口菜单句柄,没有,所以设为NULL
//注意:窗口菜单的系统菜单不同,系统菜单指
//击一个应用程序的最左上角的那个图标所出现的菜单。
          hInstance,                  //程序的执行实体句柄
          NULL) ;                      //建立参数。指标设定为NULL,可用这个参数//存取稍后程序中可能引用到的数据。

至此,这个创建窗口的函数已写完。

第四大块:显示及更新窗口
    原函数:ShowWindow(HWND hWnd,int iCmdShow);
            UpdateWindow(HWND hWnd)
 
于是在这里我们可以写成:
        ShowWindow(hwnd,iCmdShow);
        UpdateWindow(hwnd);

第五大块:消息循环:
  呼叫UpdateWindow之后,窗口就出现在视讯显示器上。程序现在必须准备读入使用者用键盘和鼠标输入的数据。Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。
程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:

MSG msg;
while      (GetMessage (&msg, NULL, 0, 0)) 
       
{
       
    TranslateMessage (&msg) ;
       
    DispatchMessage (&msg) ;
       
}
消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
GetMessage(&msg,NULL,0,0)
这一呼叫传给Windows一个指标,指向名为msg的MSG结构。第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有窗口的所有消息

TranslateMessage (&msg) ;将msg结构传给Windows,进行一些键盘转换

DispatchMessage (&msg) ;又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序

最后,因为主函数是int型的,所以得要返回值
return msg.wParam;

至此,这个主函数就已经写完了。
好了,现在写窗口消息处理函数了。

窗口消息处理函数:
    原函数:LRESULT CALLBACK WndProc(WHND hwnd,UINT message,
                                          WPARAM wParam,LPARAM lParam)
一般来说,Windows程序写作者使用switch和case结构来确定窗口消息处理程序接收的是什么消息,以及如何适当地处理它。窗口消息处理程序在处理消息时,必须传回0。窗口消息处理程序不予处理的所有消息应该被传给名为DefWindowProc的Windows函数。从DefWindowProc传回的值必须由窗口消息处理程序传回。
在这个程序中,我们只处理两个消息:WM_PAINT 和WM_DESTROY (WM为Window Message的缩写)。
一.WM_PAINT  [引用]
当窗口显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个消息通知程序。显示区域为什么会无效呢?
在使用者改变HELLOWIN窗口的大小后,显示区域的显示内容重新变得无效
当使用者将HELLOWIN最小化,然后再次将窗口恢复为以前的大小时,Windows将不会保存显示区域的内容。
在移动窗口以致其相互重迭时,Windows不保存一个窗口中被另一个窗口所遮盖的内容。在这一部分不再被遮盖之后,它就被标志为无效。
对这个消息,我们来看一下这个例子

case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
         
          GetClientRect (hwnd, &rect) ;
         
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
这个消息,几乎都是从hdc = BeginPaint (hwnd, &ps),然后由EndPaint (hwnd, &ps)结束。
在hdc = BeginPaint (hwnd, &ps) 之后就是呼叫GetClientRect这个函数。第一个参数是窗口句柄,第二个参数是一个指标,指向一个RECT型态的rectangle(矩形)结构。
DrawText可以输出文字(正如其名字所表明的一样)。由于该函数要输出文字,第一个参数是从BeginPaint传回的设备内容句柄,第二个参数是要输出的文字,第三个参数是 -1,指示字符串是以字节0终结的。DrawText最后一个参数是一系列位旗标,旗标指示了文字必须显示在一行上,水平方向和垂直方向都位于第四个参数指定的矩形中央。
WM_DESTROY消息
WM_DESTROY消息是另一个重要消息。这一个消息指示,Windows正在根据使用者的指示关闭窗口。该消息是使用者单击Close按钮或者在程序的系统菜单上选择 Close时发生的(在本章的后面,我们将详细讨论WM_DESTROY消息是如何生效的)。
HELLOWIN通过呼叫PostQuitMessage以标准方式响应WM_DESTROY消息:
PostQuitMessage (0) ;
该函数在程序的消息队列中插入一个WM_QUIT消息。

好了,接下来,我们把这个程序的全部写下来。

[Copy to clipboard]
CODE:
#include <windows.h>  //这个程序所要包含的头文件

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;  //对消息处理函数的声明

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)    //主函数,程序的入口点
{
    HWND        hwnd ;         
    MSG          msg ;
    WNDCLASS    wndclass ;

//设计窗口类样式
    wndclass.style        = CS_HREDRAW | CS_VREDRAW ;  //样式为水平和垂直重画
    wndclass.lpfnWndProc  = WndProc ;                  //指定消息处理函数
    wndclass.cbClsExtra    = 0 ;                        //不使额外空间
    wndclass.cbWndExtra    = 0 ;                                //不使额外空间
wndclass.hInstance    = hInstance ;                                    //程序的执行实体句柄
    wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;//加载图标
    wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;//加载光标
    wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH) ;//取得画刷对象
    wndclass.lpszMenuName  = NULL ;        //无窗口菜单,注:不是无系统菜单
    wndclass.lpszClassName = "Lei";        //窗口类类名,必需与下文一致

//注册窗口类
RegisterClass (&wndclass) ;         
   
      //创建窗口 
hwnd = CreateWindow ("Lei",                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          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,                      // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                    // creation parameters
   
    ShowWindow (hwnd, iCmdShow) ;//显示窗口
    UpdateWindow (hwnd) ;//更新窗口
   
        //消息循环
while (GetMessage (&msg, NULL, 0, 0))  //从消息对列中取得一条消息
    {
          TranslateMessage (&msg) ;// 将msg结构传给Windows,进行一些键盘转换
          DispatchMessage (&msg) ;// 又将msg结构回传给Windows。然后,Windows
//将该消息发送给适当的窗口消息处理程序,让它进行处理
    }
    return msg.wParam ;// 结构的wParam字段是传递给PostQuitMessage函数的值(通// 常是0)。然后return叙述将退出WinMain并终止程序
}

//窗口消息处理函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC        hdc ;  //设备内容句柄
    PAINTSTRUCT ps ;
    RECT        rect ;
   
    switch (message)
    {
   
    case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
         
          GetClientRect (hwnd, &rect) ;
         
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
         
    case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;// 。窗口消息处理//程序不予处理的所有消息应该被传给名为DefWindowProc的Windows函数
}

至此 ,这个入门教程就做完了,做的好与不好都还希望各位留下句话,谢谢。做的不好,还请指点指点。谢谢!

Windows程序设计入门教程[来自邪恶八进制信息安全团队(www.eviloctal.com)]相关推荐

  1. 感谢邪恶八进制信息安全团队的祝福

    感谢邪恶八进制信息安全团队的祝福 BY Delphiscn(Delphiscn#gmail.com)http://blog.csdn.net/delphiscn 贴上来 留作纪念

  2. 【windows程序设计入门教程之一】开发环境的搭建helloword程序

    本套教材将使用vs2013为开发工具,如果读者还不知如何下载安装vs2013可以到我之前写的文章上去查看 vs2013下载安装教程 安装好后再安装程序开发人员的字典MSDN,VS2013的MSDN和经 ...

  3. [转载]深入Windows NT/2000模块的组织 - 专题安全方向{ Security Research Papers } - 邪恶八进制信息安全团队技术讨论组 努力为祖国的信息安全撑起一片蓝天

    导读: [转载]深入Windows NT/2000模块的组织 文章作者:WebCrazy 信息来源:WebCrazy( http://www.geocities.jp/webcrazyjp/) 深入W ...

  4. ArcGIS Runtime SDK for Windows Phone 入门教程

    ArcGIS Runtime SDK for Windows Phone 入门教程 基本概念 Windows Phone平台介绍 Windows Phone是微软发布的一款手机操作系统,它将微软旗下的 ...

  5. c语言程序设计入门教程视频教学

    c语言教程视频讲座简介: 沉睡者IT:c语言程序设计入门教程视频教学培训课程内容介绍: 程序设计是一门基础课程.对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯:对 ...

  6. C语言程序设计入门教程

    C语言程序设计入门教程 目录 语言分类 C语言特点 最简单的C语言程序 注释方式 C语言程序的结构 程序设计的任务阶段 选择结构程序设计 关系运行算符 逻辑运算符 switch语句 条件运算符 数据类 ...

  7. Docker最有趣入门教程----来自外国小哥(翻译更新中~)

    完成Docker安装后,运行以下命令测试Docker安装: $ docker run hello-worldHello from Docker. This message shows that you ...

  8. Building a Restful Web Service(最好的Spring入门教程 --来自Spring官网的Guides)

    搭建一个Restful Web服务 本文档将引导你用Spring搭建一个"Hello,World!"Restful Web服务. 你要搭建的是什么? 你将搭建一个Web服务,这个服 ...

  9. 【站长之窗第八期】安全卫士——“邪恶八进制”冰血封情

    本页主题: [站长之窗第八期]安全卫士--"邪恶八进制"冰血封情 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题 破帽遮颜 级别: 管理员 精华: 1 发帖: 526 威望 ...

最新文章

  1. 4岁的儿子还不会写红黑树,我该怎么办?
  2. salt-api timeout 执行超时问题解决
  3. html不可选择的按钮,HTML功能无法使用按钮
  4. html拖放数据库字段,HTML5 拖放(Drag 和 Drop)
  5. linux路由内核实现分析(四)---路由缓存机制(3)
  6. sql数据库性能指标_SQL Server磁盘性能指标–第1部分–最重要的磁盘性能指标
  7. 怎么在服务器添加充值网站,云服务器怎么弄充值
  8. 量子退火算法入门(6):初识量子退火算法的发明过程
  9. Java开发实用工具推荐
  10. [渝粤教育] 中国地质大学 大学语文 复习题
  11. 拳王虚拟项目公社:你最重要的事情是什么?
  12. Windows Mobile下的重力感应器(Gravitational Sensor)开发
  13. Python输入身高体重并计算BMI
  14. Android 10.0 SystemUI状态栏屏蔽掉通知栏不显示通知
  15. 计算机工作组环境和域环境的区别
  16. login shell和non-login shell
  17. 中标麒麟操作系统安装MySQL5.7.22
  18. 【扩展】电机驱动(DRV8870)
  19. 人与树林交相辉映的效果
  20. 1个球从100m落下,每次时,反跳原高度的一半,再落,再反弹,求第10次落地共经过多少m,第10次反弹多高。 谭浩强《c语言程序设计》第五章第十一题

热门文章

  1. 小技巧---ubuntu下截图,截图全屏Prt Sc SysRq,截图当前窗口Alt+Prt Sc SysRq
  2. NSIS脚本学习:判断版本并安装.NET Framework运行环境
  3. 尚硅谷python培训多少钱
  4. 高通骁龙845的android手机有哪些,屠榜小能手高通骁龙845,7月份Android手机TOP10 一个没放过-消费电子-与非网...
  5. 吃货最爱美食,四种美食短视频类型分享,出奇制胜才能吸粉
  6. HID蓝牙遥控器 - 支持键盘、鼠标、影音遥控器(开源)
  7. EasyCVR视频广场的视频分享时,需要用户登录的原因分析及优化
  8. 5G专网核心网部署模式与挑战
  9. c/c++面试题摘抄
  10. 联发科MT8788芯片处理器简介