签到

05月06日
尚未签到

共有回帖数 0

    李小主任

    等级:
    这么说吧,这个东西是给有一定基础的人,最少你得看完谭浩强的书吧!如果你连函数,指针,结构体都不知道什么,那还是算了……
    参考书籍:
    《windows程序设计》老外写的
    《windows程序设计》王艳萍
    《windows核心编程》老外写的
    《琢石成器——Windows环境下32位汇编语言程序设计》罗云斌老师
    请大家多多支持!
    大家或许已经厌倦了在黑乎乎的命令行界面下的程序,那我们就开始写我们的第一个窗口。

    大家打开vc6,然后选择文件,新建,创建一个空的win32 application,注意,不是我们平常所用的win32 console application!
    然后和以前一样,创建一个c++source file。
    (因为我用的是英文版的vc6,所以上面的东西我尽量翻译,可能会有词不达意,所以在翻译后的中文加上了原来的英文)

    之后大家注意了,接着再选择文件-新建-files-Resource Script,即再新建一个“资源脚本”!我的脚本文件名叫res。
    这个“资源脚本”很重要,我们的窗体的模样就是按照它来的!

    创建成功后,大家会看到vc6主窗口出现了一个小小的文件夹的标志,叫res.rc。
    大家右键单击它,选择插入(Insert),在弹出的对话框中选择“对话框”(Dialog),然后新建(New),这时大家是不是看到了一个对话框的窗口呢?

    右边还有一个竖栏,大家可以点击里面的选项,然后再出现的对话框窗口中拖动,这样对话框就多了一些新的内容了,我们把这些叫做控件。






    好的,现在回到最开始创建的c++ source file中,把下面的一段代码复制进去,今天我们会在这段代码和上面的基础对话框之上,完成一个小游戏的制作。
    (怎么回到c++ source file?大家看最左边的的竖栏,底下不是有三个分栏,点击第三个(Fil...),把上面所有的加号都点开,你就找到了最开始的xxx.cpp了)

    #include windows.h
    #include "resource.h"

    BOOL CALLBACK DlgMain(HWND,UINT,WPARAM,LPARAM);

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
       DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgMain);
       return 0;
    }

    BOOL CALLBACK DlgMain(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
       switch(message)
       {
       case WM_CLOSE:
           {
               EndDialog(hwnd,0);
               return TRUE;
           }
       }
       return FALSE;
    }

    大家编译执行,是不是出现了一个对话框窗口呢?
    DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgMain);这里是调用了一个函数,函数就申明在windows.h中!类似这样的一些函数,我们叫它们API。
    windows编程很重要的就是使用API。所以我建议大家去下一个MSDN,电驴上有的,平常我们看函数的功能,怎么使用就可以查MSDN了。
    我们来具体看一看这个。hInstance就是WinMain里面的,那四个参数是Windows给我们的,hInstance标志了我们写的这个程序。
    DialogBox(hInstance,...)实际上告诉我们,这个DialogBox(对话框)是这个程序中的。

    MAKEINTRESOURCE(IDD_DIALOG1)大家回到我们刚才编辑的资源脚本,双击对话框,出现了一个对话框属性的对话框(--b)。
    General标签里面的ID就是IDD_DIALOG1,这个实际上一个数字,标志这个对话框,自动给我们生成,resource.h里面就有。
    但DialogBox第二个参数实际上要求的是一个字符串,所以我们用MAKEINTRESOURCE把ID变成字符串。

    第三个参数表示的生成这个窗口的窗口,我们这里没有,所以是NULL。

    第四个参数就是完成对话框功能的函数地址,也就是我们前面申明的,也就是接下来的。

    BOOL CALLBACK DlgMain(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)讲到这里,我们就不得不说说Window的消息了。
    像平常,我们点击一个按钮,为什么会弹出一个对话框呢?这是因为,Windows在实时监控者你对电脑做了什么。你点击了一下鼠标,就会产生一个点击鼠标的消息。
    而消息的格式一般是HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam的。

    第一个HWND hwnd表示的是你这个消息该由谁负责。这是Windows帮你搞定的。hwnd实际上一个窗口句柄,它和hInstance类似,不过它是标志一个窗口的。
    每个窗口都有一个窗口句柄,它是唯一的,Windows就靠这个表别每一个窗口。
    你在我们的DialogBox窗口中点击了鼠标,Windows产生的消息中的hwnd就是我们窗口的hwnd,windows就会把这个消息发送给我们的窗口,由我们来处理。
    怎么处理呢,就是靠BOOL CALLBACK DlgMain(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)来处理!
    消息的格式正好对应着这个函数的四个参数,Windows会把消息给这个函数,然后我们在函数中处理后三个参数,看这个消息到底是干什么用的,然后处理我们需要的。

    UINT message表示的是消息的类型。我们看我们的函数中:
    switch(message)
    {
    case WM_CLOSE:
       {
           EndDialog(hwnd,0);
           return TRUE;
       }
    }
    switch语句不用我多讲吧!WM_CLOSE表示的是windows发过来的是一个关闭的消息。然后我们对这个消息作出反应。
    这里我们关闭对话框。大家不要忘了hwnd是什么用的哦,我们调用EndDialog函数,结束哪个对话框,当然是hwnd指向的对话框。
    而hwnd这里是windows发给这个窗口消息的第一个参数就标示着我们这个对话框,然后对话框就被关闭了。
    第二个参数不用管,我们简单的给它传个0。我们将在接下来学习到更多的消息。

    而仅仅有message消息是远不足以说明白消息的内容的。比如,你点击鼠标的位置就不是鼠标消息message所能表示了。
    于是就有了WPARAM LPARAM,这两个是依据消息的不同而不同的。我们会在接下来学习到更多。
    在WM_CLOSE中,这两个没用,所以我们没有管它。

    大家请注意,在switch语句中,处理了一个case,一定要return TRUE;
    因为我们不能估计到所有的消息,所以我们不能处理的消息都得return FALSE,这表示这些消息我不管,又windows你自己给我处理。
    说了这么多,大家是不是对windows环境下图形界面的编程有点印象了呢,那么下面我们就来写一个简单的小游戏。

    大家在最开始是不是对那一竖栏的控件有了初步的了解呢?我们就从编辑资源开始我们的小游戏。

    大家请看那个竖栏里是ab的东西,点击它,然后到我们的对话框里拖出一个文本编辑框。这个控件叫做edit box。
    再单击它旁边的Aa,拖出一个Static Text(我实在不知道怎么翻译比较合适了)。(大家把这个Static Text的ID改成IDC_STATIC1或者其他,不然可能会出点什么问题)
    大家双击这个Static Text,在General里面的Caption ,把其中的Static删掉。这个Caption 里面的就是显示在这个控件上面的字了。
    然后大家可以适当调整下对话框的大小。

    接下来就是重头戏了,写代码!
    我们在原来的代码的框架上加上我们想附加的功能就行了!

    看下面的代码

    #include windows.h
    #include "resource.h"

    BOOL CALLBACK DlgMain(HWND,UINT,WPARAM,LPARAM);

    int Number = 65534;

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
       DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgMain);
       return 0;
    }

    BOOL CALLBACK DlgMain(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
       switch(message)
       {
       case WM_CLOSE:
           {
               EndDialog(hwnd,0);
               return TRUE;
           }
       case WM_COMMAND:
           {
               switch(LOWORD(wParam))
               {
               case IDOK:
                   {
                       int NumberGuessed = GetDlgItemInt(hwnd,IDC_EDIT1,NULL,FALSE);
                       if(NumberGuessed  Number)
                           SetDlgItemText(hwnd,IDC_STATIC1,"bigger");
                       else if(NumberGuessed Number)
                           ret = SetDlgItemText(hwnd,IDC_STATIC1,"smaller");
                       else
                           SetDlgItemText(hwnd,IDC_STATIC1,"You guessed it!");
                       return TRUE;
                   }
               }
           }
       }
       return FALSE;
    }好的,大致大家应该知道这个小游戏是什么功能了,下面我们主要分析DlgMain。

    我们点击了那个OK按钮,CANCLE按钮等等这些控件,windows都会产生一个WM_COMMAND的消息。而参数wParam中的低字就是我们点击的控件的ID。
    所以我们用LOWORD这个取得wParam的低字,然后继续用一个switch语句来分别是点击了哪个控件。之后一一处理。

    在这里,我们只处理点击OK按钮的消息。
    我们看case IDOK:
    GetDlgItemInt这个函数是取得我们我们想得到控件中的东西,以数字(int)返回。
    GetDlgItemInt(hwnd,IDC_EDIT1,NULL,FALSE)大家看到,我们要取得的是对话框窗口(hwnd)中IDC_EDIT1中的数字。
    第三个参数是放返回值的指针,用来告诉你这个函数有没有成功,我们不管。
    第四个参数是告诉你取得的数字要不要分正负,我们也不管。
    取回的参数就放在NumberGuessed中。

    接下来大家明白吧,就是一个比较过程,大了,小了,相等,都出示一点提示信息。
    出示信息我们用SetDlgItemText这个函数,前两个参数大家应该明白了,第三个就是你要显示的字符串。
    当然,你也可以
    char szText[10] = "bigger";
    SetDlgItemText(hwnd,IDC_STATIC1,szText);

    到这里,整个游戏都结束了,大家有没有写出来呢?

    大家也可以给游戏加功能,比方说数字随机产生,重新开始等等,这就靠大家完善了,我就不写了!

    再给大家一个可能用到的函数名吧!
    SetDlgItemInt,GetDlgItemText(有Set必有Get,有Get必有Set)具体功能大家可以查MSDN。
    大家还可以使用MSDN工具栏里的定位功能找到和这些函数属于一个系列的,熟悉熟悉,到时候用的时候就知道用什么了。

    大家在做的时候遇到什么问题,就在下面提吧,我尽量解答。







    楼主 2016-04-15 08:35 回复

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

登录直线网账号

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