签到

09月14日
尚未签到

共有回帖数 0

    花非花雾非雾

    等级:
    原文地址: http://www.winprog.org/tutorial/index.html
    今天是第一章, 俺就不客套, 也不谦虚了, 哪翻译的有毛病,  
    上路

    这份教程是关于什么的?

    这份教程打算教给您使用Win32 API编程的基础知识.
    所使用的语言为C,大多数C++编译器都可以很好的编译本教程中的代码.
    事实上,教程中的大部分内容都适用于支持Win32 API的语言,包括Java,汇编和VB.
    以前也有人使用这些语言取得了很大的成功.
    不过我在这里不会使用它们,您有兴趣可以自己研究.  

    这份教程不是关于C语言的教程,也不是关于某种编译器的教程(BC,VC,LCC等等...),
    但是我会在附录中附录一些我的经验,一些我所熟悉的编译器的使用经验.

    如果您连宏或者typedef都不晓得,请去找本好书,啃啃C语言.


    *重点提示:

    贯穿本文,我会在某些地方指出一些需要特别注意的地方,因为这些地方让很多人郁闷非常,
    如果你不注意这些地方,也将非常郁闷.
    第一个重点是:
    本文配套的示例代码(ZIP文件)不是可选的! 我不会在教程中给出所有代码.
    文中只会给出与当前讨论相关的代码,想要彻底理解这些代码是如何运作的,
    您有必要阅读完整的示例代码~

    第二个重点是:

    完整的阅读本教程! 如果您在某节遇到了一个不容易的理解的问题,那么请耐心些,
    答案不久将在后文中出现.  
    如果答案没有很快的出现,那么请您在上网求助前至少搜索一下本教程的剩余部分.
    另外有些问题可能产生于主题A,而答案可能在主题B或C或L中,
    这时您要做的是稍微联系一下上下文.(So just look around a littl)

    哦了~~~我要吼的都吼完了~~吼累了就来看一些实际的代码~

    最简单的Win32程序

    如果您是个彻头彻尾的无敌菜鸟,那么首先要保证您能够编译最基础的windows应用程序.
    将下面的代码敲入您的编译器,如果一切OK,恭喜您荣升为一名菜鸟程序员.(鸟注....)
    (Slap the following code into your compiler and if all goes well you should get one of the lamest programs ever written)
    注意,请将下面的代码当作C语言编译,而不是C++.  
    您也许认为这无关紧要~但是上面说了,本文的代码全部为C语言,因此我们有必要规范一下~
    大多数情况下,这意味着您的源文件后缀应该为.c而不是.cpp
    (鸟注: 后面一句没翻译,无法了解作者逻辑- -!
    If all of this hurts your head,just call the file test.c and be done with it)

    #include windows.h

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MessageBox(NULL, "Goodbye,cruel world!", "Note", MB_OK);
    return 0;
    }

    如果上面的代码编译失败,首先检查错误信息,如果您不明白这些信息的意思,请在配套的编译器文档中寻找.
    注意! 确定你选择的是Win32 GUI工程/makefile/目标文件,而不是Console.
    关于错误信息与工程类型,我能说的就这么多了,不同的编译器,不同的用户能够产生不同的错误,变数太多拉~~~

    某些编译器可能给出并没有使用全部的WinMain函数参数的警告,这不要紧,可以无视之.
    好啦,我相信您现在已经能够编译程序了,那么就来研究代码了...

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)

    在windows GUI程序中,WinMain()函数相当于DOS或UNIX中的main函数,一个windows GUI程序将从这里开始运行.
    参数如下:

    HINSTANCE hInstance: 可执行模块句柄.
    HINSTANCE hPrevInstance: 在Win32程序中永远为NULL.
    LPSTR lpCmdLine: 指向命令行参数(一个单行字符串),不包括程序名.(鸟注: 这里有个不是问题的问题,
    作者说不包括程序名,实际上是包括的,只不过lpCmndLine跳过了程序名,直接指向后面的参数)
    int nCmdShow: 一个整数,用来作为ShowWindow()的参数,后面会接触到.

    加载某些资源或者执行基于模块的任务时要用到hInstance. 一个模块不是加载到程序中的EXE就是DLL.  
    对于本教程的大部分内容,我们只关心EXE模块~

    在Win16中hPrevInstance用于指出上一个可执行模块实例(如果存在的话),而Win32不再需要它了,永远为NULL.

    调用规则

    WINAPI指示被修饰函数的调用规则,它被定义为_stdcall,如果您不明白这是什么意思,没关系滴,
    它不会影响您学习本教程,您只要记住它在这里是必须的就好了.

    Win32数据类型

    不久您会发现,许多C中的标准关键字或数据类型,在windows都有其特殊定义.
    UINT对应unsigned int,LPSTR对应char* 等等.....具体用哪种,就看您的爱好了.
    如果您更喜欢char*而不是LPSTR,大可使用前者. 只是在您替换之前需要确定被替换的是什么数据类型.
    记住一些简单的规则有助于您理解windows版本的数据类型.  
    例如LP前缀代表Long Pointer(长指针),在Win32中指针不分长短,所以Long可以被无视掉老~
    呃.......如果您连指针是什么玩意都不晓得,那么有2种选择:
    1. 找本C语言教程,补基础去~
    2. 死挺硬抗,继续往下看.....
    我建议您选择1,但是我想很多人都会选择2:),这样可别怪我没提醒你.....

    LP后面的C(LPC)代表const pointer(鸟注: 作者是说a pointer points to a const type,
    也就是指向常量的指针,并不是说这个指针是个常量指针...).
    LPCSTR就是一个指向常量字符串的指针,您不能也不应该修改指向的对象. 而LPSTR就可以拉.

    另外在windows版本的字符串类型中,您也许在其中发现字母"T",现在不必关心它拉,
    除非您在与Unicode打交道,否则它没有任何意义.
    If all of this hurts your head,just call the file test.c and be done with it
    这句的意思是如果(上面这些什么 .c 后缀和 .cpp 后缀之类的东西)看的你头疼,直接把文件叫做 test.c 就好了��

    楼主 2016-01-15 17:22 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知