当前位置:首页 » 2009 » 四月

快要疯了 On 闲言碎语  @2009-04-24

 调试VC++代码,老是提示如下图:

在网上搜了下,比较统一的说法是:“没有找到这个相应控件类型
一般有三种情况:一是控件ID不存在,二是控件未创建,三是控件的类型不对
看看DoDataExchange函数
我遇到这中情况是 弹不出对话框 后来仔细查看是 控件ID和后面的数据 根本不匹配 也就是他们根本无法交换数据 所以遇到了上述错误 要缩小范围 一般情况下都是在【DoDateExchange】 中。 仔细查看控件ID是否正确。
把不需要的资源ID或DoDataExchange的代码去了 就行了。”
 

但是我怎么看都没有符合那三条的,刚开始根据最后的一句话,修改了一些错误,但是其他还照样存在,一起之下把resourceppc.h之下的所有ID都给注册,还有运行,需要那个我再加载那个,费了九牛二虎之力,终于调试通过,但是以运行,问题还是存在,郁闷!!!!!!!!!!!!!

//======================可爱的分隔符=================
今天一大早,说实在也不早了,都九点多了,谁让昨天晚上熬到10点才从公司走呢。废话少絮,言归正传。。。。说昨天晚上的事,今早一会就找到问题所在了,答案就在上面的三种情况中,但是我还要再加一点注意的,就是创建控件所在窗体的时候调用的ID是否正确,我后面的问题都是因为用Create()函数窗体时跳用了错的ID,所引起的。切记,马虎害死人啊!!

打签»   评论» 抢沙发

又是一年槐花飘香时 On 闲言碎语  @2009-04-15

 “五月,槐花如雪,阵阵幽香,甜得让人心醉!五月槐花飘香时节,阵阵清香沁人心脾,所以在五一假期中间您不妨去野外农家看看槐花:槐花含苞待放之际,一朵朵,一串串,一簇簇,掩映在一片嫩绿之中,白的是万分纯洁,紫红的百般妩媚,让人忍不住摘一串,捧在手心,含在嘴里。漫步林间小道,小憩于石凳之上,一阵阵清香随风飘送,令人心旷神怡。槐花进入盛花期的时候不仅花香四溢,人们还可以亲自动手采槐花,吃槐花饼,品槐花宴。看看这含苞待放的槐花,你是不是有些心旷神怡了呢!快去享受大自然的美丽吧!
  槐树身为豆科,所以槐花和各种豆角的花一模一样,只不过是开在树上而已。每到盛夏,花季来临时,枝头一片青白,落花撒满一地。据说,以前军装的绿色就是用槐花染的。槐花也结豆,叫槐角。冬天树叶落光后,一串串的槐角挂在树上也挺显眼的。槐角入药,能做槐角丸。
  我国不少地区有蒸食槐花习惯,其实槐花不但可食,也是一味良药。槐花性凉味苦,为治疗便血的常用药,用于大肠湿热引起的痔出血、便血、血痢及血热引起的吐血、衄血。它含芦丁、槲皮素、槐二醇、维生素A等物质。芦丁能改善毛细血管的功能,保持毛细血管正常的抵抗力,防止因毛细血管脆性过大,渗透性过高引起的出血、高血压、糖尿病,服之可预防出血。”

这是百度百科对槐树的解说,下面是维基百科的解说:

“槐树原产于中国,所以在中国为了区别原产于北美的刺槐(洋槐),也称为“国槐”、“家槐”。在中国很多城市将其作为该城市的市树,如山东的淄博市和泰安市。槐树分布在中国各地,树型高大、喜光、根深、生长迅速,但和其他豆类植物不同,根部没有共生的根瘤菌。最近从分子生物学角度对其基因的研究,又分出一个单独的小属“槐属”(Styphnolobium)。
槐树树阴浓密,是很好的行道树,羽状复叶和刺槐相似,但刺槐的叶比较半透明。槐树的花为淡黄色,可烹调食用,也可作为一种中药或染料。其荚果也和其他豆类植物不同,肉胶质,在种子之间收缩,成为念珠状,俗称“槐米”,也是一种中药。盛花期在夏末,和其他树种花期不同,所以是一种重要的蜜源植物。
槐木坚硬,有弹性,以前是造牲畜拉的大车的主要木材,也可用来造船。
还有一种园艺变种龙爪槐,枝条下垂,树型不大,是一种点缀园景的很好的树种,最新培育出一种开粉红色花的龙爪槐。
槐树在中国被广为栽植,农村到处都有大槐树。最著名的槐树是山西洪洞县的大槐树,因为明朝永乐皇帝迁都北京,当时河北人口稀少,从比较富庶的山西强令向河北移民,移民在洪洞集结,故土难离的移民们多采集大槐树的种子、枝条种植到新家。因此现在在河北、山东、东北各地都有一个民谚为“问我老家在何处,山西洪洞大槐树”。
崇祯皇帝在北京景山上上吊的也是一棵槐树。”

打签»   评论» 抢沙发

解决方案、项目、程序集、命名空间、类 On 程序人生  @2009-04-11

先说说项目(Project),通俗的说,一个项目可以就是你开发的一个软件。在.Net下,一个项目可以表现为多种类型,如控制台应用程序,Windows应用程序,类库(Class Library),Web应用程序,Web Service,Windows控件等等。如果经过编译,从扩展名来看,应用程序都会被编译为.exe文件,而其余的会被编译为.dll文件。既然是.exe文件,就表明它是可以被执行的,表现在程序中,这些应用程序都有一个主程序入口点,即方法Main()。而类库,Windows控件等(.dll),则没有这个入口点,所以也不能直接执行,而仅提供一些功能,给其他项目调用。
再来说说解决方案,在Visual Studio中,新建一个的项目。例如创建控制台应用程序。注意在此时,Visual Studio除了建立了一个控制台项目之外,还创建了一个包含这个控制台项目的解决方案(Solution)。这个解决方案有什么用?如果你只需要开发一个Hello World的项目,解决方案自然毫无用处。但是,一个稍微复杂一点的软件,都需要很多模块来组成,为了体现彼此之间的层次关系,利于程序的复用,往往需要多个项目,每个项目实现不同的功能模块,最后将这些项目组合起来,就形成了一个完整的解决方案。形象地说,解决方案就是一个容器,在这个容器里,分成好多层,好多格,用来存放不同的项目。一个解决方案与项目是大于等于的关系。建立解决方案后,会建立一个扩展名为.sln的文件。
程序集(Assembly),通俗的角度来说,一个项目也就是一个程序集。从设计的角度来说,也可以看成是一个完整的模块(Module),或者称为是包(Package)。因此,一个程序集也可以体现为一个dll文件,或者exe文件。怎样划分程序集也是大有文章的,不过初学者暂时不用考虑它。
命名空间(namespace),这个在C++里面就有这个概念。引入它,主要是为了避免一个项目中,可能会存在的相同对象名的冲突。这个命名空间的定义,没有特殊的要求。不过基本上来说,为了保证其唯一性,最好是用通用资源标志符(Uniform Resource Identifier, 简称"URI")的格式,例如有个www.wincn.org命名空间。可能你留意过在项目中经常要调用的两个命名空间using System和using System.Data,可能你会有是不是前面的命名空间包含后面的命名空间,既然那样只需要写前面的哪个命名空间,为什么还要写两个的疑虑。其实他们俩确实不存在前者包含后者的关系,这样写是为了体现一种层次关系,也使得命名空间的唯一明了。比如说“命名空间”人,这有点大,里面可能存在好多重复的ID,我们可以命名为,中国.人,甚至中国.陕西.人。
有许多初学者,常常把一个项目就理解为一个命名空间。其实这两者没有绝对的联系,在项目里我们也可以定义很多不相同的命名空间。但为了用户便于使用,最好在一个项目中,其命名空间最好是一体的层次结构。在Visual Studio里,我们可以在项目中新建一个文件夹,默认情况下,该文件夹下对象的命名空间,应该是“项目的命名空间.文件夹名”。当然,我们也可以在namespace中修改它。
类(class),其必须在某单个名称空间里面。尽管.net2.0引入了局部类(partial),因为csc编译时程序集不带partial类相关的信息,类还是必须属于单一程序集,且单一名称空间(不同命名空间同一名称的类是不同的类)。也就是说:partial是语法层面的,不是CLR的一部分!类可以通过名称空间整理存储,引入partial关键字的.net2.0解决了类必须在一个cs文件内实现的诟病。

打签»   评论» 抢沙发

Winform程序多语言国际化实现的简单方法 On 程序人生  @2009-04-03

一般来说,Winform窗体里面Label、Button等控件需要不同的语言来表示。现在通过约束资源文件中对应控件名的名称,来到达简化编程的目的。具体方法如下:
先抛块砖,有玉的尽量向我砸过来。
在Resource文件中建立几个资源文件如:Resource1.zh-CN.resx,Resource1.zh-TW.resx,Resource1.en-US.resx。
然后在资源文件resxResource1.zh-CN.resx中添加:
Form1 测试窗体—对应窗体Form1
Form1label1 用户名—对应其上的label1
Form1label2 密码—-类似
Form1button1 保存(&S)—

在资源文件resxResource1.en-US.resx中添加:
Form1 TestForm
Form1label1 User Name
Form1label2 Passwrod
Form1button1 &Save

在资源文件Resource1.zh-TW.resx 略

建立Form1,在上面放几个控件label1,label2,button1。在Form1的构造函数或Form1_Load事件中添加:
(new SelectLanguage()).SetLanguage(this);,就可以实现Winform窗体的国际化,相当的简单方便。
要实现国际化的控件在资源文件中命名规则是: Form窗体 + 控件名称。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Globalization;
using System.Windows.Forms;

namespace TestLanguage
{
    public class SelectLanguage
    {

        public SelectLanguage()
        {
        }

        private string formName;

        public ResourceManager GetCurrentCulture()
        {
            //Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-TW");
            ResourceManager rm = new ResourceManager("TestLanguage.Resource.Resource1", Assembly.GetExecutingAssembly());
            return rm;
        }

        public System.Drawing.Bitmap GetImage(string strObjectId)
        {
            ResourceManager rm = GetCurrentCulture();
            object obj = rm.GetObject(strObjectId);
            return (System.Drawing.Bitmap)obj;
        }

        public string getMsg(string strId)
        {
            string currentLanguage = "";
            try
            {
                ResourceManager rm = GetCurrentCulture();
                CultureInfo ci = Thread.CurrentThread.CurrentCulture;
                currentLanguage = rm.GetString(strId, ci);
            }
            catch
            {
                currentLanguage = "Cannot Found:" + strId + " , Please Add it to Resource File.";
            }
            return currentLanguage;

        }

        public void SetLanguage(System.Windows.Forms.Control control)
        {
            //MessageBox.Show(control.GetType().BaseType.Name);
            if (control.GetType().BaseType.Name == "Form")
            {
                formName = control.Name;
                control.Text = getMsg(control.Name);
            }

            for (int i = 0; i < control.Controls.Count; i++)
            {
                //MessageBox.Show(control.Controls[i].GetType().Name + "-" + control.Controls[i].Name);
                switch (control.Controls[i].GetType().Name)
                {
                    case "Label":
                    case "Button":
                    case "CheckBox":
                    case "LinkLabel":
                        control.Controls[i].Text = getMsg(formName + control.Controls[i].Name);
                        break;
                    case "Panel":
                        SetLanguage(control.Controls[i]);
                        break;
                    case "TabControl":
                        TabControl tbc = (TabControl)control.Controls[i];
                        for (int j = 0; j < tbc.TabCount; j++)
                        {
                            tbc.TabPages[j].Text = getMsg(formName + tbc.TabPages[j].Name);
 &
nbsp;                          SetLanguage(tbc.TabPages[j]);
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    }
}

去掉//Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-TW");的注释,
或修改成//Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
你将看到不同的效果。相关的文章:http://www.wincn.org/post/177.html

打签» ,   评论» 抢沙发