当前位置:编程学习 > C/C++ >>

MFC客户端开发记录

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

MFC文档

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


功能


托盘图标

        在windows右下角的托盘中,显示图标。此功能比较常见,参考代码如下:
[cpp]
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); 

    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 structure,Shell_NotifyIcon function。


多语言

        多语言的一种简单的实现方式是:定义一个DLL工程,除了创建一份新的rc文件外,加入所有的其它资源文件,修改rc文件中的字符串。然后,采用下面的方式加载到运行的程序中:

[cpp]
m_hInsChs = LoadLibrary(_T("LangChs.dll")); // LangChs.dll为某个语言对应的dll。  
AfxSetResourceHandle(m_hInsChs); 

    m_hInsChs = LoadLibrary(_T("LangChs.dll")); // LangChs.dll为某个语言对应的dll。
    AfxSetResourceHandle(m_hInsChs);        可以参考文章《Internationalization and Multiple Language Support》,其中包含了一个可运行、测试的Demo。


属性页对话框
        MFC中,属性页面对话框,可以用来制作配置页面和向导页面。与它相关联的类为:CPropertySheet和CPropertyPage。定义属性页对话框和普通的对话框差不多,此处不赘述。

        若想要修改属性页对话框的一些属性,可以参考文章《Hacking the CPropertySheet》。
        显示属性页对话框,可以参考一下语句:
[cpp]
if (!m_initializeDialog.m_hWnd) { // 判断对话框是否创建。  
    m_initializeDialog.SetWizardMode(); // 切换到向导模式  
    m_initializeDialog.Create(); // 创建并显示  
} else { 
    m_initializeDialog.SetForegroundWindow(); // 若已创建,则显示出来  

    if (!m_initializeDialog.m_hWnd) { // 判断对话框是否创建。
        m_initializeDialog.SetWizardMode(); // 切换到向导模式
        m_initializeDialog.Create(); // 创建并显示
    } else {
        m_initializeDialog.SetForegroundWindow(); // 若已创建,则显示出来
    }

保持文件夹

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

    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程序起来的时候,弹出控制台打印,一般用来调试。此部分参考下面语句:
[cpp]

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,