东华大学论坛|在水一方

 找回密码
 注册(开放注册)
搜索
查看: 4328|回复: 12
打印 上一主题 下一主题

[应用技术] win32api编程初级一

[复制链接]
跳转到指定楼层
1#
发表于 2006-11-10 20:42:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
呵呵 好不容易明天不加班,今天有点闲,给大伙写点东西
讲讲win32吧
首先回顾以前我们眼中的c/c++的程序结构。
main();,很简单,大家知道标准的c/c++函数怎么写吗?如下:
int main(int num,char**para)
{
      //todo something ;
      return 0;
}
标准线程的写法就上面所述,先不讲参数意义,我们将这个函数怎么运行。首先编译,然后生成exe文件,tuboC有这个功能,vc6.0以上,可以直接实现编译生成以及运行。然后再dos状态下运行exe文件,同时附参数。下面讲讲参数意义。第一个参数,是你所附参数的个数,第二个是一个二维数组,不要被2个*号吓倒,就说是2级指针,太复杂。用法如下para[][];不是*para或para[]
好了标准的函数讲完,下面讲讲程序的运行机理:
首先大家考虑个问题main是否可以调用main函数?
大家多知道程序运行的时候多是从main函数开始的,我们怎样开发一个软件呢,而不是再做1+1=2之类小程序
下面列举一个例子
我们先建立一个程序,命名为run
程序如下
int mian()
{
      int a =0;
      a = 3;
      return (a%2 == 0)?1:0);
}
生成exe文件后文件为run.exe文件。这是run就是个简单的线程,一个软件就是有这些具有不同功能的线程构成:
//主线程(qq.exe)
int main()
{
    //启动初始化程序
     //启动业务管理线程
    //启动业务关闭程序
}
启动初始化程序
int main()
{
    //在这里我们做程序运行后需要那些资源的申请
}
启动业务管理线程
int main()
{
    //启动窗体绘制程序
    //启动事件管理管理程序
    //。。。。。
}
//启动业务关闭程序
int mian()
{
   //程序结束后,我们要对一些资源进行释放
}
当然一个软件不可能有上面那么简单。但是大致原理就是这样
然后谈谈线程概念
一个线程就是个无休止的循环(不要拿书本上的理论来和我较真)
那么线程是怎么结束的呢?当然不可能是不受管理的死循环。循环之所以能够成立,就是因为条件满足,如果破坏条件那么它将停止
上面写的有点让人害怕,便软件没有这么复杂,如果不是必要我们很少这样来写软件,微软已经将他们集成化,就是我们所说的win32
今天不打算具体讲win32,首先让大家对win32有个整体认识。
在这里我们经常见到一些陌生的“关键字”,比如hwnd,handle,hresult等,在这里建议大家,“忘记”以前c/c++中的什么int char等关键字的概念,就把win32当成一门新的语言来说,不要对这些关键感到畏惧
他们的本质其实就是,int ,long 等。但是千万别把他们当这些关键字来对待。
      然后就是说说编码方式,至于什么变量函数该怎么写,我不想多说,什么叫匈牙利编码方式,自己查资料,书上多有。
     最后希望大家写代码的时候能够写注释,哪怕是一个变量,也给我写上注释。好了今天就写这么多,没准备好。
下次我给大家讲如何实现简单的窗体绘制,一个代码祥解。

最后我想申明以上以及以后本人写的文张多是本人多年的劳动成果所得的“经验之谈”,所以希望大家在未经本人的同意下,不要别的地方转载我写的文章 ok

评分

参与人数 1积分 +10 收起 理由
csdsq + 10 好东东!

查看全部评分

2#
发表于 2006-11-11 12:30:35 | 只看该作者
顶,正在学MFC,兄弟VC++牛吗?正好教下小弟
3#
 楼主| 发表于 2006-11-11 17:46:54 | 只看该作者
mfc很简单,如果你能把vc环境用好,就没什么困难可言。
建议用vc8.0
4#
发表于 2006-11-19 21:51:28 | 只看该作者
支持,但需要注意错别字,另外你的一些说法有待商榷。比如:
1 mfc很简单,如果你能把vc环境用好,就没什么困难可言。
---
我的看法:环境只是工具,难点在语言本身,更进一步的说,在C++本身、在MFC本身。
2 最后希望大家写代码的时候能够写注释,哪怕是一个变量,也给我写上注释。
---
我的看法:写注释要适可而止,不需要每个变量都要注释。对变量而言,注意利用匈牙利表示法会更好。
3 你的这个run程序想要说明什么问题,我没太看明白,从代码联编的角度来说,是不可以有多个main方法的,当然也许我理解错你的意思了。对于多线程程序而言,一般都是有一个主线程,然后通过主线程来创建和释放其他线程的。你如果写这么多的main函数,会给初学者带来一定的误导性。

没别的意思,只是交流,希望能看到你更好更多的技术文章。支持!

[ 本帖最后由 ptnotree 于 2006-11-19 21:54 编辑 ]
5#
 楼主| 发表于 2006-11-20 18:46:25 | 只看该作者
呵呵 没什么,至于第一点我想说的是语言其实真的不难,难得是你如何利用好环境,这一点我只能说等你工作后或许能体会到。
       我强调注释的原因是,软件开发是团体工作,注释质量的好坏直接影响你的合作伙伴的工作效率。至于用用什么表达方式,每个团体多有自己的一套命名方式,基本上是基于你所说的匈牙利命名方式,当然没必要每个变量多写上注释
       第三点你提得非常好,尤其是“对于多线程程序而言,一般都是有一个主线程,然后通过主线程来创建和释放其他线程的。”这句。我想说的每个线程多是一个main函数组成。在主函数(当然也是个main函数)有专门的函数调用那些main函数,这样说也不太准确,每个程序最终是一个.exe文件,我们不可能调用到main函数
但是我们可以通过编译器把一个main程序编译为一个可执行文件。比如Draw.exe,我们在主程序里面调用的就是这个Draw而不是main,不知道这么解释你是否能理解?
       最后还是想说mfc如何学习
一般学习mfc只要一个月就能入门(如果有win32基础的话),学习mfc的时候大家最大的错误思想就是想把这些类库和函数给背下来,这是不可能的。我们在做开发的时候多是利用msdn来查询我们需要的东西,当然刚开始根本就不知道用什么类?如何用这些类?
       所以建议先开始学习类库,一天学一个就够(时间肯定足够),学习30个类库就已经足够,剩下的可以现学现用。
       然后就是看了msdn中的类库后,剩下的就是不知道该如何下手。怎么去用?
       我希望初学者能买本傻瓜书,照着书练习,如何使用这些控件等,然后注意别买那些什么网络,黑客之类的名字听起来大的书,没用。我记得咱校图书馆就有这种傻瓜书,我上学的时候在图书馆看到多很多这样的书。
6#
发表于 2006-11-21 00:05:11 | 只看该作者
嗯 我是97年读大学的,写软件也都5-6年多了,应该是你的学长哟,呵呵

加油!

另外,我的一些看法,望指正:
1 语言要比环境重要的多,这不仅仅是我个人的观点。千万不要变的离开环境就不会写东西了,那才晕呢!
2 对于“多线程程序”而言,每个线程都是一个main函数组成,这句话是有问题的;建议去深入看一下多线程的相关知识。
3 比如Draw.exe,我们在主程序里面调用的就是这个Draw而不是main,
---
我的看法:我不知道你所谓的主程序是工程文件,还是由程序入口点【类似于c语言中的main函数】入口启动;从MFC的主框架调用过程来看,最终仍然是回到了APPMODUL.CPP文件的_tWinMain函数。而这个所谓的_tWinMain只是一个宏,其代码如下:#define _tWinMain   WinMain,这样就回到了Win32开发过程中的说法了。如果你从VCL的角度来看,传统delphi语言表面上看来是从工程文件启动的,但最终仍然回到了一个代码的入口函数部分,这一点你可以进行断点跟踪。

我觉得,大家在学习MFC之前,应该去学SDK开发,尤其是它的第一个可以创建窗口以及消息传递机制的解释和其中的其他代码的解析要仔细分析,然后在进入MFC的时候多跟基于SDK开发方式进行联系,那样就容易理解多了。

纯属技术探讨,希望更多的交流!
7#
发表于 2006-11-21 08:38:40 | 只看该作者
说得不错,最近看了一些书都说要多研究下C++,现在在看<<深入浅出MFC>>,你们觉得怎么样
8#
 楼主| 发表于 2006-11-22 20:55:20 | 只看该作者
呵呵 越说越有嚼头,我不知道学长是否知道伪线程的概念。还有操作系统的操作原理,呵呵概念有点大,其实我研究的也不太深,只是讲讲我个人的观点。
        不知道大家有没有影像,当我们按下ctrl+Alt+Del的时候,我们可以看见很有正在运行的线程。他们实际上就是一个个main函数,当然也可以说是winmain函数,尤其是学过win32的朋友对这种观点尤其深刻。因为大家用c或者是c++做软件的时候接触的更多的是win32,尤其是mfc,但是有几个人是直接用c/c++编程的?
        我先写个例子
        int main(int num,char**para)
        {
                 while(1)
                 {
                     wait(5);
                  if(para[0][0] == .....
                  {
                   }
                  else if(para[0][1]==.....
                  {
                   }
                   else if(para[0][1]==.....
                   {
                    }
                   else
                   {
                    }
                 }
         }

假定上面的工程文件为porc,那么编译后就是proc.exe文件,
那么在主程序,也就是主线程里面我们通过专用的函数来启动他
比方说
int hdProcessID = ShellExecute("../proc.exe","para");
我想分析上面的函数
ShellExecute是启动可执行文件的函数,返回值是一个可以唯一标志该线程的标识符。
第二个参数就是上面main函数需要的参数
如果把上面的int 写成HINSTANCE大家可能会更接受点。
有点操作系统基础知识的人多知道,如果在主线程中我们建立个虚拟表,用来保存这些hdProcessID ,我们就可以很好地操控这些线程,所以一个系统的好坏其实就是这张表和查询方式的好坏,不知道这么说师兄是否能理解我的意思
我想师兄考虑得多线程概念不会只是ThreadBegin之类的mfc函数或类吧,这些从理论上来讲只是伪线程,只是我两站的角度不一样,你说的是win32而我说的是纯c/c++当然也利用了一些win32函数,我感觉没必要再用汇编或c去写这些接口吧
最后就是劝上面那位小兄弟,至于什么候氏之类的书建议你不要去看,他们的水平太高,写的书很让人摸不着头脑。
9#
发表于 2006-11-23 12:14:44 | 只看该作者
不是吧!!!!!
我看了他的书觉得还不错呀,不懂的多看几遍就差不多了
你觉得什么书好啊??介绍几本看看,<<C++编程思想>>怎么样???
10#
 楼主| 发表于 2006-11-23 19:02:41 | 只看该作者
我记得上学的时候学府书店有本大砖头,叫什么vc6.0技术内幕挺好 ,挺厚的,看这个比较好
至于侯氏的书我建议你不要看,本来初学者对mfc就很抽象,侯氏还把这本书写的很抽象。打个比方来说,就好像你看中国人写的操作系统书籍去研究操作系统一样,只知道的“原理”却不知道如何去做,如何去实现。
搞笑的是这本书还让读者自己去写出(说白了就是背)那些类!!
感觉有点不可思议!!
11#
发表于 2006-11-23 19:39:18 | 只看该作者
对了,最近看源码时有些不知道的类,就查MSDN,可是看了之后意思大概了解,
但还是不知道怎样去用或什么时候该用呀,求教
12#
 楼主| 发表于 2006-11-23 20:00:16 | 只看该作者
你用v6建个mfc基于对话框的工程(基于这个工程的程序很简单)
自己慢慢研究
而且在难点处,msdn里面有现成的工程文件,也就是程序案例,这就看你会不会用msdn了
还有阿 下次问的时候能不能说出是什么类。不用的类用法不一样
我也不能凭空给你说出怎么用阿 是不是?
不过我建议你先学习对话框类(CDialog)
类的使用基本上基于以下几点
1定义变量
比如
CDialog dlg;
dlg.DoModal();
dlg.SetWindowText("对话框");
。。。。。
给你个实例
比方说在一个按钮的单击时间里我们想弹出一个对话框
就可以用上面的例子
13#
发表于 2006-11-23 21:34:21 | 只看该作者
有道理,谢谢
我想问下:
TRY
{.....}
CATCH
{....}END_CATCH
应该怎么用,或是在什么情况下用
还有,麻烦简单说下CArchive这个类的作用和用法
谢谢
您需要登录后才可以回帖 登录 | 注册(开放注册)

本版积分规则

手机访问本页请
扫描左边二维码
         本网站声明
本网站所有内容为网友上传,若存在版权问题或是相关责任请联系站长!
站长联系QQ:7123767   myubbs.com
         站长微信:7123767
请扫描右边二维码
www.myubbs.com

小黑屋|手机版|Archiver|东华大学论坛 ( 琼ICP备10001196号-2 )

GMT+8, 2024-5-4 20:16 , Processed in 0.086927 second(s), 18 queries .

Powered by 高考信息网 X3.3

© 2001-2013 大学排名

快速回复 返回顶部 返回列表