博文

销毁一个对话框流程(2012-01-04 10:36:00)

摘要:点击标题栏中的“X”后, 调用OnClose(),  ---> 在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); -----> 在正式消毁对话框对象之前,会自动调用OnDestroy()。......

阅读全文(1853) | 评论:0

销毁一个对话框流程(2012-01-04 10:26:00)

摘要:点击标题栏中的“X”后, 调用OnClose(),  ---> 在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); -----> 在正式消毁对话框对象之前,会自动调用OnDestroy()。......

阅读全文(1807) | 评论:0

销毁一个对话框流程(2012-01-04 10:25:00)

摘要:点击标题栏中的“X”后, 调用OnClose(),  ---> 在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); -----> 在正式消毁对话框对象之前,会自动调用OnDestroy()。......

阅读全文(1609) | 评论:0

waveOut waveWrite播放声音需注意的一点(2011-11-02 15:22:00)

摘要:最近用windows底层API函数作为我播放声音的函数。程序开发好后,给别人使用。不就就反馈说在使用一段时间(大概30分钟)后,就会跳出 waveOut或者wavePrepare, waveUnprepare等API函数就不正常了。导致不能正常的播放声音了。思来想去,检查程序多次,没有发现什么问题。   今天,在看网上房子装修效果图的时候,一同事突然说了句,好整齐呀,两边对的非常齐整。真是一句话点醒梦中人。没错,就是这个问题,没有对齐的问题。 现在网上有很多的使用wave 底层API函数录音和放音的程序,但都忽略了这个细节。那就是,一般来说,播放一个语音文件,有3步,结束播放一个语音文件,也有3步。 这两个3步必须对齐。具体如下   播放语音文件3部曲 waveOutOpen         waveOutPrepareHeader                      waveOutWrite   结束播放3部曲                      waveOutReset          waveOutUnprepareHeader waveOutClose   播放3部曲和结束3部曲不能颠倒。 其中 waveOutWrite 和 waveOutReset 对应。 waveOutPrepareHeader和waveOutUnprepareHeader对应, waveOutOpen 和 waveOutClose 对应。 关系和位置不要颠倒了。        &nb......

阅读全文(5279) | 评论:0

VS2008工程 转 VS2005工程 侧记(2010-05-24 17:15:00)

摘要:本文一直使用的是VS.Net 2005环境。以前也接触了VS2008编译的应用程序,但是当时只需要执行,好像是下了个VS2008 distribution 包就可以了。没想到,今天来了个VS2008的解决方案,里面有10几个项目。并且必要要打开分析其源代码,可是又没有VS2008环境。 当然,在VS2005下是不可能直接能打开VS2008的项目的。 再说,咱又不能用盗版的,现在国家抓盗版这么严,连美国都要把咱们国家例如世界盗版观察国了,废话了。 转换步骤: 1. 找到解决方案文件, 即 .sln 文件。在记事本中打开 2. .sln

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008 修改为 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005

.vcproj

<VisualStudioProject ProjectType="Visual C++" Version="9.00" Name="wowmodelview" ProjectGUID="{DCA0C667-2A7A-4FCE-AD02-466F7A380E0C}" RootNamespace="wowmodelview" Keyword="Win32Proj" TargetFrameworkVersion="131072">

开头的这句把9.00改为8.00就可以了。 3. 如果解决方案中还有其他的项目的话,打开每个项目的 .vcproj 文件,将其中的  Version="9.00"
改成 Version = "8.00"   以上,如果项目不是很复杂,且在VS2008中没有用到一些 新的特征的话,(如果用到了新的特征,需要安装 VC2008FeaturePack.ex......

阅读全文(6068) | 评论:0

ReadRegistry与WriteRegistry读写注册表(2010-05-24 16:41:00)

摘要:在安装一些软件的时候,我们会看到一些提示,如 “正在写入注册表”等。在win 32时代,系统启动或者应用程序启动时,会有一个.ini文件会事先被加载。然后系统或者应用程序才能正常运行。但是,现在,我们一般都只需要把启动信息写入注册表,这样就可以很方便的进行读写。 本文,我不打算介绍利用注册表读写一套函数来将如何读写注册表信息。而是想要讲讲ReadRegistry 和 WriteRegistry 这两个函数在VC/MFC编程中如何将一些系统配置信息写入注册表,并在需要的时候读出。 在MFC 程序中,生成Project   的时候会在   InitInstance   中有一句  
   
  SetRegistryKey(_T("Local   AppWizard-Generated   Applications"));   
    
 其中   "Local   AppWizard-Generated   Applications"   是注册表中相对于  
   
  HKEY_CURRENT_USE\Software    的路径,然后当你利用ReadRegistry 和 WriteRegistry 这两个函数对注册表读写都是在该路径下进行操作。比如我们可以把 一些系统全局配置信息写入注册表,然后在需要的时候读出,这样就避免每次都 要进行文件配置。 如下例: void CRealTimeDicDlg::ReadRegistry( void )
{
 DWORD nVersion;
 nVersion = theApp.GetProfileInt( _T(""), _T("Version"), 0 ); if ( GetVersionMJ(nVersion) < REGISTRY_VERSION_MJ )
  return; 
&n......

阅读全文(4476) | 评论:0

文档,视图,框架类之间的关系及其互相调用(2010-02-21 09:58:00)

摘要:
了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。  
  几个概念:  
  (虽然大家都知道了,雷神还是要重申一次)  
  文档对象:是用来保存数据的。  
  视图对象:是用来显示和编辑数据的。  
  应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。  
  文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:  
   
  BOOL   CMyHtmlApp::InitInstance()  
  {  
  //。。。。。。  
  CSingleDocTemplate*   pDocTemplate;  
  pDocTemplate   =   new   CSingleDocTemplate(  
  IDR_MAINFRAME,  
  RUNTIME_CLASS(CMyHtmlDoc),  
  RUNTIME_CLASS(CMainFrame),      ......

阅读全文(3420) | 评论:0

VC 中遍历文件夹(2010-02-09 10:23:00)

摘要:在VC编程中,时常会需要遍历某个文件夹中的文件或者文件夹。这个本身是个非常容易的事。可是我每次都不能完整的记下怎么遍历(可能年龄大了容易忘事)。这样每次就需要重新查询一次。这样不但浪费时间,还有时不能很快查到结果。这里就把这段代码记录下来,免得下次查询,也可以供需要查询的人直接拷贝利用。 find(char * lpPath)
{
    char szFind[MAX_PATH];
    WIN32_FIND_DATA FindFileData;     strcpy(szFind,lpPath);
    strcat(szFind,"\\*.*");     HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)    return;
   
    while(TRUE)
    {
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if(FindFileData.cFileName[0]!='.')
            {
           ......

阅读全文(3834) | 评论:0

VS 2005 下配置Windows 驱动开发环境心得(2010-01-28 16:55:00)

摘要:所谓万事开头难,自己参照《windows驱动开发技术详解》、在网上收集一些资料,终于在VS2005成功配置开发环境。
网上大多讲述的是 VC6.0 还有就是利用 ddkwizard 插件配置环境,VC6.0的配置跟VS2005还是有很大不同的,又因为是初学者觉得用ddkwizard 帮助我们做了很多工作,不利于学习。所以自己一步步在VS2005配置。在这里列出仅供参考:

              预备工作:
1、安装了DDK(呵呵,说句废话)。目录名字最好不要带空格;
2、在VS2005中选择  “生成”|“配置管理器”   ---在活动解决方案配置中 新建一个方案名(不要Debug、Release);
3、选择 ”工具“|”选项“菜单  选择”项目和解决方案“ 选项卡,选择“VC++目录”选项卡   在”显示以下内容的目录“下拉菜单中选择”包含文件“菜单 添加”"C:\WinDDK\5112\inc\crt", "C:\WinDDK\5112\inc\mfc42", "C:\WinDDK\5112\inc\ddk" 和 "C:\WinDDK\5112\inc\api" , 选择”库文件“菜单添加”C:\WinDDK\5112\lib\wxp\i386"。 不同版本的WDM对应中间的数值会不同,我这里是5112, 你的可能不是这个版本,那么这个数值就不同。

接下来就是工程配置属性项
4、选择”项目“|”属性“ 弹出”属性页“对话框   选择”配置属性“选项卡   选择“C/C++”选项卡  
      4.1、再选择”常规“选项卡
                   &n......

阅读全文(4324) | 评论:0

const用法(2009-12-18 14:55:00)

摘要:const 成员函数
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。编译器将指出GetCount 函数中的错误。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};

int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const 函数
return m_num;
}

const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。

关于Const函数的几点规则:

a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
......

阅读全文(2288) | 评论:0