我的第一个windows程序

#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来为窗口消息处理程序不予处理的所有消息提供内定处理,这是很重要的。不然一般动作,如终止程序,将不会正常执行

}

时间: 2024-10-12 19:56:40

我的第一个windows程序的相关文章

windows编程:第一个windows程序

1 #define WIN32_LEAN_AND_MEAN 2 #include <windows.h> 3 #include <windowsx.h> 4 #include <math.h> 5 #define WINDOW_CLASS_NAME L"WINCLASS1" 6 //窗口处理函数 7 LRESULT CALLBACK WindowProc(HWND hwnd, 8 UINT msg, 9 WPARAM wParam, 10 LPARA

windows程序如何实现精准定时

有朋友问我,"小兵以太网测试仪"这个软件,是如何控制发包频率的. 我想想,干脆写一篇文章来聊聊这个问题吧. windows下,每当一个程序设定的定时器时间到了,windows会给程序发送一个WM_TIMER消息. 根据著名的windows编程书籍<Windows程序设计>的描述(在第8章), 我们知道,windows的定时器有如下的缺陷: 1. 精度不高 windows98大概是55ms,Windows NT大概是10ms. 2. WM_TIMER消息可能无法及时处理 WM

初识Windows程序

首先,我们创建第一个Windows程序,一共分为4个步骤: 1.打开Visual Studio开发工具 2.选择"文件"→"新建"→"项目"命令 3.项目类型选择"VisualC#" 4.模板选择"Windows窗体应用程序" 选择好位置,为项目命名后确认. 认识Windows程序 Form1.cs:窗体文件,程序员对窗体编写的代码一般都存放在这个文件中 Form1.Designer.cs:窗体设计文件,其

Windows程序内部运行机制

Windows程序内部运行机制 一.        API与SDK Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序,这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数.我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了说明. SDK的全称是Software Development Kit

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

一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Windows 平台下程序运行的内部机制,所以本专题将深入剖析下Windows 程序的内部运行机制. 二.Windows平台下几个基础概念 有朋友会问,理解了程序运行的内部机制有什么用,因为在我们实际开发中用得微软提供的

用GTK开发一个画图程序(windows)

GTK是一个功能强大的开发平台,跨系统,提供了丰富的庞大的代码库,应用开发者可以用之快速做出自己的产品. 这个月用他开发了一个GUI程序,是个画图工具,功能包括:图片导入导出.线型编辑.拖拽.删除.调整粗细.颜色.虚实.阴影,亮点是实现了一种自定义的线型:尖灭线(项目后续会加入更多线型).尖灭线是石油勘探资料处理中常用的绘图线型.GUI的使用流程是先导入一个底图,然后在底图之上画线或插入其他图片.文字,最后把整体导出为一个图片.上样例: 如图:企鹅图是背景图,蓝线是尖灭线,还有其他一些线和菜单.

第一个Windows Phone 8 程序开发之后台音频播放

对于播客的音频应该是连续多个的列表,作为在后台连续播放.在网上搜了一下,通过wp8后台音频代理播放,而且例子都是静态的播放列表,不满足动态生成列表播放. 尝试着将播放列表对象声明为公有静态的,在外部对列表进行操作,发现这个静态的播放列表在agent里和我的操作类不是同一个引用,此方法行不通. 最后在 http://www.devdiv.com/forum.php?mod=redirect&goto=findpost&ptid=199381&pid=960706 找到了思路: 在wp

【DirectX11-Tutorial】运行第一个win32程序A Primer of Basic Windows

DirectX11-Tutorial 本系列主要参考此博客的文章,同时会加上一点个人实践过程. ========================================== 分割线 ========================================== <span style="font-family:Microsoft YaHei;font-size:14px;">#include <stdio.h> // include the sta

Windows Azure中文博客 Windows Azure入门教学系列 (一): 创建第一个WebRole程序

http://blogs.msdn.com/b/azchina/ 本文转自:http://blogs.msdn.com/b/azchina/archive/2010/02/09/windows-azure-webrole.aspx 这是一系列Windows Azure入门教学文章的第一篇. 在第一篇教学中,我们将学习如何在Visual Studio 2010中创建一个WebRole程序(C#语言). 在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows