|
用户名:rabbitweng 笔名:rabbitweng 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
如何使MDI程序在启动时不创建一个新文档
在程序的initinstance中的processshellcommand函数之前加入:
cmdinfo.m_nshellcommand = ccommandlineinfo::filenothing
- 作者: rabbitweng 2005年06月3日, 星期五 20:32 回复(1) | 引用(1) 加入博采
坐标转换
在所在的view类中添加:
CClientDC dc(this);//建立设备文本
OnPrepareDC(&dc,NULL);//设备映射处理
dc.DPtoLP(&point);//鼠标指针转换
这样就完成了从device units到logical units的转换,在OnMouseMove()函数中使用以上代码就能使得point从相对于子窗口的坐标转换到相对于子窗口中显示的图片的坐标。
ps:
当然还有dc.LPtoDP(&point)函数了
- 作者: rabbitweng 2005年06月2日, 星期四 22:10 回复(1) | 引用(1) 加入博采
改变dlg类DoModal()的返回值
例如:你的模态对话框有个button。用1作为验证成功的返回值
void MyCDlg::OnBUTTON()
{
EndDialog(1); //domodal的返回值
DestroyWindow(); //销毁对话框
}
而在主程序中可用下面语句。
for( ;MyCDlg.DoModal()!=1; );
- 作者: rabbitweng 2005年06月1日, 星期三 20:24 回复(1) | 引用(1) 加入博采
各个类指针的使用
【 在App中获得MainFrame指针】
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,
或者
CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
ps:
Afx函数有一些很有用,比如这个AfxGetGetMainWnd()和AfxGetApp()
【在View中获得MainFrame指针】
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
【获得View(已建立)指针 】
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();
【获得当前文档指针 】
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
【获得状态栏与工具栏指针 】
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOLBAR);
【在任何类中获得应用程序类】
用MFC全局函数AfxGetApp()获得
【从文档类取得视图类的指针】
我是从http://download.cqcnc.com/soft/program/article/vc/vc405.html学到的,从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。
CDocument类提供了两个函数用于视图类的定位:
GetFirstViewPosition()和GetNextView()
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。
GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:
pView->IsKindOf(RUNTIME_CLASS(CTestView));
即可检查pView所指是否是CTestView类。
有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:
CView* CTestDoc::GetView(CRuntimeClass* pClass)
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL){
pView=GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.\r\n http://www.VCKBASE.com");
return NULL;
}
return pView;
}
其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
1.pos为NULL,即已经不存在下一个视图类供操作;
2.pView已符合要求。
1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。
3.从一个视图类取得另一视图类的指针 综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:
(假设要从CTestAView中取得指向其它视图类的指针)
CView* CTestAView::GetView(CRuntimeClass* pClass)
{
CTestDoc* pDoc=(CTestDoc*)GetDocument();
CView* pView;
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
pView=pDoc->GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;
}
return pView;
}
这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,
来源:http://sanjianxia.myrice.com/vc/vc45.htm)
可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置;
利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。
POSITION GetFirstDocTemplate( ) const;
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;
第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。
一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。
用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:
viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument *GetNextDoc(POSITION & rPos) const = 0;
如果列表为空,则rPos被置为NULL.
在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。函数原形如下:
CDocTemplate * GetDocTemplate ( ) const;
如果该文档不属于文档模板管理,则返回值为NULL。
一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表中,并将视的文档指针指向该文档。当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视的对象连接到文档上时, MFC会自动调用该函数,框架通过文档/视的结构将文档和视联系起来。当然,程序员也可以根据自己的需要调用该函数。
Virtual POSITION GetFirstViewPosition( ) const;
Virtual CView * GetNextView( POSITION &rPosition) cosnt;
应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个视,则将rPosition置为NULL.
从一个视图类取得另一视图类的指针
这个应用在多视的应用程序中很多见,一般如果自己在主程序或者主框架中做好变量记号,也可以获得,还有比较通用的就是用文档类作中转,以文档类的视图遍历定位,取得另一个视图类。
- 作者: rabbitweng 2005年06月1日, 星期三 13:41 回复(1) | 引用(1) 加入博采
上工守神,下工守形
- 作者: rabbitweng 2005年05月31日, 星期二 19:29 回复(1) | 引用(1) 加入博采
花中十友
- 作者: rabbitweng 2005年05月7日, 星期六 15:36 回复(1) | 引用(1) 加入博采
《思考中医》这本书挺好的!
- 作者: rabbitweng 2005年05月7日, 星期六 10:54 回复(1) | 引用(1) 加入博采
FreeBSD安装及汉化
安装过程与4.x没什么区别,但接下来的设置就有点郁闷了,查了半天资料才搞定: (部分内容来自Gavin@tju在www.freebsdchina.org上的帖子http://www.freebsdchina.org/forum/viewtopic.php?t=7686&highlight=xorg&sid=fc2d5bef2fdd50974a74958a1a65051e)
[/etc/rc.conf]
kern_securelevel_enable="NO" #内核安全级别,我没有使用 linux_enable="YES" #linux虚拟库,建议加载 sendmail_enable="NONE" #因为我需要用到sendmail服务,所以打开了,没有用可以设置为"NONE"
[/etc/make.conf]
一开始装完5.x后发现/etc/default下没有make.conf(或只有短短几行,还是安装perl时自动生成的)或make.conf.example,后来才发现原来在/usr/share/examples/etc下有make.conf,把它添加到/etc/make.conf下就好了。然后修改为:
CPUTYPE?=i686 #在这个地方选择适合你的cpu类型,以便编译安装软件的时候按照你的cpu类型进行优化。
CFLAGS= -O2 -pipe -fomit-frame-pointer #这个是c优化参数,我从网络上抄过来的,编译通不过的话,记得注释掉它。
CXXFLAGS+= -fmemoize-lookups -fsave-memoized #这个是系统带的 c++ 的优化参数,默认先加上 CFLAGS 那一行 #下面这些是升级源代码,ports以及doc用的,请确保你安装了 ports/net/cvsup 或者 ports/net/cvsup-without-gui。
SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPFLAGS= -g -L 2
SUPHOST= 211.81.54.130
SUPFILE= /usr/share/examples/cvsup/standard-supfile PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile #你可以添加下面这些来指定用 ports 安装软件的时候首先从离你比较近的镜像服务器下载源代码包。
MASTER_SITE_BACKUP?= \ ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP} 由于字体的原因,还要添加 WITH_CJK=yes 然后升级ports,并强行更新: /usr/ports下 print/freetyp2;x11- fonts/fontconfig;x11-fonts/libXft;x11-toolkits/pango(顺序不能错,中间也不要插入编译其他的软件)
[/etc/login.conf和~/.login_conf]
这里可以设置本地化的全局变量,而不管你使用的是 csh 还是 bash,在 default 的排列下面加上如下两行: 代码: :lang=zh_CN.GBK:\ :charset=GBK: 注意格式哦,加了这两行之后上面的 :umask=022:后面就要加上"\"符号。 ~/.login_conf 同理,只不过是单个用户的局部设置罢了。
[~/.cshrc(我个人比较喜欢用tcsh)]
# $FreeBSD: src/share/skel/dot.cshrc,v 1.13 2001/01/10 17:35:28 archie Exp $ # # .cshrc - csh resource script, read at beginning of execution by each shell # # see also csh(1), environ(7). # alias h history 25 alias j jobs -l alias la ls -a alias lf ls -FA alias ll ls -lA
alias vi env LC_CTYPE=en_US.ISO_8859-1 vi #vi的国际化做的不好,但是定义成8859-1可以显示中文
alias ls env LC_CTYPE=en_US.ISO_8859-1 ls -G #同样,ls也是,-G选项让ls可以显示彩色 # A righteous umask umask 22
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin)
setenv EDITOR vi
setenv PAGER more
setenv BLOCKSIZE K
setenv LANG zh_CN.GBK #设定LANG环境变量为简体中文,到目前为止,建议在5.x版本上使用 GBK,如果你使用 4.x 版本,那么将 GBK 更改为或者eucCN。
setenv LC_ALL zh_CN.GBK #设定LC_ALL环境变量为简体中文
setenv G_BROKEN_FILENAMES 1 #这个环境变量可以让 GNOME2.x 不使用默认的UTF-8 编码,而使用系统 LANG 变量的编码
setenv SGML_CATALOG_FILES /usr/local/share/sgml/catalog
setenv XML_CATALOG_FILES /usr/local/share/xml/catalog.ports #这两个是我写sgml用的:)
setenv LSCOLORS ExFxCxDxBxEgDxDEhGAcHd #这个环境变量可以定义ls显示的彩色样式,试试看有什么区别:) if ($?prompt) then # An interactive shell -- set some stuff up
set prompt = '%n:%~%# ' #来个好看一点的提示符:-)
set filec
set history = 100
set savehist = 100
set mail = (/var/mail/$USER)
set dspmbyte = 0000000000000000000000000000000000000000000000000000000000000000222 22222222222222222222222222222222222222222222222222222222222223333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333 33333333333333333333333333330 #设定 tcsh 可以支持 GBK 输入,如果你用 eucCN 类似的 locale,就不需要了。感谢 intron@SMTH。这一串字符是 64 个 0,64 个 2,127 个 3,1 个 0:-)
if ( $?tcsh ) then bindkey "^W" backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward endif endif
做完以上工作,然后在/usr/src下执行make update(我也是刚学的这个方法,以前都是用cvsup直接升级,比较笨的说),然后src,ports,doc全都更新了。high呀
[编译整个系统]
在/usr/src下执行make buildworld(这里的make千万不要加-j参数,会出错的,我就是受害者,sigh)然后在/usr/src/sys/i386/conf下复制文件GENERIC文件为MK,然后加入以下选项: options VESA
options SC_PIXEL_MODE
device sound #声卡驱动通用部分
device snd_ich #注意这个选择适合您自己声卡的驱动程序再去掉一些不需要的如usb keyboard设备,firewire设备,使内核尽量精简。然后在/usr/src下执行
make -j 64 buildkernel KERNCONF=MK;make -j 64 installkernel KERNCONF=MK,然后重启机子(为了安全起见,其实我从未遇到过因为跳过重启这一步而出问题的),到/usr/src下执行make installworld,最后执行mergemaster -a(自动),基本一切okay了,然后再重启机子,呵呵,焕然一新。
[x-window]
由于5.x的FreeBSD以XOrg为默认的X Server,所以配置它的命令也相应改为xorgconfig,依样画葫芦,设置一下显示器刷新率和显卡型号,存盘即可。然后安装x-window的window manager。听别人推荐icewm,试了一下,果然觉得比xfce和fluxbox好用,还有好看的theme更新,又high了一把。 [中文输入法]以前一直用fcitx,看帖子有推荐scim的,尝试了一下,不错,我现在用的是它的kde前端skim,要安装: /usr/ports/chinese/scim-tables和/usr/ports/textproc/skim,然后在桌面下执行skim -d(后台daemon)就好了,拼音用的挺顺的。
[中文显示]
由于是5.x,这里有些设置与4.x有所不同: alias ls ls -aG alias cls clear limit coredumpsize 0 #使coredump时不产生内存映像文件 setenv XMODIFIERS @im=SCIM setenv XIM SCIM setenv XIM_PROGRAM SCIM setenv LANG zh_CN.GBK setenv LC_ALL zh_CN.GBK setenv G_BROKEN_FILENAMES 1 setenv LSCOLORS ExFxCxDxBxEgDxDEhGAcHd #让ls的彩色显示有所改善 写得好累呀,虽然中间有不少的ctrl+c,ctrl+v,还是费了不少精力和时间。先写这么多,以后再补充
- 作者: rabbitweng 2005年04月27日, 星期三 19:44 回复(1) | 引用(1) 加入博采
春游归来
昨天和今天的上午都是在柞水县城那度过的,去了那得叫顶峰台的地方,还到山上的观音庙中走了走,奇怪的是那里只有一个年轻的和尚在售门票,他居然联系主持还要通过手机,看来哪个庙太小了,连一个主持都容不下,呵呵,南无阿弥陀佛!
除此之外,我们还到柞水那得比较有名的柞水溶洞走了一遭,那溶洞里真可以说是冬暖夏凉,导游说溶洞了一年四季都是18度----一个让人觉得很舒服的温度(那些导游挺爽的,看来),而且那的风景确实挺好的,特别是站在顶峰台最好的那个庙中,放眼望去尽是层层叠叠的山峦,确实能使人产生一种"歌以咏志"的冲动,只可惜偶不会写诗,失败呀!
- 作者: rabbitweng 2005年04月20日, 星期三 21:00 回复(1) | 引用(1) 加入博采
dd命令使用[zz]
- 作者: rabbitweng 2005年04月15日, 星期五 18:49 回复(1) | 引用(1) 加入博采