精华内容
下载资源
问答
  • windows编程

    2018-11-01 09:06:53
    Programming Windows,windows核心编程,windows编程基础知识,适合入门
  • windows编程两本pdf书籍

    2018-03-15 17:03:34
    windows编程三本pdf书籍 包括: windows程序设计_第五版(中文完整版).pdf windows核心编程.pdf
  • 《深入Windows编程》是2000年出版的图书,作者是雷军. 因这个pdf是10章版本的,而且是图片的,资源不怎么好,但现在也很难下载到这个资源了,稍微获取一点点积分。不像某些人,分割成4个part,每个还要3分,完全有赚...
  • Windows编程》实验报告.doc VC6 MFC 比较详细
  • windows编程实现俄罗斯方块,多文件管理,思路清晰,实现简单。
  • windows编程的基于socket的简易聊天室。注册窗口类、自定义消息、socket、WSAAsyncSelect、
  • 国软 Windows编程实践

    2013-06-01 17:10:12
    武大国软 Windows编程实践 三个项目和实验报告 高分作业 包括:实验一:用Visual C++开发简单的WinAPI程序 实验二:用MFC开发计算器程序 实验三:用MFC开发简单文本查看程序 和总的实验报告
  • Windows编程

    千次阅读 多人点赞 2015-10-04 22:38:47
    本文整理自百科、知乎与 科学家的世界、Windows编程基础 问题一:为什么开发windows应用程序不用c 而用.net,java,c++? 用 c+windows API 开发windows 应用程序 比用.net,java,c++开发有什么缺点或优点? ...

    本文整理自百科、知乎与 科学家的世界


    问题一:为什么开发windows应用程序不用c 而用.net,java,c++?

    用 c+windows API  开发windows 应用程序  比用.net,java,c++开发有什么缺点或优点?

    C/C++,现在的软件公司对这种人才需求更多。用这种语言写出来的程序是真正的exe可执行文件。是有系统启动运行的。
    而Java和.NET就不一样了。

    Java是基于解释的,你写出的程序不是由系统运行的。是由jdk的一个叫java.exe或者javaw.exe的程序运行。速度肯定要比前者慢。
    而.NET即使看起来是exe文件,但是也是有.NETframework运行的。
    对于初学者Java和C#会简单些。
    C/C++是调用mfc就是windows的系统基础类执行的
    Java是用jdk运行的。
    C#是用.NETframework运行的。


    问题二(知乎):如何学习 Windows 编程

    1、请看《windows程序设计》(很经典的一本书,分上下两册,可以买,可以下载电子版)更接近 C 语言方式的使用 windows api 的编程方式,好处是,代码直观,最适合理解 windows gui 的运作,程序员和系统之间的分工协作职责划分。缺点是,开发效率低,不易学习。但是学好了,感觉是非常爽,非常自由的。不过在今天使用这种方式写 windows 程序的人,我几乎见不到。开发成本巨高昂无比。更多请看:Windows 程序设计 复习笔记(共 81 问)

    《windows 核心编程》:这是一个名家写的书。算是《windows 程序设计》的进阶篇。里面提到的是一些更专业的技术。是你在掌握了windows 程序设计后应该读的书。这个人后来好像有写了《C# via CLR》。
    2、Windows编程现在仍然是一坑。
    如果你想Win下面用c++编程,那只能写原生程序,首先遇到的问题是GUI界面,这个问题非常复杂。因为20多年来,Windows原生GUI程序编程的复杂度没有降低过,可以说相当困难。(原因自然是光头鲍尔默在技术上的无知,把精力都放在.net上去了,但是.net几乎没人待见)
    你有几个选择:
    1. 直接调用windows api绘制界面。非常繁琐,我建议你不要把生命浪费在这个上面。

    2. MFC
    20年以上的历史,一个微软VC6.0时代老掉牙的C++ gui界面库,过时而且不好用。

    3. QT
    QT是一个第三方库。是一个不错的选择,但是它这个框架有点庞大,运行效率不是很高,总得来说是业余编程最佳选择了。

    4.WTL
    微软程序员业余写的库,仍然非常简陋的库,大量东西等着你去实现。

    所以你看,Windows原生程序编写最大的问题是找不到合适的界面库,你想编写带界面的原生WIN程序非常吃力,我们看到这么多年来Windows上的程序翻来覆去就是QQ等那些老面孔,这根Win平台原生GUI编程太困难有很大关系。对比之下Mac、ios/安卓编写GUI程序都简单的多。

    除非,你用.net框架。
    .net框架不能编写原生程序,用c#编写,跟c++关系不大了。

    所以如果你是一个学生,我不建议你学这个,你可以学习下苹果/安卓手机平台编程、或者web编程、或者c++/COCOS2Dx游戏编程,都比学windows gui编程有意义的多,win平台已经到顶了,已经不是未来最大的趋势了。(这观点此楼主太)
    3、

    学Windows编程,最好是将C#和C++结合起来。

    现在的Windows上,主流的开发方法是:界面和大部分不影响效率的功能是用C#实现的。非常影响效率的部分功能用c++的实现,并作为程序的动态链接库调用。

    最好不要用C++来编写界面和普通的功能,事倍功半!



    什么是Windows编程

    所谓Windows编程就是在Windows平台上开发,并且运行于Windows平台上的程序,当然,开发的时候运用的东西是Windows API或者封装之后的Windows API


    为什么要学Windows编程

    有人说,我学的是Java,我不需要跟系统打交道。是的,你说的是对的,但是,这并不意味着学习Windows编程是不必要的,事实上,Java的底层使用的也是Windows API,比如,Java的Socket模块使用的肯定是Windows的WS2_32.dll导出的API。所谓的高层语言,其实在具体跨平台的时候用的是相应的本地系统提供的API,比如创建进程,在Java里面肯定有相应的API,这些API底层的实现在Windows上调用的是CreateProcessA(W),在Linux上调用的是fork之类的函数。学习Windows编程能让你更了解操作系统,也让你更了解程序的运行原理。当然,你可以学习Linux平台的编程,不过,两者之间其实差不多,在Windows中有的API在Linux中其实是有与之对应的,我对于Windows平台和Linux平台的编程都学过,只是用得最多的是Windows。


    我需要什么基础才能学习Windows编程

    事实上,我可以告诉你,你需要的基础就是C语言,除了这个之外,你不需要什么其它的基础,你并不需要什么C++的基础,汇编基础之类的东西,当然,你最好是能理解一些操作系统的相关东西。


    我需要什么工具

    关于工具,事实上你只需要一个Windows操作系统和一个VisualStudio 2012就可以(如果你使用的是Visual Studio 2008(2010)也可以)。作为一个初学者,什么版本的Windows操作系统无所谓,只要是WindowsXP及以后的版本都可以,虽然有些API只有在NT 6.0之后才有,不过,那对于初学者是不需要的。


    Windows程序员需要学什么

    经常发现有人在网上提出这样的问题,现实中也确实有不少人在经历了3-5年的Windows开发之后就开始迷失方向,每天浑浑噩噩混日子,可能是因为这个问题粒度太大,没人愿意花时间回答,希望本文可以抛砖引玉,给大家节省些时间,同时也希望园子里面的兄弟们能尽力的补充,从而使这篇文章可以帮助更多的后来人。

    首先说明的是,本文提到的各种技术不分先后,没有顺序,虽然先学什么,再学什么对某些人来说可能更方便,但是这些都不是绝对的,因为每个人的情况不同。

    Windows开发首先必须学习的就是操作系统的API,因为其他的一切都是构建于OS之上,所谓九层之台,起于垒土,如果你对linux的系统调用很熟悉就会发现其实他们大同小异,都是应用程序在使用系统提供的功能。

    接下来是MFC,有了MFC你才真正的可以干点开发,因为MFC实在是太全了,几乎封装了所有的Windows API, 消息循环,COM实现

    到了此地,你可以开始学习调试技术了,熟悉了调试的各种技巧才可以做到事半功倍,得心应手。

    接下来是组建对象模型COM,作为windows的基石,不懂COM,很难说自己精通windows编程,因为即使现在的.NET framework也是构建于COM之上,很多问题还是需要SOS到底层去调试

    当你懂得了COM的精髓,你应该开始学习ATL了,这个类库可以使你的COM开发更加得心应手。

    说到ATL就不能不提到他的前辈STL,这个出自于标准C++的类库在windows上同样也得到了很好的支持,有了STL在你有一天想转linux开发也同样会用得上。

    Windows 8中的WinRT现在还没有应用于实际开发,现有的技术中.NET 是非常值得学习的,因为.NET 的主旨是提高程序员的开发效率,在这个浮躁的世界,开发效率有时候能够代表一切。

    COM.NET只有一步之遥,.NET 其实是从COM+演化而来,具体细节请参看 Don Box的《.NET 本质论》了解了这些会使你对.NET的认识上升到一个新的层面。

    接下来是C# 因为这家伙是.NET的嫡系部队,除了IL,这家伙可以说和.NET 的关系最为亲近,大部分的新功能都会最先在其中加以体现。当你熟悉了C# BCL,《CLR via C#》可以说这个时候你已经可以胜任基本的C#开发了,可以很快写出一个小工具,完成一个相关的task

    接下来WCFWPF,做分布式开发少不了WCF,同样华丽的界面少不了XAMLWPF

    大概罗列了一些,其实每个主题仔细探究下去都很有韵味,还有需要说的是,其实Windows上面好多的东西都和UNIX很像,比如PowerShell明显是为了像UNIX一样,给开发者提供一个更强大的shell, 如果有兴趣,触类旁通一下,也很是有趣。

    还有:

    LINQ改变了我们的数据操作方式,统一了数据操作模型,经常操作数据的兄弟,你值得拥有。

    F#作为一种函数式编程语言也很值得研究,由于本人使用不多,在此不作评价。

    另外:

    作为基础的算法;

    作为提升功力的设计模式,UML

    作为改善系统性能的重构;

    作为大部分分布式核心的TCP/IP

    等等主题也是值得大家研究的。

    最后借鲁迅的话收尾:其实地上本没有路,走的人多了也便成了路,希望大家不要把时间都浪费了,原来还有好多东西可以去钻研。

    不当之处望大家批评、指正、拍砖并提出您的宝贵的意见和补充。

    转自:solidmango


    第一个工程

    1)打开Visual Studio,如下地建一个工程

    2)选择一个空的工程


    3) 新建一个文件

    添加一个cpp文件的。


    4)输入如下代码

    #include <windows.h>
    #pragma comment(linker, "/entry:\"main\" /subsystem:\"windows\"")
    int main(){
    MessageBox(NULL, TEXT("Hello,World"),TEXT("NULL"),  MB_OK);
    }

    5)按下 Ctrl + F5

    此时可以运行程序了,是不是看到了一个小窗口呢?是不是这此代码比较熟悉呢?
    是的,事情就是这样,你看到的就是Windows上开发所需要的一切。

    代码解释

    第一行

    第一行是#include <windows.h>,任何Windows平台上的应用程序肯定需要引用一些Windows的函数或者变量,而这些函数或者变量的声明就在Windows.h里面,所以我们需要包含它,这跟大家包含stdio.h一样的道理。

    第二行

    也许大家看到的Windows程序是以WinMain开头的,然而,你们在这里面看到的是main?有人怀疑我写错了,事实上, 我没有写错,所谓的main函数是一个逻辑上的概念,也就是告诉链接器,我这个程序要从哪里开始执行,C(++)里面的入口函数是main,Windows上是WinMain,这些并没有错,当然,也允许我们自己设定入口函数。这里面的 #pragma comment(linker, "/entry:\"main\" /subsystem:\"windows\"") 里面的/entry其实是设置入口函数,/subsystem其实是设置子系统(gui的或者console的),gui的程序是没有黑框框的,console的程序是大家平时看到的一个黑框框,大家的第一次hello,world基本上是交给它的,正如大家的第一次上网基本交给了IE一样。

    第三行

    第三行是一个函数调用,大家肯定知道的对吧,这个函数调用的是MessageBox,即一个Windows里面的API,定义于user32.dll里面。为了方便大家写程序,我建议大家安装一个叫做msdn的东西,

    细节说明

    TEXT是什么

    把鼠标放在TEXT上面,然后按下F12,你会看到如下的说明,其定义等价于如下的:
    #ifdef UNICODE
    #define TEXT(queto) L##queto
    #else
    #define TEXT(queto) queto
    #endif
    从中可以从字面地看出来吧

    UNICODE是什么

    在C语言中我们可以一般写字符串中都是用“Hello,World”这种写法,而没有上面的那种TEXT("Hello,World")的写法,在Windows里面,为了便于操作系统的移植,使用了两种字符表示,一个是多字节码,一种是UNICODE表示,如果在一个ascii字符串前面加上L,那么它就变成了UNICODE串,比如L"ABC"
    可以刚才如下网址:http://baike.baidu.com/view/40801.htm

    ##是什么

    在Windows平台的C语言中有##表示串连接,比如“ABC”##"DEF"你就得到了"ABCDEF"了,这个估计很多人都不知道。这个东西在MFC的实现中用得特别多。

    MessageBox是一个函数?

    其实 ,MessageBox不是一个函数,与之相关的函数有两个,MessageBoxA与MessageBoxW,根据是否使用UNICODE串从而定义MessageBox是MessageBoxA还是MessageBoxW,并且,在user32.dll里面同时实现了这两个API,当然MessageBoxA的实现中会调用MessageBoxW。
    通过 dumpbin -exports user32.dll可以看到如下的结果


    dumpbin -exports可以看出一个dll里面导出了什么函数,这个工具是由visual studio sdk提供的,大家安装完visual sutdio之后就会自动安装这个工具,不需要单独下载。


    Windows开发的常识

    1)窗口

    Windows中最基本的概念也许就是窗口了,每一个前台程序都至少有一个窗口,一个窗口也是你可以看到的部分,比如,QQ的登录窗口
    基本上你在Windows中可见的都是一个窗口,窗口也是Windows中用于用户直接交互的基本元素(GUI程序)。

    2)句柄

    窗口、文件、socket、信号量、管道、邮槽(mailslot)……都是Windows平台中的基本对象,为了操作这些对象,我们需要一个能够引用这些对象的东西,这个引用这些对象的东西就是句柄(Handle)。句柄对于资源就像遥控器对于电视机,用遥控器能更好地操作电视机而不用关心内部实现的细节,句柄也是这样的,用句柄你能更好地操作Windows对象,而不需要关系其内部的实现细节。事实上,你想操作Windows对象也只能通过句柄操作。比如,你想操作一个线程,你看看SuspendThread的原型如下所示:(第一个参数就是一个线程句柄)
    Syntax
    DWORD WINAPI SuspendThread(
      __in  HANDLE hThread
    );
    
    又比如,你想读一个文件,其函数ReadFile的原型如下:( 第一个参数就是一个文件的句柄。)
    BOOL WINAPI ReadFile(
      __in         HANDLE hFile,
      __out        LPVOID lpBuffer,
      __in         DWORD nNumberOfBytesToRead,
      __out_opt    LPDWORD lpNumberOfBytesRead,
      __inout_opt  LPOVERLAPPED lpOverlapped
    );

    3)进程

    一些操作系统教材上对进程的定义为:进程是一个程序的一次运行过程。这个定义其实是对的,但是,也是错的,为什么呢?在Windows之前还有许多其它的操作系统,比如OS 360、UNIX……进程的概念提出来的时候Windows 还根本没出生呢。不过,在Windows中,进程的概念完全不是这样的,在Windows里面,进程是程序隔离的基本单元,每一个32位应用程序在自己的进程空间里面运行,进程只为这个程序提供4G的虚拟地址空间,并且,不同的进程之间互相不干扰(当然,后面会讲到,进程之间会通信)。

    4)线程

    在Windows里面,真正运行程序的其实是线程,线程在进程提供的4G虚拟地址空间里面运行,它执行PE文件的.text段。也就是说,线程才是真正的执行体。

    基本的正常的Windows程序

    代码

    创建一个工程,还是按照上次的方法,在上一节里面有,然后输入以下代码:
    #include <windows.h>
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT ("BossJue");
        HWND         hwnd;
        MSG          msg;
        WNDCLASSEX   wndclassex = {0};
        wndclassex.cbSize        = sizeof(WNDCLASSEX);
        wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
        wndclassex.lpfnWndProc   = WndProc;
        wndclassex.cbClsExtra    = 0;
        wndclassex.cbWndExtra    = 0;
        wndclassex.hInstance     = hInstance;
        wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
        wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);
        wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
        wndclassex.lpszMenuName  = NULL;
        wndclassex.lpszClassName = szAppName;
        wndclassex.hIconSm       = wndclassex.hIcon;
    	
        if (!RegisterClassEx (&wndclassex))
        {
            MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);
            return 0;
        }
        hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, 
    		                  szAppName, 
            		          TEXT ("WindowTitle"),
                    		  WS_OVERLAPPEDWINDOW,
    		                  CW_USEDEFAULT, 
            		          CW_USEDEFAULT, 
                    		  CW_USEDEFAULT, 
    		                  CW_USEDEFAULT, 
            		          NULL, 
                    		  NULL, 
    		                  hInstance,
            		          NULL); 
    						  
        ShowWindow (hwnd, iCmdShow);
        UpdateWindow (hwnd);
    	
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
        return msg.wParam;
    }
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static const LPTSTR text = TEXT("Hello,World");
        HDC hdc;
        PAINTSTRUCT ps;
        switch (message)
        {
        case WM_CREATE:
            return (0);
    		
        case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps);
            TextOut (hdc, 0, 0, text, lstrlen(text));
            EndPaint (hwnd, &ps);
            return (0);
    		
        case WM_DESTROY:
            PostQuitMessage (0);
            return (0);
        }
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    运行

    按下Ctrl + F5,你可能会碰到如下的链接错误:

    不要急,这个错误的设置是因为Windows把这个程序当作console程序,而console程序默认入口函数是main,而我们在这里面并没有定义main,而是定义了一个叫WinMain的入口函数,所以链接器不认,而我们希望的却是编译器认为我们这个程序是一个GUI程序,GUI程序的入口函数是WinMain(如果你用#pragma comment(linker…………)修改的话当然也是可以的,这种方法我在第一章里面就写到了。当然,我们还可以直接在Visual Studio IDE里面直接设置,方法是打开项目属性,然后如下设置:

    样设置之后,再按Ctrl + F5,有没有看到如下的一个窗口呢?


    ,就是这样,你看到的就是一个正常的Windows程序的编写。

    代码解释

    编写Windows程序的过程

    编写一个Windows程序,你需要做的是三步,第一步是注册一个窗口类,第二步是创建窗口,第三步是编写消息响应函数。其中第一步和第二步是基本固定的,除了个别的参数需要自己调整之外,最重要的是第三步,
    一个Windows程序中,代码量最大的基本都在第三步。在Windows应用程序里面,如果我们想要接收用户的输入、在窗口上面显示一些信息……我们都需要处理相关的消息,Windows把与这个程序相关的事件都以消息告诉程序,至于怎么处理这些消息,则是我们自己的事情。上面的RegisterClassEx (&wndclassex)其实就是
    注册窗口
    CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, szAppName, 
    
                     TEXT ("WindowTitle"),
    
                     WS_OVERLAPPEDWINDOW,
    
                     CW_USEDEFAULT, 
    
                     CW_USEDEFAULT, 
    
                     CW_USEDEFAULT, 
    
                     CW_USEDEFAULT, 
    
                     NULL, 
    
                     NULL, 
    
                     hInstance,
    
                     NULL); 
    其实就是创建窗口,
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
    其实就是那个消息处理函数,只不过,这个消息处理函数不需要我们自己调用,当有消息的时候,Windows会自己调用这个函数来处理,我们只需要编写处理代码,但是,编写的代码不需要我们自己手动调用(这也许就是Callback函数的原因)。

    剩下的

    剩下的如果还有不懂的自己可以读msdn,比如,对CreateWindow不熟悉,可以直接在MSDN里面搜索CreateWindow,MSDN不仅会告诉你这个函数怎么用,还会告诉你消息循环是什么之类的,在此我就不仔细展开说明了。

    更多资料参考: Windows编程基础Windows API简明教程




    展开全文
  • C#Windows编程.pdf

    2017-06-01 16:06:03
    C#Windows编程开发文档
  • windows编程 推箱子游戏 可以当作例子程序学习windows编程
  • Windows编程大作业

    2012-07-13 14:22:19
    内含一个VC++编写的射击小游戏,有exe文件,可直接运行。并含有所有工程文件及源代码,可用VC++打开。
  • Windows编程循序渐进1-18.详细讲解Windows编程的原理及编程的实现,让你熟知Windows系统的构成,网络安全系统安全必看。
  • 用C语言进行Windows编程入门

    万次阅读 多人点赞 2019-08-19 11:13:21
    用C语言进行Windows编程入门 本文对一般教程或网上有的(如C语言语法等基础)不深入介绍,对初学者易造成疑惑误解或难以找到的内容进行较详尽的介绍。 学习C语言很久了,一直面对控制台应用程序(Win32 Console ...

    用C语言进行Windows编程入门

    本文对一般教程或网上有的(如C语言语法等基础)不深入介绍,对初学者易造成疑惑误解或难以找到的内容进行较详尽的介绍。

    学习C语言很久了,一直面对控制台应用程序(Win32 Console Application),没有漂亮的界面,是不是不爽呀。用C开发图形界面程序,有多种技术方案,本文希望用简单的例子,深入浅出的介绍一种方案——用C和SDK进行图形界面编程。

    图形界面又叫图形用户接口(GUI = Graphical User Interface),这样的程序的窗口包含最大化、最小化、关闭按钮,也包含菜单、单选框、图像等组成。

    本文主题是用C语言进行Windows编程。

    一般而言,基于 Windows 的编程方式有两种。一种是使用 Windows  的 API(Application Programming Interface ,应用程序编程接口)函数,通常用  C/C++ 语言按相应的程序框架进行编程。这些程序框架往往就程序应用提供相应的文档、范例和软件开发工具包(Software Development Kit ,SDK ),所以这种编程方式有时又称为  SDK 方式。另一种是使用“封装”方式,例如Visual C++ 的MFC方式,它是将 SDK  中的绝大多数函数、 数据等按 C++“类”的形式进行封装,并提供相应的应用程序框架和编程操作,简单地说,MFC 是对 API 的封装,隐藏了许多复杂的情节。

    C语言源代码文件的后缀是.c,C++语言源代码文件的后缀是.cpp。

    要进行Windows编程,需要先对Windows 有一个初步认识

    Windows 的 3 个主要子系统:内核(kernel),用户(user),GDI。

    内核 负责操作系统的传统工作:如 内存管理,文件输入/输出 以及任务管理等。

    用户 指的是用户界面,负责所有的窗口管理。

    GDI 就是图形设备接口,负责在屏幕或打印机上显示文本与图形。

    在 Windows 程序中,调用 Windows 函数与调用 C 语言的库函数没有什么两样。

    最主要的区别就是 C 语言库函数的机器代码会直接链接到你的程序代码中去,而 Windows 函数则是放到你的程序之外的 DLL 里。

    关于这些,作为初学者可以大体了解之,不必深究,随着深入学习实线,经过一段时间,才会有清晰的认识。

    下面开发实验,先使用Dev-C++开发环境,然后在再介绍VC++开发环境。

    所谓开发环境,也就是安装编译器或者 IDE(集成开发环境)。Windows 下的C语言 IDE 众多,本人使用的是 Dev C++5.11。Dev C++ 是一款免费开源的 C/C++ IDE,内嵌 GCC 编译器(Linux GCC 编译器的 Windows 移植版),是 NOI、NOIP 等比赛的指定工具Dev C++ 的优点是体积小(只有几十兆)、安装卸载方便、学习成本低,适合于初学者使用,缺点是调试功能弱,功能并不完善,不易用来开发商业级的软件。

    VC++开发环境,讲了两种VC6.0(VC++6.0)和Microsoft Visual C++ 2010 Express。

    微软公司的VC6.0(VC++6.0)完整版在Win7、Win10中存在兼容问题,故使用VC++ 6.0第三方修改版本,在网上也容易找到。微软新版 Visual Studio(简称 VS,包含VC++),如VS2010、VS2015等,目前最新版式VS2019,功能越来越全面,但越来越庞大。全国计算机等级考试组委会决定,2018年全国计算机二级 C、C++两个科目的应用软件由 Visual C++6.0 改为 Visual C++ 2010 学习版(即 Visual C++ 2010 Express)。综合看来,C语言初学者,可以考虑VC++6.0第三方修改的版本,或者使用Microsoft Visual C++ 2010 Express

    为了便于学习者,我给出开发工具(C_C++实验学习环境合集)的下载地址:C及C++实验学习环境合集.rar_c++实验环境-C++工具类资源-CSDN下载

    所提的三种工具,对每一种都先演示控制台程序,再演示带界面的Windows程序。

    不带图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)的程序是控制台程序(Console Application)。带界面的Windows程序(Windows Application),也称为GUI程序(GUI Application)。

    Dev-C++开发使用

    下面简要介绍一下Dev C++的安装:

    下载完成后,就像安装其他软件一样,点击安装包,出现如下图,语言先默认选择English,不要改变(安装完成后会选择中文简体的选项设置)。点ok!

     

    接下来的安装界面点“I agree”按钮,之后,一路默认点击“next”按钮,直至“finish”,此时出现:

    此时你就可以选择 中文简体。

    控制台程序以 main() 为入口函数,Windows程序以 WinMain() 为入口函数,动态链接库(DLL)以 DllMain() 为入口函数(请查看 动态链接库DLL教程),不同的入口函数决定了不同类型的程序。

    从main  到WinMain

        学习编程一般从简单的例子入手,例如一个 C 程序常有下列简单的框架代码:

        #include <stdio.h>

        int main()

        {

          printf("Hello World!\n");                  /*输出*/

          return 0;                               /*指定返回值*/

          }

    该程序已包括  C 程序中最常用的 #include  指令、必须的程序入口  main 函数、库函数 printf  调用和 return 语句。由于此程序是在早期的DOS(Disk Operating System ,磁盘操作系统)环境的字符模型下运行的,因而 printf 函数所输出的都是字符流,也就是说,它在屏幕上输出一行文本“ Hello World!  ”。基于 Windows的上述 C 程序代码框架肯定是有所不同的。等价的 Windows  程序可以写成:

           #include <windows.h>

           int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)

           {

             MessageBox (NULL, TEXT("Hello, World!"), TEXT("Hello"), 0) ;

             return 0 ;

           } 

    使用C和Win32 SDK开发Windows图形界面程序,运行时会显示黑乎乎的CMD窗口。原因是控制台(CONSOLE)程序,必然出现cmd窗口。如何不显示CMD窗口后面再说。

    该程序的 #include<windows.h> 就是像 C 语言的 #include<stdio.h> 一样重要的头文件。这些头文件定义了Windows的所有数据类型、函数原型、数据结构和符号常量,也就是说,所有的Windows API都在这些头文件中声明。

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow),就像 C 语言的 int main(void) 一样,都是程序的入口。C 程序的入口是 main,Windows 程序的入口是 WinMain。WinMain() 函数的原型为:

    int WINAPI WinMain(

        HINSTANCE hInstance,  // 当前窗口句柄

        HINSTANCE hPrevInstance,  // 前一个窗口句柄,Win32下为NULL(Win16留下的废物,目前已弃用)

        LPSTR lpCmdLine,  // 命令行参数

        int nCmdShow  // 窗口显示方式

    );

    WinMain的第一个参数叫做"实例句柄"(Instance Handle)。句柄就是一个数值,用它来标识某些东西。句柄是一个 4byte 的数值,可用来标识 窗口,按钮,图标,滚动条,输出设备,控件或者文件等等。

    第二个参数通常是 NULL。

    第三个参数是用来运行程序的命令行(CommandLine)。

    第四个参数是用来指明程序最初如何显示。(最大化到全屏,正常显示,最小化到任务栏)。

    MessageBox函数:

     函数原型:int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

    第一个参数通常是一个窗口句柄。

    第二个参数是在信息框里出现的文本字符串。

    第三个参数是标题栏上显示的文本字符串。

    第四个参数是以前缀MB_开头的一些常量组合。用以对话框中的按钮,图标等等。

    在输入代码时,一个好的习惯是创建了一个新程序后,在还未输入代码之前先将该程序保存到硬盘某个目录下,然后在程序的编辑过程中经常性地保存程序,以防止机器突然断电或者死机。要保存程序,只需从主菜单选择“File—〉Save”,此时会将程序重新保存到之前指定的目录下,如F:\temp ;如果想将程序保存到其他的硬盘路径下,可以选择“File—〉Save As…”

    【 插入一个话题,跳过这部分不影响理解本文:在Dev-C++上使用自己写头文件

    1.新建--源代码。注意:删去不必要的函数尤其是主函数,删去多余的定义,避免出现重复定义。数据类型用typedef定义。

    2.保存:在保存类型的下拉列表中选择Header Files

    3.写入函数,定义等

    4.别忘了保存

    5.引用:例:#include<路径\文件名.后缀>

    #include<C:\Users\lair\Desktop\hello.h>

    Dev C++安装第三方库(.h文件、头文件)

    注意兼容的才能使用。

    初学者容易被这些坑搞得心灰意冷。

    打开Dev-C++,点击工具栏,工具栏选择编译选项找到目录,C++包含文件,在C++包含文件中可以找到头文件添加的位置

    第三步  :电脑中找到这个位置,把第三方库(.h文件、头文件)复制粘贴过去:

    注意:不同系列编辑器(如TC++、DEV-C++、Visual C++)的头文件(.h文件、库)一般不兼容,使用时要注意。】

    如何不显示CMD窗口呢?参见下图:

    如此,可由Dev-C++自动生成一些代码——Windows图形界面框架代码 ,如下图:

    你可以将代码区的内容替换为:

    #include <windows.h>

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

    int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        PSTR szCmdLine,
        int iCmdShow
    ){
        static TCHAR szClassName[] = TEXT("HelloWin");  //窗口类名
        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= szClassName;  //窗口类名

        //注册窗口
        RegisterClass(&wndclass);

        /*****第②步:创建窗口(并让窗口显示出来)*****/
        hwnd = CreateWindow(
            szClassName,  //窗口类的名字
            TEXT("Welcome"),  //窗口标题(出现在标题栏)
            WS_OVERLAPPEDWINDOW,  //窗口风格
            CW_USEDEFAULT,  //初始化时x轴的位置
            CW_USEDEFAULT,  //初始化时y轴的位置
            500,  //窗口宽度
            300,  //窗口高度
            NULL,  //父窗口句柄
            NULL,  //窗口菜单句柄
            hInstance,  //当前窗口的句柄
            NULL  //不使用该值
        );

        //显示窗口
        ShowWindow (hwnd, iCmdShow);
        //更新(绘制)窗口
        UpdateWindow (hwnd);

        /**********第③步:消息循环**********/
        while( GetMessage(&msg, NULL, 0, 0) ){
            TranslateMessage(&msg);  //翻译消息
            DispatchMessage (&msg);  //分派消息
        }

        return msg.wParam;
    }

    /**********第④步:窗口过程**********/
    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("你好,Windows世界"),
                    -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) ;
    }

    编译运行结果如下:

    这是一个简单Windows程序,Dev C++同时自动生成了其它几个文件,参见下图:

    为了便于管理使用,建议为每个用Dev-C++建立C项目(Project:工程,项目)建立一个文件夹(目录)。

    这是一个用Dev-C++的C语言开发最简单的Windows应用程序,有点吓人,显然不像控制台应用程序那么简单,几行代码搞定。这显然不是短时间就学透头,本文的目的是说明C语言是可以开发Windows应用程序的。

    上面例子代码,是一个Windows程序的基本框架,从中可以了Windows应用程序文件主要包括如下部分:

    第①部分、注册窗口类

    第②部分、根据窗口类来创建窗口

    第③部分、进入无休止的消息循环

    第④部分、编写窗口过程

    大部分代码一样,直接拿来当作代码模板用,主要不同是在第④部分。

    下面是一个像样点的程序,同时作为上述文字的印证:

    #include <windows.h>

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

    HINSTANCE hInst;   //HINSTANCE 是“句柄型”数据类型。---------

    int WINAPI WinMain(

        HINSTANCE hInstance,

        HINSTANCE hPrevInstance,

        PSTR szCmdLine,

        int iCmdShow

    ){

        static TCHAR szClassName[] = TEXT("Win32Demo");  //窗口类名

        HWND     hwnd;  //窗口句柄

        MSG      msg;  //消息

        WNDCLASS wndclass;  //窗口类

        hInst = hInstance;   //------------

        /**********第①步:注册窗口类**********/

        //为窗口类的各个字段赋值

        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= szClassName;  //窗口类名

        //注册窗口

        RegisterClass(&wndclass);

        /*****第②步:创建窗口(并让窗口显示出来)*****/

        hwnd = CreateWindow(

            szClassName,  //窗口名字

            TEXT("Welcome"),  //窗口标题(出现在标题栏)

            WS_OVERLAPPEDWINDOW,  //窗口风格

            CW_USEDEFAULT,  //初始化时x轴的位置

            CW_USEDEFAULT,  //初始化时y轴的位置

            500,  //窗口宽度

            300,  //窗口高度

            NULL,  //父窗口句柄

            NULL,  //窗口菜单句柄

            hInstance,  //当前窗口的句柄

            NULL  //不使用该值

        );

        //显示窗口

        ShowWindow (hwnd, iCmdShow);

        //更新(绘制)窗口

        UpdateWindow (hwnd);

        /**********第③步:消息循环**********/

        while( GetMessage(&msg, NULL, 0, 0) ){

            TranslateMessage(&msg);  //翻译消息

            DispatchMessage (&msg);  //分派消息

        }

        return msg.wParam;

    }

     /**********第④步:消息循环**********/

     //------------

    LRESULT CALLBACK WndProc(

        HWND hWnd,

        UINT message,

        WPARAM wParam,

        LPARAM lParam

    ){

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hdc;

        static HFONT hFont;

        static HWND hBtn;

        static HWND hStatic;

        switch (message){

            case  WM_CREATE:

                //创建逻辑字体

                hFont = CreateFont(

                    -15/*高度*/, -7.5/*宽度*/, 0, 0, 400 /*一般这个值设为400*/,

                    FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,

                    DEFAULT_CHARSET,  //使用默认字符集

                    OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,  //这行参数不用管

                    DEFAULT_QUALITY,  //默认输出质量

                    FF_DONTCARE,  //不指定字体族*/

                    TEXT("微软雅黑")  //字体名

                );

                //创建静态文本控件

                hStatic = CreateWindow(

                    TEXT("static"),  //静态文本框的类名

                    TEXT("你好,欢迎来到C语言中文网"),  //控件的文本

                    WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/,

                    30 /*X坐标*/, 20/*Y坐标*/, 150/*宽度*/, 80/*高度*/, hWnd/*父窗口句柄*/,

                    (HMENU)1,  //为控件指定一个唯一标识符

                    hInst,  //当前实例句柄

                    NULL

                );

                //创建按钮控件

                hBtn = CreateWindow(

                    TEXT("button"), //按钮控件的类名

                    TEXT("点击这里试试"),

                    WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,

                    30 /*X坐标*/, 110 /*Y坐标*/, 150 /*宽度*/, 50/*高度*/,

                    hWnd, (HMENU)2 /*控件唯一标识符*/, hInst, NULL

                );

                SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont,NULL);//设置文本框字体

                SendMessage(hBtn, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体

                break;

            case WM_COMMAND:

                wmId    = LOWORD(wParam);

                wmEvent = HIWORD(wParam);

                switch (wmId){

                    case 2:  //按下按钮

                        //更改文本框的内容

                        SetWindowText(hStatic, TEXT("你点击了下面的按钮"));

                        break;

                    default:

                        //不处理的消息一定要交给 DefWindowProc 处理。

                        return DefWindowProc(hWnd, message, wParam, lParam);

                }

                break;

            case WM_PAINT:

                hdc = BeginPaint(hWnd, &ps);

                // TODO:  在此添加任意绘图代码...

                EndPaint(hWnd, &ps);

                break;

            case WM_DESTROY:

                //请做好善后工作

                DeleteObject(hFont);

                PostQuitMessage(0);

                break;

            default:

                return DefWindowProc(hWnd, message, wParam, lParam);

        }

        return 0;

    }

    运行结果如下:

    现在介绍VC++6.0的使用

    先简要介绍VC6.0的使用, 微软原版的 VC6.0 已经不容易找到,网上提供的都是经过第三方修改的版本,删除了一些使用不到的功能,增强了和win10的兼容性。

    打开VC6.0,按下图所示操作新建工程(Project:工程,项目)

    提示:选择“An empty project”项将生成一个空的工程,工程内不包括任何东西。选择“A simple application”项将生成包含一个空的main函数和一个空的头文件的工程。选“A "Hello World!" application”项与选“A simple application”项没有什么本质的区别,只是包含有显示出“Hello World!”字符串的输出语句。选择“An application that supports MFC”项的话,可以利用VC6.0所提供的类库来进行编程。

    点击“Finish”按钮完成工程的创建。再按下图所示建立C源文件:

    提示:微软的VC++(Visual C++)是在C语言的基础上进行的扩展,C++已经包含了C语言的所有内容,所以大部分的 IDE 只有创建C++文件的选项,没有创建C语言文件的选项。但是这并不影响使用,我们在填写源文件名称时把后缀改为.c即可,编译器会根据源文件的后缀来判断代码的种类。

    再单击工具栏上的保存 按钮,在工作空间中可以看到刚才创建的工程和源文件,如下图所示:

    现在可以按下图所示编译并运行代码:

    注意:编译生成的 .exe 文件在工程(Project)目录下的Debug文件夹内。打开看到有一个Debug文件夹,进入可以看到 cDemo.exe。除了 hello.c,还会看到很多其他文件,它们是VC6.0自动创建的,用来支持当前工程,如下图:

    其中,dsp文件:DeveloperStudio Project,是VC6.0的工程文件,用来保存当前工程的信息,例如编译参数、包含的源文件等,不建议手动改动。当需要打开一个已存在的工程时,打开该文件即可

    上面介绍的是用VC++6.0建立Win32 Console Application,即win32控制台应用程序,没有漂亮的界面,运行时会显示黑乎乎的CMD窗口。Win32 Application(Win32应用程序) 是普通的常见的窗口应用程序,是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。两者有明显的不同:

    控制台应用程序:
    入口函数为main,一般写C和C++计算类代码常用,如计算水仙花数、冒泡排序等一类程序。程序运行结果以命令行窗口显示。
    window应用程序:
    入口函数为WinMain,一般用于写桌面应用程序,强大之处在于能够作出用户操作界面,并与操作系统配合捕获并响应用户的各种操作,如鼠标移动、按钮形状及点击等基本上要用win32 api自己写代码实现,比较繁杂。

    顺便提及,MFC(微软基础类库)应用程序,也有界面,饭界面里的控件不需要自己去实现了,常用的控件都已经在MFC库内写好,直接拖动即可。

    只强调实用与开发效率,用MFC;强调用户体验与软件细节及灵活性,使用WIN32。MFC可以实现的,WIN32都可以实现,反之不可。

    VC++ 6.0可创建的工程类型还有一些,说实话我也知道的不多,就不提了。

    为了切合本文主题,下面介绍 用VC++ 6.0建立Win32 Application(Win32应用程序)。

    首先创建项目,选择File->New,出现如下对话框,并参见下图设置:

    添加C源文件,选择File->New,出现如下对话框,并参见下图设置

    输入如下代码(这段代码在本文的前面已出现过):

    #include <windows.h>

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

    HINSTANCE hInst;   //HINSTANCE 是“句柄型”数据类型。---------

    int WINAPI WinMain(

        HINSTANCE hInstance,

        HINSTANCE hPrevInstance,

        PSTR szCmdLine,

        int iCmdShow

    ){

        static TCHAR szClassName[] = TEXT("Win32Demo");  //窗口类名

        HWND     hwnd;  //窗口句柄

        MSG      msg;  //消息

        WNDCLASS wndclass;  //窗口类

        hInst = hInstance;   //------------

        /**********第①步:注册窗口类**********/

        //为窗口类的各个字段赋值

        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= szClassName;  //窗口类名

        //注册窗口

        RegisterClass(&wndclass);

        /*****第②步:创建窗口(并让窗口显示出来)*****/

        hwnd = CreateWindow(

            szClassName,  //窗口名字

            TEXT("Welcome"),  //窗口标题(出现在标题栏)

            WS_OVERLAPPEDWINDOW,  //窗口风格

            CW_USEDEFAULT,  //初始化时x轴的位置

            CW_USEDEFAULT,  //初始化时y轴的位置

            500,  //窗口宽度

            300,  //窗口高度

            NULL,  //父窗口句柄

            NULL,  //窗口菜单句柄

            hInstance,  //当前窗口的句柄

            NULL  //不使用该值

        );

        //显示窗口

        ShowWindow (hwnd, iCmdShow);

        //更新(绘制)窗口

        UpdateWindow (hwnd);

        /**********第③步:消息循环**********/

        while( GetMessage(&msg, NULL, 0, 0) ){

            TranslateMessage(&msg);  //翻译消息

            DispatchMessage (&msg);  //分派消息

        }

        return msg.wParam;

    }

     /**********第④步:消息循环**********/

     //------------

    LRESULT CALLBACK WndProc(

        HWND hWnd,

        UINT message,

        WPARAM wParam,

        LPARAM lParam

    ){

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hdc;

        static HFONT hFont;

        static HWND hBtn;

        static HWND hStatic;

        switch (message){

            case  WM_CREATE:

                //创建逻辑字体

                hFont = CreateFont(

                    -15/*高度*/, -7.5/*宽度*/, 0, 0, 400 /*一般这个值设为400*/,

                    FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,

                    DEFAULT_CHARSET,  //使用默认字符集

                    OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,  //这行参数不用管

                    DEFAULT_QUALITY,  //默认输出质量

                    FF_DONTCARE,  //不指定字体族*/

                    TEXT("微软雅黑")  //字体名

                );

                //创建静态文本控件

                hStatic = CreateWindow(

                    TEXT("static"),  //静态文本框的类名

                    TEXT("你好,欢迎来到C语言中文网"),  //控件的文本

                    WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/,

                    30 /*X坐标*/, 20/*Y坐标*/, 150/*宽度*/, 80/*高度*/, hWnd/*父窗口句柄*/,

                    (HMENU)1,  //为控件指定一个唯一标识符

                    hInst,  //当前实例句柄

                    NULL

                );

                //创建按钮控件

                hBtn = CreateWindow(

                    TEXT("button"), //按钮控件的类名

                    TEXT("点击这里试试"),

                    WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,

                    30 /*X坐标*/, 110 /*Y坐标*/, 150 /*宽度*/, 50/*高度*/,

                    hWnd, (HMENU)2 /*控件唯一标识符*/, hInst, NULL

                );

                SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont,NULL);//设置文本框字体

                SendMessage(hBtn, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体

                break;

            case WM_COMMAND:

                wmId    = LOWORD(wParam);

                wmEvent = HIWORD(wParam);

                switch (wmId){

                    case 2:  //按下按钮

                        //更改文本框的内容

                        SetWindowText(hStatic, TEXT("你点击了下面的按钮"));

                        break;

                    default:

                        //不处理的消息一定要交给 DefWindowProc 处理。

                        return DefWindowProc(hWnd, message, wParam, lParam);

                }

                break;

            case WM_PAINT:

                hdc = BeginPaint(hWnd, &ps);

                // TODO:  在此添加任意绘图代码...

                EndPaint(hWnd, &ps);

                break;

            case WM_DESTROY:

                //请做好善后工作

                DeleteObject(hFont);

                PostQuitMessage(0);

                break;

            default:

                return DefWindowProc(hWnd, message, wParam, lParam);

        }

        return 0;

    }

    注意,这里是用VC++ 6.0的C语言进行Windows编程, VC++ 6.0功能很多,如可以用C++和MFC(微软基础类库)进行Windows编程,并且可创建的工程类型很多,为符合本文主题未提及。

    Microsoft Visual C++ 2010 Express的使用

    打开 Microsoft Visual C++ 2010 Express,在菜单栏中选择“文件 --> 新建 --> 项目,参见下图:

    在“新建项目”对话框中:选择“Win32控制台应用程序”,填写好项目名称(如cDemo),选择好存储路径,点击“确定”按钮

    点击“确定”按钮后会弹“欢迎使用 Win32 应用程序向导”对话框

    点击下一步”按钮,弹出新的“应用程序设置”对话框

    先取消“预编译头”,再勾选“空项目”,然后点击“完成”按钮

    现在,就可以添加源文件参见下图:

    在“源文件”处右击鼠标,在弹出菜单中选择“添加 -> 新建项”出现“添加新项”对话框

    在“代码”分类中选择C++文件(.cpp),填写文件名(注意文件名后缀改为.c),点击“添加”按钮就添加了一个新的源文件

    输入如下代码

    #include <stdio.h>

    #include <stdlib.h>

    int main()

    {

        puts("你好!世界");

    system("pause");  //此句的作用就是让程序暂停一下

        return 0;

    }

    编译运行,参见下图:

    VC++2010开发的用应用程所在文件夹(目录)情况,如下图所示:

    其中:

    vcxproj是Visual C++ 2010(VC2010)的工程(Project:工程,项目)文件的后缀。 .vcxproj文件是自动生成生成的工程文件, 它包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。 对于工程来说,是非常重要的。这个文件在转移工程时,不要删除。我们打开别人的项目,一些设置已经保存于此,如果只是拷贝代码文件,这些信息就不见了,就可能导致工程无法正常打开编译运行。

    sln是解决方案配置(solution)文件的后缀,Visual Studio开发套装进入.net时代后,使用解决方案文件(后缀为sln的文件)表示一个项目组,他通常包含一个项目中所有的工程文件信息。

    打开已存在的VC工程时,可以打开vcxproj文件或sln文件。打开sln文件是可以启动工程的,那是因为sln文件有工程文件的入口,sln是以解决方案的方式启动,打开vcxproj文件,则是以工程的名义启动的。

    顺便说明:关于MS VC++的工程文件的后缀

        vc6的工程文件是.dsp

        vc2002-2008工程文件是vcproj

        vc2010之后是vcxproj

    上面介绍的是用VC2010建立Win32 Console Application,即win32控制台应用程序。

    下面简要介绍用VC2010 建立Win32 Application(Win32应用程序):

    在菜单栏中选择“文件 --> 新建 --> 项目

    在“新建项目”对话框中:选择“Win32项目”,填写好项目名称(如winAppDemo),选择好存储路径,点击“确定”按钮

    点击“确定”按钮后会弹“欢迎使用 Win32 应用程序向导”对话框

    点击下一步”按钮,弹出新的“应用程序设置”对话框

    勾选“空项目”,然后点击“完成”按钮

    现在,就可以添加源文件

    在“源文件”处右击鼠标,在弹出菜单中选择“添加 -> 新建项”出现“添加新项”对话框

    在“代码”分类中选择C++文件(.cpp),填写文件名(注意文件名后缀改为.c),点击“添加”按钮就添加了一个新的源文件

    将前面“(这段代码在本文的前面已出现过)”部分下的代码输入,编译运行,参见下图:

    特别说明,所附代码肯定运行通过。断断续续写了几天,就到这儿吧。

    展开全文
  • Windows 编程循序渐进光盘源码.rar Windows 编程循序渐进光盘源码.rar
  • 《从汇编语言到Windows内核编程》这是一本关于Windows内核编程的书籍
  • windows编程实验报告

    2015-04-20 13:09:01
    windows编程实验报告windows编程windows编程实验报告验报告
  • Windows编程入门:Windows程序设计1小时入门教程 __
  • windows编程学习感悟

    千次阅读 2020-08-23 17:54:37
    windows编程学习感悟开始学习系统设计安全方向生态未来推荐 ps:这是一个感悟blog,为想学windows编程的提供一点方向,也是对自己看了一个暑假的windows书籍的一个小总结。 开始 先说一下博主的知识积累,博主是高三...


    ps:这是一个感悟blog,为想学windows编程的提供一点方向,也是对自己看了一个暑假的windows书籍的一个小总结。

    开始

    	先说一下博主的知识积累,博主是高三因为爱好学的linux,从鸟哥的linux私房菜入门
    基本能熟悉使用各种linux发行版,也在centos6上编过几个小程序,网络,java(做过游
    戏),c,c++也都略懂点,现在是个大一学生,那为啥好好的linux不搞了,开始搞windows
    了呐,这和博主的爱好有关,博主比较喜欢安全,所以喜欢研究木马啊,蠕虫啊啥的
    但是linux和windows的架构区别有很多不同,而比如kali上的metasploit的木马生成等
    都是不懂本质所以开始了windows的入坑之路,好了,我们开始进入正题
    

    学习

    	首先给想学习windows的同学打一一剂强心针,如果你想学计算机,学好windows
    肯定是有前途的,你至少能得到底下三个方面的知识1. 系统设计 2.安全知识 3.生态
    未来,别看linux现在炒的很火,但windows的用户基数在哪放着呐,接下来我就这
    三个方向给大家说一下,本人也是初学,说的不好请大家多多指正。
    

    系统设计

    	计算机系统无非就是三大块,进程,内存管理和图形界面。(堆栈哪些属于编程
    语言)windows的图形界面就不用我说了吧,占有量第一不是开玩笑的,质量相当高
    有很好的设计理念,内存管理是安全的第一道大关,windows的安全性在操作系统
    领域是相当好的,有人会说,那怎么windows天天闹病毒,闹木马,你要想想全球有
    多少人在天天给windows挖掘漏洞,懂的人都懂。有位大牛说过,在计算机领域,只有
    没人用的系统和天天被骂的系统,大家自己想吧。进程这一块,linux的posix模型比较
    简单很适合学习,但很难写出好用的东西,不够先进,写字符,计算那一块还可以,
    图形就差远了,windows这一块做的很好。当然,我夸了windows很多,也不是说win
    dows就是完美的,windows的缺点就是很复杂,而且为了保持兼容有很多臃肿的东西
    ,linux则没有这个毛病,所以说linux很适合理论,但这是不可避免的,毕竟windows
    是个商业系统为了功能性,和保持兼容,这些都是无法减少的。至于硬件,linux和
    windows差不多,我以后有时间再写
    

    安全方向

    	这是今天的主题,也是我最初学习windows的原因,我也是从小白一路上来的,刚
    开始也是在网上复制别人的脚本恶搞,但慢慢的不满足了,想要学习更深的东西,于
    是接触了kali,就那个专业搞渗透的linux系统发行版,在哪期间我学了神器metasploit
    ,wireshark,nmap等等,也看了很多书,如metasploit渗透测试魔鬼训练营等等,但
    慢慢你会发现用工具局限性太大了,你要完全按照书上的设置去搞,成功率还不高
    而且遇到了问题发现自己基础知识的欠缺很严重,根本无法彻底的解决。于是我就
    开始转向了基础的学习。
    	学了一段时间后,发现了自己以前走的都是弯路,真的。感觉以前自己太依赖工具
    了,工具只不过是个辅助而已,对于真正的大神来说,即使没有工具,自己也能写出
    来,我不是说工具不重要,只是哪一个才是本质,比如修车师傅和修车工具,修车师
    傅如果没有扳手的确很难干活,但他可以用别的东西去代替。而且随着学习,你还能
    开阔视野,以前只知道盗关键文件,如/etc/password.txt(linux上的)密码文件但是
    你在windows上这是行不通的,一有加密,即便你要用彩虹表爆破,那也很费时间,你
    会学到一些经典方法,键盘记录,界面欺骗,等等。虽然现在没有那么容易了,但衍
    生出来的手段也基本从这里面出来的,而这些你肯定要会windows编程,(是win32)
    如界面欺骗,界面你总要自己写吧。而且你会了解很多windows用户不知道的东西,
    知识不对等的好处就不用我说了吧。还有很多,就不一一赘述了
    

    生态未来

    	因为win32编程是com的基础,你学会了win32,学com,ump不敢说三天速成,但
    比别人快一倍肯定没问题,我估计我还说少了,然后你再看工具类的书就是水到渠成
    你知道该看啥,一本几百页的书几天就能看完,其实很多时候程序员都是这样的,
    程序员哪有时间天天看那么厚的书,还要写程序,基础的书精读,很多工具书都是
    查读,但你知识储备不够就是另一个故事了。
    	还有别的,我就不说了。自己看吧,说太多你们也记不住。
    

    推荐

    	写了这么多,很多人想学有可能不知道看什么书,简单推荐两本。更多的可以自行
    百度。c/c++:<<c++ primer plus第六版>>,windows:《windows程序设计第五版》
    别看第六版,第六版是讲c#的,还有《windows核心编程第五版》这些都是要精读
    今天的blog就写到这了,该吃饭看书,兄弟们,下次见。
    
    展开全文
  • windows 编程入门资料

    千次阅读 2018-05-30 13:48:03
    资料1 ...《Windows高级编程指南》是1999年清华大学出版社出版的图书,译者是王书洪 / 刘光明,目前出已经出第三版。 第0章 绪论  0.1 关于应用程序范例  0.1.1 用c语言编写程序  0.1.2 message ...

    资料1

    《高级WINDOWS程序设计》中看到作者提到CreateFile()可以操作很多设备。

    资料2

    <<Windows高级编程指南>>
    《Windows高级编程指南》是1999年清华大学出版社出版的图书,译者是王书洪 / 刘光明,目前出已经出第三版。
    第0章 绪论
      0.1 关于应用程序范例
      0.1.1 用c语言编写程序
      0.1.2 message cracker macros(消息拆析宏)
      0.1.3 有关16位windows编程的知识
      0.1.4 在windows 95下运行应用程序范例
      0.1.5 不相关代码
      0.1.6 范例应用程序的独立性
      0.1.7 strict编译
      0.1.8 错误检查
      0.1.9 没有错误
      0.1.10 测试平台和环境
      0.1.11 unicode
      0.2 安装范例程序
      0.2.1 配套的cd-rom盘
      第1章 win 32 api和支持它的平台
      1.1 梦想一下:win 32 api
      1.2 win 32s
      1.3 windows nt
      1.4 windows 95
    .1.5 windows ce
      1.6 现实:win 32 api
      第2章 内核对象
      2.1 什么是内核对象
      2.1.1 使用计数
      2.1.2 安全
      2.2 进程的内核对象句柄表
      2.2.1 创建内核对象
      2.2.2 关闭内核对象
      2.3 在进程间共享内核对象
      2.3.1 对象句柄继承
      2.3.2 改变句柄标志
      2.3.3 命名对象
      2.3.4 复制对象句柄
      第3章 进程
      3.1 编写第一个win 32应用程序
      3.1.1 进程的实例句柄
      3.1.2 进程的前一个实例的句柄
      3.1.3 进程的命令行
      3.1.4 进程的环境变量
      3.1.5 进程的错误模式
      3.1.6 进程的当前驱动器和目录
      3.1.7 系统版本
      3.2 createprocess函数
      3.2.1 lpszapplicationname和lpszcommandline
      3.2.2 lpsaprocess,lpsathread和finherithandles
      3.2.3 fdwcreate
      3.2.4 lpvenvironment
      3.2.5 lpszcurdir
      3.2.6 lpsistartinfo
      3.2.7 lppiprocinfo
      3.3 终止进程
      3.3.1 exitprocess函数
      3.3.2 terminate process函数
      3.3.3 进程中的所有线程结束了
      3.3.4 进程终结时发生的事情
      3.4 子进程
      3.4.1 运行分离的子进程
      第4章 线程
      4.1 何时创建线程
      4.2 何时不用创建线程
      4.3 编写第一个线程函数
      4.3.1 线程的栈
      4.3.2 线程的context结构
      4.3.3 线程的执行时间
      4.4 createthread函数
      4.4.1 lpsa
      4.4.2 cbstack
      4.4.3 lpstartaddr和lpvthreadparm
      4.4.4 fdwcreate
      4.4.5 lpidthread
      4.5 终止线程
      4.5.1 exit thread函数
      4.5.2 terminatethread函数
      4.5.3 进程终结
      4.5.4 线程终结时的情况
      4.6 识别自己的身份
      4.7 系统如何调度线程
      4.7.1 使用win 32 api怎样赋优先级
      4.7.2 改变进程的优先级类
      4.7.3 设定线程的相对优先级
      4.7.4 挂起和恢复线程
      4.8 系统内部情况
      4.9 进程、线程和c运行时库
      4.9.1 应避免使用的c运行时函数
      第5章 win 32内存结构
      5.1 虚地址空间
      5.1.1 windows 95如何划分进程的地址空间
      5.1.2 windows nt如何划分进程的地址空间
      5.2 地址空间中的区域
      5.3 在区域内提交物理存储
      5.4 物理存储
      5.4.1 不包含在页面文件中的物理存储
      5.5 保护属性
      5.5.1 写拷贝访问
      5.5.2 特殊的访问保护属性标志
      5.6 小结
      5.6.1 区域的内部
      5.7 windows 95的地址空间的不同
      第6章 虚拟内存
      6.1 系统信息
      6.1.1 系统信息范例应用程序
      6.2 虚拟内存状态
      6.2.1 虚拟内存状态范例应用程序
      6.3 确定地址空间的状态
      6.3.1 vmquery函数
      6.3.2 虚拟内存映射范例应用程序
      第7章 在应用程序中使用虚拟内存
      7.1 在地址空间中保留区域
      7.2 在保留区域中提交存储
      7.3 同时保留区域和提交物理存储
      7.4 何时提交物理存储
      7.5 释放物理存储和释放区域
      7.5.1 何时释放物理存储
      7.5.2 虚拟内存分配范例应用程序
      7.6 修改保护属性
      7.7 在ram中锁定物理存储
      7.8 重设物理存储的内容
      7.9 线程的栈
      7.9.1 windows 95下的线程的栈
      7.9.2 c运行时库的栈检查函数
      第8章 内存映射文件
      8.1 内存映射exe和dll
      8.1.1 不被exe或dll的多个实例共享的静态数据
      8.2 内存映射数据文件
      8.2.1 方法1:一个文件,一个缓冲区
      8.2.2 方法2:两个文件,一个缓冲区
      8.2.3 方法3:一个文件,两个缓冲区
      8.2.4 方法4:一个文件,零个缓冲区
      8.3 使用内存映射文件
      8.3.11步:创建或打开文件内核对象
      8.3.22步:创建文件映射内核对象
      8.3.33步:将文件数据映射入进程地址空间
      8.3.44步:从进程地址空间中解除文件数据映射
      8.3.55步和第6步:关闭文件映射对象和文件对象
      8.3.6 用内存映射文件处理大文件
      8.4 内存映射文件和一致性
      8.4.1 文件倒置范例应用程序
      8.4.2 指定内存映射文件的基本地址
      8.5 内存映射文件和win 32实现
      8.5.1 使用内存映射文件在进程间共享数据
      8.5.2 由页面文件支持的内存映射文件
      8.5.3 内存映射文件共享范例应用程序
      8.6 稀疏提交的内存映射文件
      第9章 堆
      9.1 什么是win 32堆
      9.1.1 进程的缺省堆
      9.1.2 创建自己的win 32堆
      9.1.3 创建win 32堆
      9.1.4 释放win 32堆
      9.1.5 在c++时使用堆
      9.1.6 其他一些堆函数
      9.2 16位windows堆函数
      第10章 线程同步
      10.1 线程同步概述
      10.2 最坏的事情
      10.2.1 创建监临界区
      10.2.2 使用临界区
      10.2.3 临界区范例应用程序
      10.3 用内核对象同步线程
      10.3.1 互斥量
      10.3.2 互斥量范例应用程序
      10.3.3 信号量
      10.3.4 超市范例应用程序
      10.3.5 事件
      10.3.6 bucket of balls范例应用程序
      10.3.7 swmrg复合同步对象
      10.3.8 bucket范例源代码
      10.3.9 document statistics范例应用程序
      10.3.10 可等的计时器
      10.4 线程挂起
      10.4.1 sleep
      10.4.2 异步文件i/o
      10.4.3 waitforlnputidle
      10.4.4 msgwaitformultipleobjects
      10.4.5 waitfordebugevent
      10.4.6 signalobjectandwait
      10.4.7 interlocked函数族
      第11章 窗口消息和异步输入
      11.1 多任务
      11.1.1 抢先式调度
      11.2 线程队列和消息处理
      11.2.1 win 32消息队列结构
      11.2.2 向线程的消息队列投递消息
      11.2.3 发送消息给窗口
      11.2.4 唤醒线程
      11.3 用消息发送数据
      11.3.1 copydata范例应用程序
      11.4 非序列化输入
      11.4.1 输入如何被非序列化
      11.5 局部输入状态
      11.5.1 键盘输入和焦点
      11.5.2 鼠标光标管理
      11.5.3 局部输入状态实验范例应用程序
      第12章 动态链接库
      12.1 创建动态链接
      12.1.1 映射dll到进程的地址空间
      12.2 dll的进入/退出函数
      12.2.1 dll_process_attach
      12.2.2 dll_process_datach
      12.2.3 dll_thread_attach
      12.2.4 dll_thread_detach
      12.2.5 系统如何序列化对dllmain的调用
      12.2.6 dllmain和c运行时库
      12.3 从dll中输出函数和变量
      12.4 从dll中引入函数和变量
      12.4.1 dll的头文件
      12.5 创建dll供非visual c++工具使用
      12.6 在exe或dll映射之间共享数据
      12.6.1 exe或dll中的节
      12.6.2 moduse范例应用程序
      12.6.3 multinst范例应用程序
      第13章 线程局部存储
      13.1 动态线程局部存储
      13.1.1 使用动态线程局部存储
      13.1.2 动态线程局部存储范例应用程序
      13.2 静态线程局部存储
      13.2.1 静态线程局部存储范例应用程序
      第14章 文件系统
      14.1 win 32的文件名约定
      14.2 系统和卷操作
      14.2.1 得到卷的特定信息
      14.2.2 磁盘信息查看范例应用程序
      14.3 目录操作
      14.3.1 得到当前目录
      14.3.2 改变当前目录
      14.3.3 得到系统目录
      14.3.4 得到windows目录
      14.3.5 创建和删除目录
      14.4 拷贝、删除、移动和重命名文件
      14.4.1 拷贝文件
      14.4.2 删除文件
      14.4.3 移动文件
      14.4.4 重命名文件
      14.5 查找文件
      14.5.1 目录漫游范例应用程序
      14.6 文件系统变化通知
      14.6.1 文件变化范例应用程序
      14.7 操纵文件属性
      14.7.1 可执行文件类型
      14.7.2 文件属性
      14.7.3 文件大小
      14.7.4 文件时间戳
      14.8 创建临时文件
      第15章 设备i/o
      15.1 打开和关闭设备
      15.1.1 createfile
      15.2 使用文件设备
      15.2.1 定位文件指针
      15.2.2 设置文件尾
      15.2.3 加锁和解锁文件的区域
      15.3 进行同步i/o
      15.3.1 向设备强制刷新数据
      15.4 进行异步i/o
      15.5 使设备内核对象有信号
      15.6 使事件内核对象有信号
      15.7 告警i/o
      15.7.1 告警i/o范例应用程序
      15.8 i/o完成端口
      15.8.1 模拟完成i/o请求
      15.8.2 i/o完成端口范例应用程序
      15.9 判断i/o请求是否完成
      15.10 取消未完成的i/o请求
      第16章 结构化异常处理
      16.1 终止处理程序
      16.1.1 理解终止处理程序
      16.1.2 关于finally块的一些注解
      16.1.3 seh终止范例应用程序
      16.2 异常过滤程序和异常处理程序
      16.2.1 理解异常过滤程序和异常处理程序
      16.2.2 exception_execute_handler
      16.2.3 exception_continue_execution
      16.2.4 exception_continue_search
      16.2.5 全局展开
      16.2.6 停止全避展开
      16.2.7 关于异常过滤程序的进一步讨论
      16.2.8 getexceptioninformation
      16.2.9 seh异常范例应用程序
      16.2.10 seh sum范例应用程序
      16.3 软件异常
      16.3.1 seh软件异常范例应用程序
      16.3.2 未处理的异常
      16.3.3 没有附属调试器的未和的异常
      16.3.4 不显示异常消息框
      16.3.5 自己调用unhandledexceptionfilter
      16.3.6 windows nt的未处理的内核模式异常
      第17unicode
      17.1 字符集
      17.1.1 单字节和双字节字符集
      17.1.2 unicode:宽字节字符集
      17.2 为什么要使用unicode
      17.3 如何编写unicode源代码
      17.3.1 windows nt和unicode
      17.3.2 windows 95unicode
      17.3.3 c运行时库对unicode的支持
      17.3.4 win 32定义的unicode数据类型
      17.3.5 win 32中的unicodeansi宏数
      17.4 使你的程序能识别ansiunicode
      17.4.1 win 32中的字符串函数
      17.4.2 资源
      17.4.3 文本
      17.4.4unicodeansi之间转换字符串
      17.4.5 windows nt的窗口类和过程
      第18章 打开进程边界
      18.1 为什么要打开进程边界:一个例子
      18.2 使用注册表来注入dll
      18.3 使用windows钩来注入dll
      18.3.1 desktop item position savev工具
      18.4 使用远程线程注入dll
      18.4.1 如何装入一个dll
      18.5 影响其他进程的win 32函数
      18.5.1 createremotethread
      18.5.2 getthreadcontext和setthreadcontext
      18.5.3 virtualqueryex和virtualprotectex
      18.5.4 virtualallocex和virtualfreeex
      18.5.5 readprocessmemory和writeprocessmemory
      18.6 创建一个函数向任意进程的地址空间注入dll
      18.6.1 版本0:为什么显然的方法不能工作
      18.6.2 版本1:手编的机器语言
      18.6.3 版本2:allocprocessmemory和createremore thread
      18.6.4 procmem工具函数
      18.6.5 injectlib函数
      18.7 测试injectlib函数
      18.7.1 注入库范例应用程序
      18.7.2 映象遍历动态链接库
      18.8 小结
      附录 a fibers
      a.1 例程:计算器应用程序
      附录 b message crackerc
      b.1 message crackers
      b.2 child control宏
      b.3 api宏
      附录 c 编程环境
      c.1 cmnhdr.h头文件
      c.1.1 4级警告
      c.1.1 windows版本
      c.1.2 strict宏
      c.1.3 cpu prtability宏
      c.1.4 标准编码(unicode)
      c.1.5 chdimof宏
      c.1.6 chbegintheadex宏
      c.1.7 chassert 宏和chverify宏
      c.1.8 chhandle_dlgmsg宏
      c.1.9 chassert宏和chverify宏
      c.1.10 chmb宏
      c.1.11 chinitstruct宏
      c.1.12 chsetdlgicons宏
      c.1.13 chwarnifunicodeunderwin 95宏
      c.1.14 pragma message helper宏
      c.1.15 链接指令
      c.2 在源文件中不能对项目进行设置

    资料3

    当初学习windows程序设计的适合,大家都推荐CharlesPetzold写的Windows程序设计,就买了一本。
    书买过之后,看得很费劲。看了好几天,都不知道windows程序该怎么写。后来在网上看到,杨力祥的windows高级程序设计,就下载看看吧。不看不知道,一看吓一跳,可以这么说的。

    老师把windows程序设计的原理讲的很透彻,给我一种醍醐灌顶的感觉。
    如果你准备学习这本书,看不懂的时候,一定要看看杨力祥老师的windows高级程序设计这套课程。

    资料4

    https://bbs.csdn.net/topics/390411878

    这个是我以前学习的时候使用的资源,并且感觉确实是非常不错的资源.

    这个教程呢是中科院的高级程序设计 杨力祥讲授的课程

    我知道你们看到这里就会想到.论坛应该有这个学习资源了.但是呢.不够全面

    中科院 Windows高级程序开发 30 课 由杨力祥教授讲解

    课程非常的有趣 .主要讲解的是 用 Win32 开发一个 扫雷.和用 MFC 开发一个股票实时软件

    讲的非常的详细.包括Windows 消息循环 操作系统 .个人感觉还是挺生动的.

    不过这个课程是又门槛的.主要是要懂一些 C 语言 和 C++的基础…

    我建议大家对这套课程的学习模式应该是先看书进行预习一下.虽然这破除里面的东西有点生涩.看不懂.记下来.然后去看课程.

    课程的参考书 《Windows程序设计 (第5版 珍藏版)》.pdf
    课程的参考书《MFC.Windows程序设计(第2版)修订版].(美)帕罗赛斯.扫描版》
    部分课程可能 摄像头的视频 跟 电脑屏幕的操作视频可能错了几分钟…解决办法.可以把 网页播放的那个声音
    设置成最小.开一个播放器打开视频.自己测试将 摄像头视频 跟 电脑录像 自行同步即可。一般都是两分多钟
    这是我看视频的时候的解决办法

    高级Windows程序设计30.rar 4.3GB
    [Windows程序设计(第5版,珍藏版)].Charles.Petzold.扫描版.pdf 390.6 MB
    [MFC.Windows程序设计(第2版)修订版].(美)帕罗赛斯.扫描版.pdf 94.4 MB
    MFC Windows程序设计(第二版)(中文版)源代码
    Windows程序设计(第5版 珍藏版)支持VS08 - VS12
    Windows程序设计(第5版 珍藏版)支持VC60
    由于文件过大.我把 编译出来的文件删除了.只剩下了源码文件

    资料5

    《c++高级编程》(第2版)、《Windows程序设计》(第5版)、《MFCwindows程序设计》和《深入浅出MFC》这四本书的学习顺序?又或是学了第一本是不是不需要对后面三本不用太多的学习了?

    C++高级编程和Windows程序设计可以同时看,但是MFC就算了。如果你喜欢写GUI,还是用C#和WPF吧《WPF编程宝典C#2012版》C++记得看C++11/14,如果那本高级编程不包含这个内容的话,那你可能需要寻找别的书,譬如说C++Design and Evolution(听说出了C++11的内容
    
    作者:vczh
    链接:https://www.zhihu.com/question/23084979/answer/23558829
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    这四本都不用看了- -win32 靠 windows核心编程+msdn+博客C++有语言基础就C++ primer 没有就C++ primer plus然后看effective系列 exception系列 STL自修手册和深入剖析STL系列IBM的C++系列书 C++11FAQ 差不多了MFC什么的忘了吧...去学C#的WPF
    
    作者:楚轩
    链接:https://www.zhihu.com/question/23084979/answer/23566341
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    如果要学GUI的话,为什么不从安卓或者ios开始呢。
    WPF没有项目的话,学着比较无趣的,而且复杂。
    MFC就更无趣了,而且也复杂。
    
    
    要做gui,能不用c++就不用了,Windows用c#吧。如果真的要学c++做gui,千万不要学windows程序设计,wfc和mfc这类的因为这些会让你感觉非常难,但是难的原因是微软设计的太烂了,本来gui是很优美的东西你看ios和安卓就知道了。还有windows写gui可以用python或qt类库。候捷先生不是程序员,他那几本书误人子弟不少
    
    作者:池静若
    链接:https://www.zhihu.com/question/23084979/answer/23565475
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    windows API手册备一份,常看看

    资料6

    小甲鱼 《windows 程序设计(SDK编程)》

    http://bbs.fishc.com/forum-255-1.html

    资料7

    分享我看过最完整的中文api文档

     http://download.csdn.net/detail/u013519989/8411465

    资料8:学好Windows编程要看的书籍

    本文是接着前面的学好C++要阅读的书籍而写的,如果想了解C++的学习的话请先看学好C++要阅读的书籍:http://blog.csdn.net/a809146548/article/details/42972535,毕竟本文介绍的书籍都要有一定的C/C++基础,下面来看本文介绍的书籍吧!

    1、《Windows程序设计(第5版 珍藏版)》:这是很经典的一本介绍Win32 API编程的书了,基本介绍到了大多数关于Windows程序设计的基本内容。

    2、《Windows程序设计-王艳平版》:这本和上一本的区别在于,他讲到了WIN32编程很重要的HOOK技术,与及如何动态在DLL中查找所需函数等,需要一定的数据结构基础和操作系统的基本知识。

    3、《Windows网络编程》,《Visual C++网络编程》:这两本书讲述了如何在Windows环境下进行TCP/IP SOCKET编程,包括完成端口模型,SELECT模型等,需要一定的网络原理知识。

    4、《MFC Windows程序设计》:这是讲述微软对WIN32 API封装的类库的基本使用的书籍,属于C++类库;使用MFC可以很方便的完成大量的Windows应用程序的开发。

    5、《Windows核心编程》:这讲述的是Windows编程中比较核心的知识了,包括内核对象的东西,如临界区,互斥对象,信号量等;内存映射(虚拟内存的使用),进程间通信,多线程等等。

    6、《Windows程序调试》:这是一本关于调试方面的书籍,讲述了许多调式工具的使用与及很多有用的调式方法等,使你平时的调试更高效。

    7、《Windows PE权威指南》:这讲述的是我们最常见的EXE(PE)文件了,包括他的文件格式,内部结构等,如何解析PE文件等,需要较好的汇编功底和C语言知识与及一定的操作系统知识。

    8、《COM技术内幕》、《com本质论》:这两本书讲述的是很有名的COM了,不管是学习DirextX还是ATL等,都有必要了解COM的知识,阅读他们还能使你对组件的开发有一个更深的认识,需要较好的C++基础与及一些设计模式方面的知识等。

    资料9: C++学习路线图(新)

    一、入门
    
    视频:零起点学通C++(范磊)
    
    电子书:C++ Primer第三版、第四版
    
    二、VC++学习
    
    视频:1、VC++深入详解(修订版)
    
            http://www.sunxin.org/video/vc.htm
    
    2、达内C++视频        
    
    书籍:深入浅出MFC(第2版)
    
    三、C++程序库
    
    1、ACE书籍
    
    (1)、C++网络编程(卷1)
    
    (2)、C++网络编程 卷2:基于ACE和框架的系统化复用
    
    (3)、ACE技术内幕:深入解析ACE架构设计与实现原理
    
    2、Boost书籍
    
    (1)、Boost程序库完全开发指南——深入C++“准”标准库
    
    (2)、Boost程序库探秘——深度解析C++准标准库
    
    四、数据结构、设计模式、软件工程
    
    1、数据结构视频:
    
     (1)、郝斌数据结构自学视频
    
         http://pan.baidu.com/share/link?shareid=430224&uk=1211444507&third=152)、上海交大算法与数据结构
    
         http://pan.baidu.com/share/link?shareid=469385&uk=571368547
    
      书籍:《数据结构与算法分析--C++描述》
    
      资料:http://pan.baidu.com/share/link?shareid=433609&uk=1211444507&third=15
    
    2、设计模式:http://pan.baidu.com/share/link?shareid=435992&uk=1211444507&third=15
    
    3、软件工程
    
    http://pan.baidu.com/share/link?shareid=504797&uk=3644217033&third=2
    
    五、计算机安全
    
    1、汇编语言
    
    视频:(小甲鱼)汇编语言视频教程77讲
    
          http://pan.baidu.com/share/link?shareid=474321&uk=571368547
    
          Yes黑客汇编教程(win32)
    
          http://pan.baidu.com/share/link?shareid=474322&uk=571368547
    
    书籍:王爽汇编语(第2版)
    
    琢石成器——Windows环境下32位汇编语言程序设计
    
    2、驱动开发
    
    视频:天草驱动开发
    
    书籍:竹林蹊径——深入浅出windows驱动开发
    
    3、计算机病毒技术
    
    书籍:计算机病毒及其防范技术(第2版)
    
    4、网络安全
    
    视频:西安鹏程刘瀚老师主讲网络安全基础视频教程2010版
    
            西安鹏程张建宁老师主讲网络安全
    
    书籍:网络安全体系结构
    
            物联网信息安全
    
            Web 前端黑客技术揭秘
    
    5、加密与解密
    
    书籍:加密与解密(第三版)
    
    6、软件漏洞分析技术
    
    书籍:0day安全:软件漏洞分析技术(第2版)
    
    7、反汇编与逆向分析技术
    
    视频:天草VIPIDA逆向与反汇编
    
    书籍:C++反汇编与逆向分析技术揭秘
    
    8、MySQL注入式攻击实战(视频)
    
    9、甲壳虫VIP-脱壳班(视频)
    
    六、测试
    
    1、计算机等级考试二级模拟盘
    
       http://www.wyks8.com/download/index.asp
    
    2、C++求职宝典
    
       http://pan.baidu.com/share/link?shareid=504796&uk=3644217033&third=2
    
    七、英语
    
    1、职场英语口语一定要速成(第二版)(含光盘)
    
    2、IT精英职场英语口语(配盘)
    
         http://pan.baidu.com/share/link?shareid=427786&uk=439715611&third=15
    
    3、英语口语8000句附双语字幕
    
    http://www.kekenet.com/kouyu/8000/
    
    八、相关的网站
    
    1、看雪安全网站
    
    http://www.pediy.com/default.php
    
    2、郁金香灬老师 论坛
    
     http://www.yjxsoft.com/
    
    3、科锐从CC++VC++全套培训
    
     http://115.com/folder/fei5few9o

    2018-05-30

    展开全文
  • 介绍了windows核心编程的一些内容和编程的思路及规范,讲的比较详细
  • Windows编程经典书籍

    千次阅读 2018-11-28 15:40:07
    本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发现什么好书就在楼下...
  • windows编程期末复习题

    2015-05-17 17:15:08
    windows编程期末复习题
  • Windows 核心编程》的全部源代码
  • Windows编程课件 Windows编程课件 Windows编程课件
  • Windows编程体系讲义

    2018-06-08 13:46:35
    Windows编程体系讲义。PPT文档整理,包含全面的Windows编程思想讲解,很不错,值得推荐。
  • 图象文件格式(下)windows编程图象文件格式(下)windows编程图象文件格式(下)windows编程图象文件格式(下)windows编程
  • Windows编程教案 第一课 最简单的 Windows程序2学时 Windows编程是一个很大的主题涉及的方面也非常的多 Windows始于90年代至 今Windows编程的发展已经非常成熟了而 单独直接使用 API的开发也是越来越少了因 此市面上...
  • Windows系统编程源码

    2019-01-18 12:51:15
    Windows系统编程源码,包括安装和卸载软件管理、Windows服务状态监视器、键盘监视程序、进程保护器、系统信息查看程序等具体编程实例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 652,253
精华内容 260,901
关键字:

windows编程

友情链接: Adafruit_TLC5947-master.zip