zoukankan      html  css  js  c++  java
  • MFC客户端开发记录

            最近在写一个MFC程序,感觉MFC发展了很多年,应该是趋于完善的;具体表现在:相关的文档比较全,相关功能的Demo可以很方便的google到。因此,在MFC上做一些基本功能应该是没问题的。

    MFC文档

            MSDN上的文档也比较全,相关的文档参考: MFC ReferenceControls (MFC)。本文中,提到的一些功能,并不只和MFC相关。既然用到了,就记在一起,方便查询。

    功能


    托盘图标

            在windows右下角的托盘中,显示图标。此功能比较常见,参考代码如下:
        NOTIFYICONDATAW   m_IconData;
    
        m_IconData.cbSize = sizeof(NOTIFYICONDATAW);
        m_IconData.uCallbackMessage = m_messageId; // Try icon的消息ID
        m_IconData.dwInfoFlags = NIIF_INFO;
        m_IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 设定图标接受的消息
        m_IconData.uID = ID_TRAY_ICON; // 用来区分的icon的ID
        m_IconData.hWnd = hWnd; // 接受消息的窗口
        m_IconData.hIcon = m_hIconOffLine; // IDI_TRAY是在资源文件中定义的ICON的ID,可在资源sheet中用自带工具生成。
        CMsg info(IDS_TRAY_VERSION);
        wcscpy(m_IconData.szTip, info);
    
        Shell_NotifyIcon(NIM_ADD, &m_IconData);
            更多细节可以参考: NOTIFYICONDATA structureShell_NotifyIcon function

    多语言

            多语言的一种简单的实现方式是:定义一个DLL工程,除了创建一份新的rc文件外,加入所有的其它资源文件,修改rc文件中的字符串。然后,采用下面的方式加载到运行的程序中:
        m_hInsChs = LoadLibrary(_T("LangChs.dll")); // LangChs.dll为某个语言对应的dll。
        AfxSetResourceHandle(m_hInsChs);
            可以参考文章 《Internationalization and Multiple Language Support,其中包含了一个可运行、测试的Demo。

    属性页对话框

            MFC中,属性页面对话框,可以用来制作配置页面和向导页面。与它相关联的类为: CPropertySheetCPropertyPage。定义属性页对话框和普通的对话框差不多,此处不赘述。
            若想要修改属性页对话框的一些属性,可以参考文章 《Hacking the CPropertySheet》
            显示属性页对话框,可以参考一下语句:
        if (!m_initializeDialog.m_hWnd) { // 判断对话框是否创建。
            m_initializeDialog.SetWizardMode(); // 切换到向导模式
            m_initializeDialog.Create(); // 创建并显示
        } else {
            m_initializeDialog.SetForegroundWindow(); // 若已创建,则显示出来
        }

    保持文件夹

            所谓保持文件夹,就是将文件夹控制在程序中,防止用户在程序外进行删除等操作。可以参考下面的代码:
        HANDLE hDir = CreateFileW(dirpath, 
                                  GENERIC_READ, 
                                  FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                  NULL, 
                                  OPEN_EXISTING, 
                                  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 
                                  NULL);
            细节可参考文档: CreateFile function

    带颜色的静态文本框

            具体参考文章 《Using colors in CEdit and CStatic ,此文使用了一个类继承并扩展了CStatic控件的功能。

    超链接

            MFC中,有超链接控件,感觉不大好用,于是找了个基于CStatic的自定义控件的文章《Hyperlink control 。若要使用此控件,可能需要对它的源码略作修改。

    选择文件夹对话框

            直接参考文章《CFolderDialog - Selecting Folders 即可,它里面对Windows的API进行了封装,具体细节参考源码。

    MD5转码

            采用文章《Use Windows Crypto API to calculate a MD5 string 内的方案即可。不过这个是非Unicode编码的,使用的时候需要注意。

    附加控制台

            这个功能是指在MFC程序起来的时候,弹出控制台打印,一般用来调试。此部分参考下面语句:
        int hCrt;
        FILE *hf;
        // 创建一个新的控制台
        AllocConsole(); 
        // 绑定到标准输出
        hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
        hf = _fdopen( hCrt, "w" );
        // 替换标准输出stdout,让printf可用
        m_stdoutOld = *stdout;
        *stdout = *hf;
        // 清空输出缓存
        setvbuf( stdout, NULL, _IONBF, 0 );
        // 测试
        printf("my console is running from printf\n");
        std::cout << "my console is running from std::cout" << std::endl;

    回调

            MFC中,难免要用到回调机制,直接采用库sigslot即可,该库只有一个头文件。具体用法参考《libjingle源码分析之一:Signal机制》
  • 相关阅读:
    MATLAB使用fft求取给定音频信号的频率
    python实现抓取必应图片设置桌面
    [原创]Nexus5 移植OneStep
    [原创]Nexus5 内核编译烧录过程记录
    repo版本切换
    pthread
    《Android进阶》Sqlite的使用
    【转】iOS夯实:ARC时代的内存管理
    【转】如何使App从后台返回前台时,显示指定界面
    【转】自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3022882.html
Copyright © 2011-2022 走看看