对话框编程技巧

一、如何往基于Dialog的程序添加菜单

[1.1] 先添加菜单(IDR_MENU1)资源,并加上需要的菜单项。
[1.2] 编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。


[1.3] 假如您不希望在对话框属性中直接设置菜单,而通过代码在程序中动态生成可以采用如下方法:

[1.3.1]在CDlgMenuToolbarDlg类声名中添加成员变量CMenu m_menu
再在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码: //加载菜单
m_menu.LoadMenu(IDR_MENU1);
//设置当前菜单
SetMenu(&m_menu);
//当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
二、如何往基于Dialog的程序添加工具栏

[2.1] 先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
[2.2] 在CDlgMenuToolbarDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
[2.3] 在CDlgMenuToolbarDlg::OnInitDialog() 中添加如下代码  //添加一个平面工具条
if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,
    CRect(4,4,0,0)) ||    !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
{
    TRACE0("failed to create toolbar/n");
    return FALSE;
}
m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
三、为工具栏添加工具提示

[3.1] 在CDlgMenuToolbarDlg类定义中手工添加消息映射函数的定义,如下黑体部分       //{{AFX_MSG(CDlgMenuToolbarDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

[3.2] 在CDlgMenuToolbarDlg.cpp添加函数的实现代码 //工具栏提示
BOOL CDlgMenuToolbarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
    ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
    
    // UNICODE消息
    TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
    //TCHAR szFullText[512];
    CString strTipText;
    UINT nID = pNMHDR->idFrom;
    
    if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
        pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
    {
        // idFrom为工具条的HWND 
        nID = ::GetDlgCtrlID((HWND)nID);
    }
    
    if (nID != 0) //不为分隔符
    {
        strTipText.LoadString(nID);
        strTipText = strTipText.Mid(strTipText.Find('/n',0)+1);
        
#ifndef _UNICODE
        if (pNMHDR->code == TTN_NEEDTEXTA)
        {
            lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
        }
        else
        {
            _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
        }
#else
        if (pNMHDR->code == TTN_NEEDTEXTA)
        {
            _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
        }
        else
        {
            lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
        }
#endif
        
        *pResult = 0;
        
        // 使工具条提示窗口在最上面
        ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
            SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); 
        return TRUE;
    }
    return TRUE;
}

[3.3] 在CDlgMenuToolbarDlg.cpp中添加消息映射,请看如下代码中的黑体部分 BEGIN_MESSAGE_MAP(CDlgMenuToolbarDlg, CDialog)
    //{{AFX_MSG_MAP(CDlgMenuToolbarDlg)
    ON_WM_PAINT()
    ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

四、永远在最前面的对话框
void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
if (nState == WA_INACTIVE)
{
SetForegroundWindow();
SetWindowPos(&wndTopMost,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
}
}


五、其它
为了使你的程序看起来更酷,还可以在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色。
CPaintDC dc(this);
CRect rect; 
GetClientRect(rect); 
dc.FillSolidRect(rect, RGB(60,110,170)); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是微软开发的一套用于Windows操作系统的编程框架。在MFC编程中,有一些技巧和实例可以帮助开发人员更好地使用和理解MFC。 首先,MFC编程中的一个重要技巧是使用消息映射和消息处理函数。消息映射是将窗口消息与处理函数相关联的一种机制。通过消息映射,开发人员可以指定某个窗口消息由哪个函数来处理。这样一来,窗口消息到来时,系统会自动调用相应的处理函数进行处理。例如,可以使用消息映射实现对按钮的点击响应,对菜单项的选择响应等。 另一个重要的技巧是使用资源编辑器创建界面。MFC中的资源编辑器可以帮助开发人员以可视化的方式创建用户界面,包括窗口、按钮、菜单等。使用资源编辑器可以轻松地布局界面,并为控件设置属性和事件处理函数,省去了手动编写代码的工作量。 此外,MFC编程中的一个常见实例是创建对话框应用程序。对话框是一种常见的用户界面,可以用于显示和收集用户输入信息。通过MFC提供的对话框类,开发人员可以方便地创建、显示和处理对话框应用程序。可以通过资源编辑器创建对话框界面,然后通过消息映射和消息处理函数来实现对用户输入的响应。 总之,MFC编程技巧包括使用消息映射和消息处理函数,利用资源编辑器创建界面等。一个常见的实例是创建对话框应用程序。掌握了这些技巧和实例,开发人员可以更快速、高效地开发Windows应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值