博文

用代码新建空白文档(MDI)(2007-07-23 02:50:00)

摘要:查了半天MSDN才找到,比较巧。 有几个类要搞清楚,CDocument,CDocTemplate,CDocManager(这个在MSDN里查不到~我的版本太老了?),他们的关系要看MFC源码,也不是很难弄清楚,比如从OnFileNew这个东西开始找,可以在CWinApp里找到,还有CDocManager,在后者里,最后一句是: pTemplate->OpenDocumentFile(NULL); 于是找一下CDocTemplate的这个函数说明,找源码也行,里面也有注释,他有两个参数,如果第一个为NULL,则会新建一个空的文档,并返回它的指针,CDocument*,就是我要的功能,关键是这个pTemplate怎么得到,看前面代码,它是用: CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead(); 而这个CDocManager的实例可以在theApp里找到,这个是唯一的一个全局变量,加上一句声明:extern CMyApp theApp;就可以用了,进m_pDocManager没问题,可是再访问m_templateList就出了问题,是protected权限,没办法了,我都想直接修改MFC源码了~~(怕改乱了) 其实有更直接的方法,CDocument有一个成员函数直接得到: CDocument::GetDocTemplate() OK,这样就可以在文档类里实现用代码新建另外一个文档,完了可以设置标题等等。 另外一个同窗在做代码的时候,把菜单的响应事件不小心放到了文档类里,我建议他放在视类,因为视类优先响应消息,文档专门管理文档,他不听,他说书上写在文档类里的,晕~~(破书扔了)后来在文档类里响应了之后要马上更新一下视类,不然会让人觉得没有反应,刚打开的文件显示都没变,不是觉得很奇怪吗?很自然的想到Invalidate(),但是这是在文档类怎么办? 找到两个成员函数: GetFirstPosition() GetNextView() 怎么做到看帮助。于是我想到,原来文档和视类是这么层关系,一个文档可以有多个视类,而一个视类只有一个文档。 同样的CDocTemplate和CDocument也是类似一个树状关系,如下图所示: ......

阅读全文(6761) | 评论:3

单纯形法性规划问题求解器(2007-03-19 22:09:00)

摘要: 我花了一天时间写的,为了做作业,不用用笔在纸上算了。 简单写了一个分析字符串的东西,没有专门的考虑词法分析什么的,只从中间提取变量名和参数表,有一个符号表功能,矩阵运算是原来数值分析实习时写的CMatrix。 LPSolver 单纯形法线性规划问题求解器 v0.1 rickone [实现功能]
1,直接单纯形法
2,大M法,M近似
3,两阶段法 [输入格式]
MAX或MIN(目标函数=目标函数表达式)
{
  约束方程1;
  约束方程2;
  ...
}
1,目标函数变量为第一个扫描到的变量标识 2,线性表达式的每一项:<系数><变量名> 3,约束形式:<= = >=
=不能写成== 4,符号'='为方程左右的边界标识符 5,符号';'为方程结束标识符,最后一个也不能省 6,隐含的约束条件有,所有的变量>=0 [例子] MAX(z=x1+x2+x3)
{
  x1-x2<=100;
  2x1-1.5x2>=10;
  x1+3x3=50;
} QQ:85104865
email to: rickone@sina.com
date:2007/03/19
VC6源码(部分,仅含主窗口的代码,分析字符串和LP算法,Matrix的只给个接口说明吧): //: Matrix.h
#if !defined(AFX_MATRIX_H__83023DF6_28C2_4C65_A12D_9DAAF6624E84__INCLUDED_)
#define AFX_MATRIX_H__83023DF6_28C2_4C65_A12D_9DAAF6624E84__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Matrix.h : header file
// ////////////////////////////////////////////////////////////////......

阅读全文(10052) | 评论:3

字牌游戏开发计划(2007-02-25 01:31:00)

摘要:没有代码。 我想起原来看的一集《卫斯理》的故事里面的一个家伙,他是卫斯理的朋友,卫斯理认识的朋友都是厉害角色,他的厉害之处是他的推理能力,他是天生的侦探,可惜没有做成侦探,于是他就天天在家里意识犯罪,什么是意识犯罪?在几年里他每天都想一个犯罪方案出来,并进行非常详细的计划,比如抢劫,他写出流程和计划,然后放在那里,当然他从未犯过罪,只是过把瘾而已,并乐此不疲,卫斯理都为他的计划之周密而惊叹。 这几天走亲戚拜年,茶饭之余从老到小就只知道打牌,麻将啊,扑克啊,昏天暗地,我看他们打的时候就想要是做个牌类游戏该如何着手设计,哦,意识犯罪而已。 我们这地方比较流行字牌,因为玩起来特刺激,啥是刺激?打一块钱一个码,一天下来估计可以输上好几百块~不比麻将,堆着麻烦,打起来也随意性大,输赢都有,一点都不刺激~ 字牌和麻将很相似,但是规则上会复杂很多,牌是纸做的,实际中4人一起玩,但拿牌的只有3个,3个人摸牌,比4个人摸牌容易摸一些,而且上下吃也容易些,比如,你和你上家的牌大部分都能吃,所以近似2/3的牌可以吃。 怎样着手设计呢?或者说计划一下。 首先是数据结构啦,从最底层开始。编码,牌如何用数字表示,原则,越简单越好,统一编码,比如1到10表示万,11到20表示条,统一一致编码。这时你会觉得是不是要做成复合形式的,就像MAC地址是平面的,而IP是分段的,在你还不知道这样编有什么好处的时候,别乱编,比如你觉得用二维数组表示更简单,但这样的操作是不是真的简单还不知道,有没有更麻烦的时候呢?或许有,因为以后的功能是应该可以扩充的。 有了牌的定义,然后就有桌面上的牌和手上的牌两类,桌上的牌在实际规则中或许比较复杂,但程序中很简单,只要是随机分发就行了,定义成一个可随机取的队列,类似代码如下: typedef int SPoker;  //  牌的定义 class CPokerQueue
{
     SPoker poker[80];
    CPokerQueue();  //  在这里顺序填入应有的所有牌
public:
    SPoker hand();  //  摸牌
......

阅读全文(9320) | 评论:8

STL与泛型(2006-09-28 20:06:00)

摘要:我真的不是一个好的C++爱好者,可能我还不算真正懂C++,我常想什么是C++,以前看到有人这样写程序: #include <iostream>
using namespace std; int main(int argc, char* argv[])
{
 cout<<"Hello!World!"<<endl;
 return 0;
} 然后就觉得好酷,我不用像C那样printf(),于是有段时间就以为C++就是cout,cin,后来又学了写class,于是就认为C++就是在一个程序里写几个自己的class,输入输出用iostream,呵,C++! 再后来学了一点MFC,了解到Microsoft的人是怎么写基础类库的,被那种完整的类体系迷倒,老实说,MFC对SDK的封装简直太彻底了!更重要的是,从MFC的设计者角度,终于明白了一点点,什么是OOD,什么是OOA,如何设计类,如何有效的封装。于是站在MFC肩上,做Windows程序开发,就是从MFC中选择适当的类,继承并设计自己的子类,再外加上VC++提供了Class Wizard,太方便了。于是就以为那就是C++。 感觉从C,C++,每一次大的变革,都是从思想上的变革,软件史上的革命要么是数学上的革命,比如人工智能的突破性进展等,要么就是思想上的革命,思想的飞跃造就了一个IT时代。同样的问题,思考的角度不同,那它本身就不同了。 泛型程序设计,这个词对我还很新,如果说过程化程序设计面向的是过程是函数,如果说C++面向的是对象,那泛型面向的会是什么呢?泛型,我感觉就是更广义的抽象,泛化,数组,链表等泛化成容器,指针泛化成迭代器,函数泛化成算法,突然一下整个C++完全变了样,原来那些东西都不见,感觉像一门新的语言!像这样: // stl.cpp : Defines the entry point for the console application.
//
#include "StdAfx.h"
#include <iostream>
#include <algorithm>
#include <functional>
#include <str......

阅读全文(7385) | 评论:9