windows窗口程序实现源代码

合集下载

freerdp windows 编译

freerdp windows 编译

freerdp windows 编译Freerdp是一个开源的远程桌面协议实现,支持RDP、VNC和SPICE 等协议,并且提供了一组完整的客户端和服务器端的实现。

在Windows 平台下,我们可以使用Visual Studio等开发工具来编译Freerdp,以下是详细的编译步骤:1. 下载Freerdp源代码我们可以从Freerdp的官方网站上下载最新版本的源代码,也可以从GitHub等代码托管平台上获取。

2. 安装依赖库在编译Freerdp之前,我们需要先安装一些依赖库,包括zlib、openssl和libiconv等。

这些库可以通过下载安装包或使用包管理器来安装。

3. 打开Visual Studio在Windows平台下,我们可以使用Visual Studio等开发工具来编译Freerdp。

打开Visual Studio,选择“文件”->“新建”->“项目”,选择“Visual C++”->“空项目”,输入项目名称并点击“确定”。

4. 添加源代码将下载的Freerdp源代码解压到本地目录,并将其添加到Visual Studio项目中。

在Visual Studio中,选择“项目”->“添加现有项”,找到Freerdp的源代码目录并选择要添加的文件。

5. 配置编译选项在Visual Studio中,选择“项目”->“属性”,在“常规”选项卡中选择“配置类型”为“动态库(.dll)”。

在“VC++目录”选项卡中,添加Freerdp的头文件和库文件。

在“C/C++”->“预处理器”选项卡中,添加宏定义“WITH_SHADOW”、“WITH_CHANNELS”和“WITH_SAMPLE”等。

6. 编译代码在Visual Studio中,选择“生成”->“生成解决方案”,Visual Studio将自动编译Freerdp源代码,并生成对应的动态库文件。

7. 测试在编译完成后,我们可以使用Freerdp提供的客户端程序测试编译的结果。

(整理)windows下的C语言网络编程.

(整理)windows下的C语言网络编程.

Windows下C语言网络编程C语言的学习,一般的方式是,先学C,然后是C++,最好还要有汇编语言和微机原理基础,然后才是Visual C++。

这样的方式,对学习者来说,要花费很多时间和耐力。

而在学校教学中,也没有时间深入学习Windows编程的实用技术了。

其实,具有了C语言基础后,再有一些基本的C++类的概念,就可以直接学习Windows C编程了。

一、走近Windows C语言很多语言都把显示一个“Hello,World!”做为第一个入门程序,C语言的第一个程序是这样的:如果把main函数写成带参数的main函数,应该是:Windows C的第一个程序和这个程序在形式和原理上都是一致的,只是有两点不同:1. 主函数接收的形参不只是命令行中的字符串的个数和字符串的首地址。

2. C语言的很多函数在Windows C中都可以继续使用,但象printf()屏幕显示等函数就不能继续使用了。

因为Windows是多任务操作系统,屏幕已不再为某一个应用程序所独有,Windows C应用程序要显示字符串,需要使用Windows提供的API函数,开自己的窗口下面是一个最简单的,显示“Hello,World!”的Windows C程序:主函数的形参有四个:1) Hinstance:接收程序运行时当前实例的句柄;2) HprivInstance:前一个实例的句柄;3) LpCmdLine:程序命令行指针;4) NcmdShow:一个用来指定窗口显示方式的整数。

这几个参数的使用我们会在深入的学习中介绍的。

显示Hello,Word!字符串,我们使用了一个MessageBox函数,这个函数会在屏幕上显示一个对话框,它的原型是:四个参数分别是:1) HWnd:父窗口的句柄;2) LpText:要显示字符串的指针;3) LpCaption:对话框标题字符串的指针;4) UType:显示在对话框上的小图标的类型。

使用这个函数要包含windows.h头文件。

C++编写Windows服务程序

C++编写Windows服务程序
创建服务程序除了编写服务代码外,还必须做一些其它额外的编码工作:
• 在系统日志或应用程序日志中报告警告信息和出错信息,不能用输出到屏 幕的方式,因为用户根本就没有登陆。 • 服务程序的控制即可以通过单独的应用程序,也可以通过控制面版程序。 这取决于你的服务实现什么样的通讯机制。 • 从系统中安装和卸载服务
简介
Windows NT 中 的 服 务 实 际 上 是 一 个 程 序 , 只 要 计 算 机 操 作 系 统 一 启 动 , 服 务就可以运行其中。它不需要用户登陆。服务程序是一种与用户无关的任务,比 如 目 录 复 制 , 进 程 监 控 或 网 络 上 供 其 它 机 器 使 用 的 服 务 , 比 如 HTTP 协 议 支 持 。
gSvcStatus.dwServiceSpecificExitCode = 0;
// Report initial status to the SCM ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );
// Perform service-specific initialization and work. ghSvcStopEvent = CreateEvent(
hEventSource = RegisterEventSource(NULL, szName);
if( NULL != hEventSource )
{ //StringCchPrintf(Buffer, 80, TEXT("%s failed with %d"), szFunction,
GetLastError()); strcpy(Buffer,szFunction); lpszStrings[0] = szName; lpszStrings[1] = Buffer;

C#程序源代码_辛苦整理

C#程序源代码_辛苦整理
if(each [j]>=each [j+1])
{
temp=each [j];
each [j]=each [j+1];
{
if ((sieve >> i & 0x01) != 0)
Console.Write("{0,3}", p);
p += 2;
}
Console.WriteLine();
sum+=t;
}
Console .WriteLine ("\nPI={0,10:f8}",sum *6);
Console .Read ();
}
}
}
抓图结果:
{
each [i++]=num%10;
num=num/10;
}
for(i=0;i<3;i++)
for(j=0;j<3-i;j++)
C#程序设计
一、实验名称:C#实验
二、实验目的:通过上机实际操作将平时课堂所学具体实现,通过该实验来检查自己的学习成功,并且发现平时学习中没有注意到的问题并解决之,从而加深对该门课程的以及C#语言的了解。
三、实验步骤:
实验一:C#编程环境
实验目的:
1. 熟悉掌握C#开发环境的安装与配置
num = max -min ;
Console .WriteLine ("{0}-{1}={2}",max,min,num);
}
Console .Read();
}
相关的主要代码:

在Windows下运行C语言程序

在Windows下运行C语言程序
编译将C语言代码“翻译”成机器码(这里暂时可以理解成0和1序列)。
组建将工程所需的所有资源集合到一起,最终生成 .exe文件。
运行就是执行 .exe 程序,和运行其他程序一样,双击即可。
编译、组建、运行的功能可以在“组建”中找到,如下图所示:
更加简单的方法是使用快捷方式,如下图所示:
注意:编译生成的 .exe 文件在工程目录下的Debug文件夹内。以上面的工程为例,路径为 E:\cDemo,打开看到有一个Debug文件夹,进入可以看到 cDemo.exe。
如果你在安装或使用过程中遇到错误,请查看VC6.0使用教程,已经解决了一些常见的问题。
单独运行一个C源文件,这里不再赘述,方法与VC6.0类似。
1) 新建Win32 Console Application工程
打开VC6.0,在菜单栏中选择“文件 -> 新建”,或者 Ctrl+N,弹出下面的对话框:
切换到“工程”选项卡,选择“Win32 Console Application”,填写工程名称和路径,点击“确定”,会弹出一个对话框询问类型,这里选择“一个空工程”,如下图所示:
// 函数定义
int max(int num1, int num2){ // num1, num2为形式参数(形参)
if(num1>num2){ // 如果num1大于num2
return num1; // 返回num1并结束max函数
}else{ // 如果num2大于num1
/* for语句用来循环
i的起始值为 1,每循环一次加 1,i>100 时退出循环 */
for(i=1; i<=100; i++){

WINDOWS网络编程(C,C++,VC++)编程

WINDOWS网络编程(C,C++,VC++)编程

• 四. 面向对象程序设计概述 • 1. 过程范型的语言也叫做过程性语言。C就是一种过程性语言。 • 2. 过程范型语言的主要特征是:程序由过程定义和过程调用组成,即 • 程序=过程+调用 • 3. 除了过程范型语言外,还有: • 模块程序设计范型、 • 函数程序设计范型、 • 进程程序设计范型等。 • 4. 面向对象程序设计范型主要特点: • 程序=对象+消息 • 5. 面向对象程序结构特点是:程序由类的定义和程序的使用两部分组
• 即由类定义和类使用两部分组成。 • 也可以说由类声明+类实现两部分组成。 • 类的使用部分有主函数和相关子函数组成。
• 分析(1). 一个c++程序可以作为一个文件存储, 这时文件的扩展名为“.cpp”,也可以分为几个文
件存储。若分为几个文件存储,一般是把类的声 明部分存放于扩展名为“.h”头文件中,而把类的
开发的C/C++集成开发环境。 • 10. Visual C++6.0的操作界面 • 启动Visual C++6.0集成开发环境的操作: • 单击“开始”按钮,拉出初始菜单。 • 在初始菜单中,单击选择”所有程序”; • 在”所有程序”子菜单中,单击选择“Microsoft Visual Studio6.0”; • 在“Microsoft Visual Studio6.0”子菜单中,单击选择“Microsoft
• 比较:C++程序:int main()

C程序: main()
• (2) C++程序和C程序的部分重要区别
• 1)C++程序和C程序在形式上基本一样,也是由函数组成,C++的主 函数要求在前面写上返回类型int,在函数体最后要有返回语句,如:

win32设计菜单、点击显示弹出对话框(内含可实现源代码)

win32设计菜单、点击显示弹出对话框(内含可实现源代码)

专业课程实验报告课程名称:windows程序设计开课学期: 2015至2016 学年第1学期专业:计算机科学与技术年级班级:2013级学生姓名:刘敏学号:222013*********实验教师:刘红俊计算机与信息科学学院软件学院wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2);2.对话框资源及其应用:1)模式对话框:①定义对话框资源:资源文件中如此定义对话框资源:对话框名 DIALOGEX x,y,weight,hightSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION ""FONT 9, ""BEGIN对话框的控件定义END②调用函数DiaLogBox显示对话框;③构造对话框消息处理函数;④关闭对话框。

2)非模式对话框:①定义非模式对话框:STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |WS_SYSMENU|WS_VISIBLE②创建对话框函数:HWND CreateDialog{hInst, MAKEINTRESOURCE(IDD_SHOWBOX),hWnd,(DLGPROC)DlgProc}③消息循环:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}④关闭对话框:DestroyWindow(hDlg);3)程序加载图标:IDI_WIN32PROJECT2 ICON "Win32Project2.ico"IDI_SMALL ICON "small.ico"(三)程序代码:Win32Project2.cpp// Win32Project2.cpp : 定义应用程序的入口点。

Intel Visual Fortran窗口程序设计

Intel Visual Fortran窗口程序设计

■建议完整安装Intel Visual Fortran编译器自带的帮助文件,尤其是Windows窗口程序设计的开发人员。

安装Intel Visual Fortran编译器后,就可打开Visual Studio 2008开始编译Fortran 程序了。

具体步骤如下:■双击启动Visual Studio 2008,选择“文件”菜单中的“新建”-“项目…”,弹出如图2.1所示的对话框,从中选择要建立的Fortran项目类型和模板,同时指定项目名称及其保存位置,单击“确定”按钮即可完成新项目的创建;■按下组合键“Ctrl+F5”运行程序;此处省略了程序的调试过程,对程序调试不熟练的读者请阅读相关资料或文献。

图2.1 “新建项目”对话框2-3 Intel Visual Fortran 中的项目类型程序开发之前,我们应充分了解各种项目类型的特点。

启动Visual Studio 2008,按前面的步骤打开图2.1所示的对话框,在“项目类型”中列出了Intel Visual Fortran 编译器可创建的几种项目类型。

■Console Application 是基于字符模式的应用程序,这类项目适于不需要图形输出的程序设计,优点是执行速度快。

图2.2所示为Console Application类工程的输出窗口。

图2.2 Console Application工程输出窗口■Library 其中包括两种库文件工程:●Static Libraries 静态库文件,是已编译的、独立于主程序的程序段,适合于大型项目中程序的结构组织和程序间函数或子程序的重复调用。

但是,静态库文件会插入程序调用点,磁盘空间浪费较大;同时当静态库文件需要升级的时候,会带来工作效率的低下。

为了解决这些问题,出现了动态链接库。

●Dynamic-link Library 动态链接库,很好地解决了静态库文件存在的问题,所以广泛使用在Windows程序设计中。

.net webservicestudio 源代码

.net webservicestudio 源代码

.net webservicestudio 源代码在.NET 开发中,Windows GUI 应用程序称为“Windows 窗体”(或“Winforms”)应用程序。

使用Visual C++ 开发Windows 窗体项目,通常与使用任何其他.NET 语言(如Visual 或C#)进行开发并无不同。

使用Visual C++ 编写的Windows 窗体应用程序通过新的Visual C++ 语法使用.NET Framework 类和其他.NET 功能。

有关更多信息,请参见New C++ Language Features。

在本过程中,您将使用“工具箱”中的几种标准控件创建Windows 窗体应用程序。

用户可以在完成后的应用程序中选择一个日期,此时将出现一个文本标签,显示所选的日期。

创建新的Windows 窗体项目在“文件”菜单上,单击“新建”,然后单击“项目”。

在“项目类型”窗格中,选择“Visual C++”节点中的“CLR”,然后在“模板”窗格中选择“Windows 窗体应用程序”。

键入项目的名称,如“winformsapp”。

您可以接受默认位置、键入一个位置或者浏览到要保存项目的目录。

Windows 窗体设计器即打开,显示所创建项目的“Form1”。

向窗体添加控件如果“工具箱”窗口不可见,请单击“视图”菜单上的“工具箱”。

将“工具箱”中的三个控件放到“Form1”设计图面上:将一个Label 控件拖动到靠近“Form1”左上角的位置。

将一个DateTimePicker 控件拖动到Label 控件正下方。

将一个Button 控件拖动到窗体底部靠近中心点的位置。

设置窗体和控件的属性单击窗体图面上的空白区域以选择窗体。

如果“属性”窗口不可见,请单击“视图”菜单上的“属性”(或者按F4)。

您可能需要关闭“工具箱”以获得更多空间。

设置窗体的“Text”属性(显示在窗体标题栏中),方法是在“属性窗口”中“Text”属性的右侧单击,并键入:日期选择器单击以选择标签,将其“Text”属性设置为:选择日期:单击以选择按钮,将其“Text”属性设置为:“确定”编写事件处理程序代码在本节中,您将编写在发生以下事件时运行的代码:Button 控件上的Click 事件DateTimePicker 控件上的ValueChanged 事件编写代码以处理事件双击按钮以添加按钮Click 事件处理程序(按钮的默认事件为Click 事件)。

汇编创建简单的窗口

汇编创建简单的窗口

理论:Windows 程序中,在写图形用户界面时需要调用大量的标准Windows Gui 函数。

其实这对用户和程序员来说都有好处,对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。

对程序员来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的。

当然至于具体地写程序对于程序员来说还是有难度的。

为了创建基于窗口的应用程序,必须严格遵守规范。

作到这一点并不难,只要用模块化或面向对象的编程方法即可。

下面我就列出在桌面显示一个窗口的几个步骤:得到您应用程序的句柄(必需);得到命令行参数(如果您想从命令行得到参数,可选);注册窗口类(必需,除非您使用 Windows 预定义的窗口类,如 MessageBox 或 dialog box;产生窗口(必需);在桌面显示窗口(必需,除非您不想立即显示它);刷新窗口客户区;进入无限的获取窗口消息的循环;如果有消息到达,由负责该窗口的窗口回调函数处理;如果用户关闭窗口,进行退出处理。

相对于单用户的 DOS 下的编程来说,Windows 下的程序框架结构是相当复杂的。

但是 Win dows 和 DOS 在系统架构上是截然不同的。

Windows 是一个多任务的操作系统,故系统中同时有多个应用程序彼此协同运行。

这就要求 Windows 程序员必须严格遵守编程规范,并养成良好的编程风格。

内容:下面是我们简单的窗口程序的源代码。

在进入复杂的细节前,我将提纲挈领地指出几点要点:您应当把程序中要用到的所有常量和结构体的声明放到一个头文件中,并且在源程序的开始处包含这个头文件。

这么做将会节省您大量的时间,也免得一次又一次的敲键盘。

目前,最完善的头文件是 hutch 写的,您可以到 hutch 或我的网站下载。

您也可以定义您自己的常量和结构体,但最好把它们放到独立的头文件中用 includelib 指令,包含您的程序要引用的库文件,譬如:若您的程序要调用 "Message Box",您就应当在源文件中加入如下一行: includelib user32.lib 这条语句告诉 MASM 您的程序将要用到一些引入库。

windows动态库编译流程

windows动态库编译流程

windows动态库编译流程Windows动态库编译流程是将源代码转化为可执行的动态链接库(DLL)的过程。

以下是关于Windows动态库编译流程的参考内容(不包含链接)。

1. Windows动态库的编译流程通常由以下几个步骤组成:(1)预处理:预处理器会根据预编译指令处理源代码文件,例如#include指令可以将其他头文件的内容插入到当前文件中,宏定义可以在编译过程中替换为相应的内容等等。

(2)编译:编译器将预处理后的源代码文件编译成特定机器平台的目标文件,通常是一种中间代码形式,也就是目标文件(.obj)。

(3)链接:连接器将目标文件、库文件以及其他依赖项进行链接,生成最终的可执行文件或动态链接库。

连接器会解析目标文件之间的调用关系,并将函数、变量的引用解析为实际的地址。

2. 在Windows平台上,常用的编译器是微软的Visual Studio编译器。

在使用Visual Studio进行动态库编译时,可以按照以下步骤进行设置和操作:(1)新建项目:打开Visual Studio,选择“文件”→“新建”→“项目”,选择合适的项目类型(如C++库或通用Windows动态链接库等)。

根据需要进行项目的设置。

(2)编写源代码:在项目中添加源代码文件,编写动态库的实现代码。

(3)设置编译选项:右键点击项目,选择“属性”,在属性窗口中设置编译选项,如C/C++编译器的预处理器定义、头文件搜索路径、编译器警告等级、调试信息生成等。

(4)编译项目:按下F7键或选择菜单项“生成”→“生成解决方案”对项目进行编译。

编译成功后,将生成目标文件(.obj)。

(5)链接库文件:如果需要使用其他库文件,可以将这些库文件添加到项目中,并在属性窗口的链接器选项中指定库文件的路径。

(6)生成动态库:按下Ctrl+Shift+B或选择菜单项“生成”→“生成解决方案”对项目进行生成。

生成成功后,将得到最终的动态链接库文件(.dll)。

飞鸽传书---源代码

飞鸽传书---源代码
DoDataExchange()函数的
//{{AFX_DATA_MAP(CAaaDlg)
......
//}}AFX_DATA_MAP
之间,(注意一定要在“//{{AFX_DATA_MAP(CAaaDlg)”与“//}}AFX_DATA_MAP”
之间)。
同时在aaaDlg.h文件中,在
然电动蝶阀后利用函数GetSystemMetrics( int nIndex )得到系统当前设置如屏
幕分辨率等。
nIndexs= SM_CXSCREEN 时函数返回屏幕的宽度;返回值单位为像素点。
nIndexs= SM_CYSCREEN 时函数返回屏幕的高度;返回值单位为像素点。
函数BOOL GetWindowPlacement( WINDOWPLACEMENT* lpwndpl ) 是最重要的。他
上面这段代码首先将窗口置于屏幕中间,这可以通过函数CenterWindow
(GetDesktopWindow()) 来实现,函数 CenterWindow()的用法为:
void CenterWindow( CWnd* pAlternateOwner = NULL );
其中参数pAlternateOwner指向所想居中的窗口的指针。
WORD m_screenHeight; //屏幕高度
在完成以上所有的步骤后,就可以对窗口的伸展与收缩进行随心所欲的控制了,
电动球阀首先我们来侃侃具体的代码,下面再进行具体的解释。代码为:
CenterWindow(NULL);
m_screenWidth = GetSystemMetrics(SM_CXSCREEN);
DDX_Text(pDX, IDC_SEQUENCE_ORDER, m_wSequenceOrder);

Visual C++开发windows应用程序简介

Visual C++开发windows应用程序简介

Visual c++ 6.0使用简介一、功能窗口的介绍1.浏览项目工作区:项目工作区以窗口方式组织项目、文件和项目设置。

项目工作区窗口一般位于屏幕左侧,项目工作区窗口底部有一组标签,用于从不同的角度(视图)察看项目中包含的工程和联机文档。

项目工作区包含四种视图:FileView(文件视图):显示所创建的工程。

展开文件夹可以察看工程中所包含的文件。

ClassView(类视图):显示项目中定义的C++类,展开文件夹显示工程中所定义的所有类,展开类可察看类的数据成员和成员函数以及全局变量、函数和类型定义。

ResourceView(资源视图):显示项目中所包含的资源文件。

展开文件夹可显示所有的资源类型。

InfoView(文档视图):显示联机文档目录表。

展开目录表可以显示所有的帮助主题,双击主题将弹出InfoViewer Topic窗口,显示关于该主题的详细信息。

要显示关于源程序窗口的关键字的相关信息,可以将光标移动到该关键字上,然后按下F1键。

还可以使用InfoViewer显示来自Internet WWW(万维网)的页面。

单击项目工作区底部的标签可以从一个视图切换到另一个视图。

2.浏览AppWizard(应用程序向导):AppWizard是Visual C++提供的一个高级编程工具,它可以产生应用的C++源代码框架。

通过与另一个工具ClassWizard一起配合使用,可大大节省开发应用程序的时间和精力。

AppWizard是一个标准的C++源代码生成器。

它通过一系列的对话框来提示用户输入所需创建的程序的信息,如它的名字和位置。

用户还可以指定它是否具有一些特性,如多文档接口或工具条,对数据库、OLE的支持等。

然后AppWizard生成一些文件,这些文件构成程序的框架。

由AppWizard生成的程序是一个基本的Windows程序,用户可以编译并运行——它实际什么也不做。

它只是准备好增加那些为程序提供功能性的资源和代码。

windows程序编译流程

windows程序编译流程

windows程序编译流程Windows程序编译流程Windows程序编译是将源代码转换为可执行文件的过程。

在Windows操作系统中,常用的编译工具是Microsoft Visual Studio。

下面将详细介绍Windows程序的编译流程。

一、源代码编译的第一步是准备源代码。

源代码是程序员用编程语言(如C++、C#等)编写的文本文件,它包含了程序的逻辑和功能实现。

二、预处理在进行实际编译之前,需要进行预处理。

预处理器会对源代码进行处理,包括去除注释、展开宏定义、处理条件编译等操作。

预处理可以减少编译错误和提高编译效率。

三、编译编译是将预处理后的源代码转换为汇编语言的过程。

编译器会将源代码翻译成汇编指令,生成汇编语言代码文件。

汇编语言是一种低级语言,与机器指令相对应。

四、汇编汇编是将汇编语言代码转换为机器指令的过程。

汇编器会将汇编语言代码翻译成机器指令,生成目标文件。

目标文件包含了二进制代码和相关的符号表信息。

五、链接链接是将多个目标文件和库文件合并为一个可执行文件的过程。

链接器会解析目标文件中的符号引用,并将其与定义进行匹配。

链接器还会处理库文件的引用,将其与目标文件进行合并。

最终生成可执行文件。

在链接的过程中,还会进行地址重定位和符号解析。

地址重定位是将目标文件中的相对地址转换为绝对地址的过程。

符号解析是根据符号表将符号引用与符号定义进行匹配的过程。

六、生成可执行文件链接完成后,就会生成可执行文件。

可执行文件是可以直接在Windows操作系统上运行的文件。

它包含了程序的二进制代码、数据和相关的元数据信息。

七、调试和优化在编译过程中,还可以进行调试和优化。

调试是指通过调试工具对程序进行逐行跟踪和错误定位的过程。

优化是指对程序进行性能分析和改进的过程,以提高程序的执行效率和资源利用率。

在Visual Studio中,可以通过设置编译选项来进行调试和优化。

调试选项可以生成调试信息,方便在调试工具中进行调试。

《Windows_PE权威指南》(戚利)第2章_三个小工具的编写

《Windows_PE权威指南》(戚利)第2章_三个小工具的编写

《Windows_PE权威指南》(戚利)第2章三个小工具的编写俗话说:“工欲善其事,必先利其器。

”本章将完成与Windows PE有关的三个小工具的开发。

这三个小工具分别是:❑PEDump:PE文件字节码查看器❑PEComp:PE文件比较器❑PEInfo:PE文件结构查看器首先让我们从编写最基本的汇编窗口程序开始。

该窗口程序是本章三个小工具编写的基础,也是后续大部分章节中其他程序编写的基础。

2.1 构造基本窗口程序本节我们将构造一个具有基本窗口元素(含标题栏、菜单栏、工作区域)的窗口程序,后续大部分的程序开发都将以这个基本窗口程序作为基础进行扩展。

2.1.1 构造窗口界面要构造的窗口程序具备窗口图形界面的大部分元素,包含窗口、菜单、图标、工作区域等。

通常的做法是:首先根据程序功能对程序的界面进行构思,然后在纸张上将大致的结构图画出,最后通过资源脚本来定义并实现界面中的每一部分。

当然,读者也可以使用一些辅助的软件如RADAsm 中的资源编辑器或者VS中的资源编辑器,根据构思好的界面在所见即所得的资源编辑器图形界面中直接构造程序窗口界面,该程序最终显示的效果如图2-1所示。

图2-1:基本窗口界面2.1.2 编写相关的资源文件构造完窗口界面以后,需要依据界面编写对应的资源文件,这有点类似于工程建设里的依照图纸施工。

资源文件一般以“.rc”为扩展名,资源文件编写完成后还必须通过资源编译器对资源文件实施编译以生成资源目标文件。

整个过程分为两个阶段:❑创建资源文件pe.rc❑生成资源目标文件pe.res下面我们分别来介绍这两个阶段的内容。

1.创建资源文件pe.rc在编写资源文件时,需要定义图形中出现的所有菜单项、对话框、图标等。

资源文件详细编码如代码清单2-1所示。

代码清单2-1:资源文件详细编码(chapter2\pe.rc)行1~13定义了各元素常量,行16指定了显示在窗口标题栏的图标为main.ico。

WINDOWS程序设计(002)----HELLOWIN程序(源代码及详细解析)WINDO。。。

WINDOWS程序设计(002)----HELLOWIN程序(源代码及详细解析)WINDO。。。

WINDOWS程序设计(002)----HELLOWIN程序(源代码及详细解析)WINDO。

创建⼀个窗⼝,显⽰⼀⾏⽂本,并播放⼀段⾳频.效果图:源代码:Windows函数调⽤:HELLOWIN程序所调⽤的Windows函数:函数简短描述LoadIcon加载图标,以供程序使⽤LoadCursor加载⿏标光标,以供程序使⽤GetStockObject获取⼀个图形对象.在本例中是⼀个⽤来对窗⼝的背景进⾏重绘的画刷RegisterClass为应⽤程序的窗⼝注册⼀个窗⼝类MessageBox显⽰消息框CreateWindow基于窗⼝类创建⼀个窗⼝ShowWindow在屏幕中显⽰窗⼝UpdateWindow指⽰窗⼝对其⾃⾝进⾏重绘GetMessage从消息队列获取消息TranslateMessage翻译⼀些键盘消息DispatchMessage将消息发送给窗⼝过程PlaySound播放声⾳⽂件BeginPaint表明窗⼝客户区的尺⼨DrawText显⽰⼀个⽂本字符串EndPaint借宿窗⼝绘制PostQuitMessage将”退出”消息插⼊消息队列DefWindowProc执⾏默认的消息处理⼤写标识符HELLOWIN.c中使⽤了⼤量的⼤写标识符.这些标志符都是早Windows头⽂件中定义的.这些标志符有很多都是以两三或三个字母作为前缀,且其后紧跟⼀个下划线:这些标识符其实都是数值常量.前缀表明该常量所属的⼀般类别,如下表所⽰.前缀常量CS类窗⼝风格CW创建窗⼝选项DT⽂本绘制选项IDI图标的ID号IDC光标的ID号MB消息框选项SND声⾳选项WM窗⼝消息WS窗⼝风格匈⽛利标记法前缀数据类型c char 或 WCHAR 或 TCHARby BYTE (⽆符号字符)n short (短整形)前缀数据类型i int (整形)x , y int , 表⽰ x 坐标或者 y 坐标cx , cy int , 表⽰ x 或 y 的长度, c 表⽰ “count”(计数)B 或 f BOOL ( int ) , f 表⽰”flag”w WORD (⽆符号短整形)l LONG (长整型)dw DWORD (⽆符号长整型)fn函数s字符串sz以零结束的字符串h句柄p指针参考书籍:《WINDOWS程序设计第五版珍藏版》。

Win32 Api编程指南

Win32 Api编程指南
#include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
MessageBox( NULL, "Goodbye, cruel world!", "Note", _OK ); return 0; }
实际上是发送给窗口的窗口过程函数处理这个窗口也许是我们的主窗口也许是别的窗口或者仅仅是一个操作很多情况下窗口的创建是不显示在屏幕上的可能由系统隐式的创建或者由另一个程序创建而这些都不需要我们操心因为我们通信的途径就是通过发送和接受消息其余的事情操作系统会为我们打理
Win32 API 编程指南( 1 )
其实只要记住几个要点也就很容易理解了。LP 前缀代表指向长整形的指针( long pointer )。在 Win32 中,long 是一种古老的类型了,这里不用细说。如果您不知道指针是什么,您有两种选择:1 )去找本 C 的书
读一读。 2 )继续读下去,可能会弄得一团糟。我强烈建议您选择第一种,但还是有很多人坚持选择第二种( 我 已经给了您建议哦: ) 别怪我没提醒您! )
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL ); if ( hwnd == NULL ) { MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
最简单的 Win32 程序

用C++实现HTTP服务器 - Windows平台(开放源代码)

用C++实现HTTP服务器 - Windows平台(开放源代码)

1. 目的和用途用C++实现一个Windows下的,简单的HTTP服务器模型,用作局域网内的文件共享工具.我以前在公司里,同事之间经常要共享一些大文件(超过2G),如果直接共享Windows目录,非常不安全不说,经常还因为各种各样的问题导致无法访问: 比如guest用户被禁用,防火墙拦截等.现在,我只要开启这个程序(一个非常简单的程序,只有一个几百K大小的EXE文件),对方就可以用浏览器 (IE,Firefox等都可以,还有比浏览器安装范围更广的客户端吗?)访问到我共享的文件,还支持断点续传,多么惬意.另外,这是一个符合协议要求的HTTP服务器,理论上说,放到公网上也是完全可以的,只是功能没有成熟的Apache, IIS等丰富,安全性能也不足,但是作为一个学习的模型,提供文件下载服务还是没问题的.2. 原理说明(1) 关于HTTP协议.我个人非常非常喜欢HTTP协议,这是一个简洁的,基于文本的,应答式的协议. 基于文本的一大好处是调试特别方便,因为所有的数据都是可以直接读出的文本,程序结果正确与否一目了然,另外还有很多其它好处,可以参考<<UNIX编程艺术>>,里面有一章专门讲基于文本的协议的好处,深以为然.HTTP协议的交流过程可以简单的描述为:双方建立TCP连接,客户端(通常是浏览器)发送一段固定格式的文本(所谓的请求),服务器根据客户端请求的内容,生成并回应一段固定格式的文本(所谓的回应头)和文件内容(如果客户端请求的是文件下载的话),数据发送完毕后,断开连接.这就是我们今天网络世界的基础,没错,就这么简单.当然,客户端的请求和服务器的回应头都有格式要求,可以读一读W3C关于HTTP 协议的文档.(Que's HTTP Server发行包内也包含了一份,请点击文章开头的链接下载.)(2) Windows的网络模型.Windows系统中,当属完成端口模型的网络性能最好.作为可能面临巨大网络压力的HTTP服务器,完成端口模型是唯一的选择.完成端口模型用一种类似于回调的方式处理网络操作,所有的网络操作都不会阻塞,而是排队后直接返回,等到操作完成,系统会触发一个完成端口事件以通知应用程序.所以应用程序只要用一个线程一直检查对应的完成端口就可以得到网络操作的结果.和回调不同的是,系统允许多个线程同时等待同一个完成端口事件,Windows系统确保对于一个完成端口时间,只有一个等待线程被唤醒.这样,对于有多个CPU的机器,我们可以创建多个线程(一个CPU对应一个线程)等待同一个完成端口事件以并行的方式处理网络事件以充分发挥机器的性能.关于完成端口编程方面的指导请参考<<Windows网络编程技术>>(微软出版,Anthony Jones著)第八章.3. 程序结构介绍CHTTPServer对象CHTTPServer对象代表了整个HTTP服务器在内存中的存在,负责创建完成端口模型,创建所需的线程,监控完成端口事件并且维持URL和服务器上的真实文件的对应关系.除了维护网络模块外,CHTTPServer对象还要根据接收到的客户端请求生成正确的服务器响应.它的角色和或者 JSP编程中用到的预定义Server对象是类似的.CHTTPRequest对象CHTTPRequest对象是对客户端请求的包装,由于客户端请求是一段带格式的文本,用编程语言说就是一个字符串,为了编程方便,我创建了 CHTTPRequest对象管理这个字符串,CHTTPRequest对象提供了若干方法,可以很方便的访问到客户端请求的各个参数.它的角色和 或者JSP编程中用到的预定义Request 对象是类似的.CHTTPResponse对象CHTTPResponse对象是对服务器响应的包装,CHTTPServer对象根据CHTTPRequest对象的内容,设置 CHTTPResponse对象的参数,最后由CHTTPResponse对象把这些参数输出为符合HTTP协议要求的文本.它的角色和或者JSP编程中用到的预定义Response对象是类似的.CHTTPContent对象CHTTPContent对象代表了客户端所请求的资源(URL).它可能是一个文件,也可能就是一段服务器即时生成的HTML/TEXT文本,比如某个目录的文件列表,或者是一个出错信息,如HTTP404文件未找到的提示.程序运行的流程如下:CHTTPServer对象启动并监控网络模块,当一个新的客户端连接建立以后,CHTTPServer对象开始读取这个新连接,直到接收到一个完整的请求头为止. 当CHTTPServer对象收到一个完整的请求头后,它就以之为参数,建立一个新的CHTTPRequest对象,然后分析这个 CHTTPRequest对象,生成正确的CHTTPResponse对象和CHTTPContent对象,然后把CHTTPResponse对象输出的文本和CHTTPContent对象的内容按顺序发送给客户端,并在数据发送完成后关闭连接,回收上述的各个对象.4. 核心代码分析下面贴一段CHTTPServer对象根据CHTTPRequest对象的内容,生成CHTTPResponse对象和CHTTPContent对象的关键代码.[cpp]view plaincopy1.// 已经完整接收到了一个请求头,处理之2.// 目的: 通过分析Request对象,准备好Response对象,并在可能的情况下生成一个Content对象并关联到Response对象中.3.void CHTTPServer::OnRequest(PCLIENTINF pSockInf)4.{5. ASSERT(pSockInf);6. ASSERT(pSockInf->pRequest);7. ASSERT(pSockInf->pResponse);8. std::wstring strUrlObject(L"");9. std::wstring strServerFilePath(L"");10.11. // 是否是有效的请求头12. if(!pSockInf->pRequest->Verify())13. {14. // 请求头格式不正确,返回HTTP 400和一段关于400的预定义说明文本15. pSockInf->pResponse->SetServerCode(SC_BADREQUEST); //HTTP 40016. CHTTPContent *pContent = new CHTTPContent;17. pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));18. pSockInf->pResponse->AttachContent(pContent);19. goto exit;20. }21.22. // 请求的方法是否是 GET 或者 HEAD23. HTTP_METHOD method = pSockInf->pRequest->GetMethod();24. pSockInf->pResponse->SetMethod(method);25. if(method != METHOD_GET && method != METHOD_HEAD)26. {27. // 目前只支持两种HTTP方法28. pSockInf->pResponse->SetServerCode(SC_BADMETHOD); // HTTP 40529. CHTTPContent *pContent = new CHTTPContent;30. pContent->OpenText(g_HTTP_Bad_Method, strlen(g_HTTP_Bad_Method));31. pSockInf->pResponse->AttachContent(pContent);32. goto exit;33. }34.35. // 获取客户端请求的对象36. strUrlObject = pSockInf->pRequest->GetUrlObject();37. if(strUrlObject.size() <= 0)38. {39. // URL Object 为空,说明客户端的请求有问题.40. pSockInf->pResponse->SetServerCode(SC_BADREQUEST); //请求头格式错误 HTTP 40041. CHTTPContent *pContent = new CHTTPContent;42. pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));43. pSockInf->pResponse->AttachContent(pContent);44. goto exit;45. }46.47. // 映射为服务器文件名.48. MapServerFile(strUrlObject, strServerFilePath);49.50. // 如果 URL 的最后一个字符是 '/' 说明请求文件列表,否则是请求一个具体的文件.51. if(strUrlObject.back() == L'/')52. {53. // 浏览目录创建目录列表的内容对象,并关联给Response对象54. CHTTPContent *pContent = new CHTTPContent;55. if(m_bNavDir)56. {57. if(pContent->OpenDir(strUrlObject, strServerFilePath))58. {59. pSockInf->pResponse->SetServerCode(SC_OK); // HTTP 20060. }61. else62. {63. // 无法列出目录的文件列表.64. pContent->OpenText(g_HTTP_Server_Error, strlen(g_HTTP_Server_Error));65. pSockInf->pResponse->SetServerCode(SC_SERVERERROR); // HTTP 50066. }67. }68. else69. {70. // 禁止浏览目录71. pContent->OpenText(g_HTTP_Forbidden, strlen(g_HTTP_Forbidden));72. pSockInf->pResponse->SetServerCode(SC_FORBIDDEN); // HTTP 40373. }74. pSockInf->pResponse->AttachContent(pContent);75. }76. else77. {78. // 客户端请求了服务器上的一个文件79. // 1.客户端是否请求了断点续传的内容80. // 2.创建文件内容对象并关联给Response对象81. __int64 lFrom = 0;82. __int64 lTo = -1;83. if(pSockInf->pRequest->GetRange(lFrom, lTo))84. {85. pSockInf->pResponse->SetServerCode(SC_PARTIAL); //HTTP 20686. }87. else88. {89. pSockInf->pResponse->SetServerCode(SC_OK); // HTTP20090. }91.92. CHTTPContent *pContent = new CHTTPContent;93. if(pContent->OpenFile(WtoA(strServerFilePath.c_str()).c_str(), lFrom, lTo))94. {95. // 文件打开成功.96. }97. else98. {99. // 文件不存在或者其它什么原因,打开失败.100. pContent->OpenHtml(g_HTTP_Content_NotFound, st rlen(g_HTTP_Content_NotFound));101. pSockInf->pResponse->SetServerCode(SC_NOTFOUND ); // HTTP 404102. }103. pSockInf->pResponse->AttachContent(pContent); 104. }105.106.exit:107. /////////// 准备响应头108. pSockInf->pResponse->CookResponse(); // 把上面设置的参数输出为一段符合HTTP协议的文本.109.110. // 写日志.111. LOGGER_CINFO(theLogger, _T("连接[%s:%d]请求资源[%s],回应[HTTP %d].\r\n"),112. AtoW(pSockInf->pRequest->GetIP().c_str()).c_str(), pSockInf->pRequest->GetPort(),113. strUrlObject.c_str(),114. pSockInf->pResponse->GetServerCode());115.116. return;117.}[cpp]view plaincopy1.5. 使用说明这是一个非常轻量级的程序,不需要安装,只有一个EXE文件,运行后可以设置作为HTTP服务器的根目录的位置和服务端口.如果选中了"允许浏览目录"的复选框,则允许客户端浏览器列出服务器上某个目录下的所有文件,比如客户浏览器输入 "http://xxxxx/汽车图片/" 那么将会看到服务器根目录下"汽车图片"子目录下的所有文件的列表.如果不选中,则显示"403 Forbidden"的提示.程序运行的效果如下图所示:用Firefox浏览目录的效果如下:===================================================================== 更新日志说明:V1.51之前的代码结构不好,很杂乱,界面也很简陋,只是在公司内部作为一个方便文件共享的小工具使用,没有发布.V1.51 Beta1. 启用新界面.2. 重新编写内核,开始出现 CHTTPContent对象.3. 启用新的日志系统.V1.52 Beta现在服务器支持超过2G的大文件的下载了, 内部使用64位长的整数(之前使用32位整数,只能支持到2G的文件)来记录文件长度.V1.52 Beta Build 15279浏览目录时,现在不再列出系统文件和隐藏文件,并且所有的子目录都在前面出现.V1.52 Beta Build 152710新增: 在状态栏显示当前使用的带宽(每2秒刷新一次).新增: 在状态栏显示当前一共有多少个连接(实时).修正: 在浏览目录时,现在超过2G的文件可以正确显示大小.修改: 现在,超出的日志每次只移除前面100行(原来移除200行).新增: 每个连接在关闭时,在日志里有体现服务器为处理该连接所用的时间.新增: 现在允许设置服务器的最大连接数.修改: 内核做了一小部分修改,使程序逻辑更清晰明了.V1.52 Beta Build 152711修正: 改正了一个内部同步错误,现在带宽计算结果更精确了.V1.52 Beta Build 152712修正: 当一个连接发送数据超过2G时,现在在日志中可以正确显示了.V1.52 Beta Build 152713修正: 修正了下行带宽统计的一个错误.V1.52 Beta Build 152714新增: 现在可以设置会话超时了.新增: 如果一个连接在指定时间内没有发送或者接收任何数据,则会被判定为死连接而被移除.这个时间可以在设置界面设置.修改: 浏览目录时,如果一个文件超过1G,则会显示为"XXX GB" 而不是原来的"XXXX MB".修改: 一些界面提示性文本作了小修改.V1.52 Beta Build 152715修改: 重新绘制工具条图标.新增: 现在可以设置每个客户(以IP为准)最多可以有多少个连接.新增: 现在可以设置每个连接的最大带宽. 注意:为保持连接的活跃性,每个连接的最小带宽不会小于 250B/s.修改: 不再为侦听套接字单独创建一个线程,而是使用AcceptEx调用,以节省服务器系统资源并提高效率.新增: 连接关闭时,会在日志中显示该连接所用的平均带宽.修正: 当一个请求头被分为多次接收时,会导致连接被关闭.新增: 支持文件日志,并可以在设置界面中禁用/启用.日志文件和EXE文件在同一个文件夹内,文件名为 HTTPServerLOG(年月日).TXT,每个日志文件最大5MB. 新增: 在禁止浏览目录的情况下,允许设置默认文件名(多个文件名以逗号分隔,最长260个字符).修改: 现在内核使用3个定时器队列分别对应3中应用,以提高性能.注: V1.5X版本将不再增加新功能,而继续测试以发现和修复BUG为主.V1.52 Build 152716修正: 停止服务器时,如果还有连接,不再提示定时器删除错误.V1.52 Build 152717修改: 连接结束时,日志中的平均速度显示为 "XXX MB/s"等v1.52 Build 152718修改: 调整了一些日志文本的格式,使之更有条理.开放源代码.。

translucenttb代码

translucenttb代码

TranslucentTB是一个开源的Windows任务栏透明化工具。

你可以在它的GitHub仓库中找到源代码。

以下是TranslucentTB的主要代码片段,用于设置任务栏的透明度:cpp复制代码// 获取任务栏窗口句柄HWND hWndTaskbar = FindWindow(L"Shell_TrayWnd", NULL);// 获取任务栏的DCHDC hDC = GetDC(hWndTaskbar);// 创建内存DCHDC hMemDC = CreateCompatibleDC(hDC);// 创建位图并选入内存DCHBITMAP hBitmap = CreateCompatibleBitmap(hDC, width, height);SelectObject(hMemDC, hBitmap);// 将任务栏的背景绘制到内存DC中BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);// 释放DCReleaseDC(hWndTaskbar, hDC);DeleteDC(hMemDC);// 创建透明画刷HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));// 设置透明画刷为透明色SetBkColor(hMemDC, RGB(0, 0, 0));// 将内存DC绘制回任务栏窗口,实现透明效果BitBlt(hDC, 0, 0, width, height, hMemDC, 0, 0, SRCAND);// 释放资源DeleteObject(hBrush);DeleteObject(hBitmap);以上代码通过获取任务栏窗口句柄,获取其设备上下文(DC),然后创建一个内存DC,并将任务栏的背景绘制到内存DC中。

接着,创建一个透明画刷,并将其设置为透明色,最后将内存DC绘制回任务栏窗口,实现透明效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wndclass.lpfnWndProc = WndProc ; //窗口处理函数
wndclass.cbWndExtrtra = 0 ; //窗口类扩展:无
wndclass.hInstance = hInstance ; //窗口实例句柄
wndclass.lpszClassName = szAppName ; //窗口类名
wndclass.lpszMenuName = NULL ; //窗口菜单:无
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) ;//窗口背景颜色
case WM_DESTROY: //处理窗口关闭时的消息
MessageBox( hwnd, TEXT("关闭程序!"), TEXT("结束"), MB_OK |MB_ICONINFORMATION ) ;
PostQuitMessage( 0 ) ;
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam ) ; //DefWindowProc处理我们自定义的消息处理函数没有处理到的消息
{
TranslateMessage( &msg ) ; //将虚拟键消息转换为字符消息
DispatchMessage( &msg ) ; //分发到回调函数(过程函数)
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
EndPaint( hwnd, &ps ) ;
return 0 ;
case WM_LBUTTONDOWN: //处理鼠标左键被按下的消息
MessageBox( hwnd, TEXT("鼠标左键被按下。"), TEXT("单击"), MB_OK | MB_ICONINFORMATION ) ;
return 0;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ) ; //窗口最小化图标:使用缺省图标
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ; //窗口采用箭头光标
if( !RegisterClass( &wndclass ) )
{
static TCHAR szAppName[] = TEXT("MyWindow") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ; //声明一个窗口类对象
//以下为窗口类对象wndclass的属性
wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口样式
}
return 0;
case WM_PAINT: //处理窗口区域无效时发来的消息
hdc = BeginPaint( hwnd, &ps ) ;
GetClientRect( hwnd, &rect ) ;
DrawText( hdc, TEXT( "Hello,这是我自己的窗口!" ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER ) ;
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, //窗口初始显示位置x:使用缺省值
CW_USEDEFAULT, //窗口初始显示位置y:使用缺省值
CW_USEDEFAULT, //窗口的宽度:使用缺省值
CW_USEDEFAULT, //窗口的高度:使用缺省值
NULL, //父窗口:无
#include <windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; //声明用来处理消息的函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
NULL, //子菜单:无
hInstance, //该窗口应用程序的实例句柄
NULL //
) ;
ShowWindow( hwnd, iCmdShow ) ; //显示窗口
UpdateWindow( hwnd ) ; //更新窗口
while( GetMessage( &msg, NULL, 0, 0 ) ) //从消息队列中获取消息
{ //注册窗口类,如果注册失败弹出错误提示
MessageBox( NULL, TEXT("窗口注册失败!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
return 0 ;
}
hwnd = CreateWindow( //创建窗口
szAppName, //窗口类名
TEXT("我的窗口"), //窗口标题
{
HDC hdc ; //设备环境句柄
PAINTSTRUCT ps ; //绘制结构
RECT rect; //矩形结构
switch( message ) //处理得到的消息
{
case WM_CREATE: //窗口创建完成时发来的消息
MessageBox( hwnd, TEXT("窗口已创建完成!"), TEXT("我的窗口"), MB_OK | MB_ICONINFORMATION ) ;
相关文档
最新文档