小编for*_*idt的帖子

如何在CTreeCtrl中显示自定义工具提示?

我有一个源自的课程CTreeCtrl。在OnCreate()我用CToolTipCtrl自定义对象替换默认对象:

int CMyTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Replace tool tip with our own which will
    // ask us for the text to display with a TTN_NEEDTEXT message
    CTooltipManager::CreateToolTip(m_pToolTip, this, AFX_TOOLTIP_TYPE_DEFAULT);
    m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK);
    SetToolTips(m_pToolTip);

    // Update: Added these two lines, which don't help either
    m_pToolTip->Activate(TRUE);
    EnableToolTips(TRUE);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的消息处理程序如下所示:

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyTreeCtrl::OnTtnNeedText)
Run Code Online (Sandbox Code Playgroud)

但是,我从未收到任何TTN_NEEDTEXT消息。我查看了Spy ++,它看起来也好像从未发送过此消息。

这可能是什么问题?

更新资料

我不确定这是否相关:CTreeCtrl的父窗口的类型为CDockablePane。可能需要一些额外的工作才能使它正常工作吗?

c++ mfc tooltip mfc-feature-pack

3
推荐指数
1
解决办法
7671
查看次数

使用boost :: variant iterator"无法转换参数"

我想创建一个函数,它可以使用不同类型的迭代器来存储相同类型的对象:
第一个是std::map包含shared_ptr<Foo>(typedef-ed as FooMap),另一个是std::list包含shared_ptr<Foo>(FooList)的.

我非常喜欢MSalters为类似问题提出的解决方案并试图实现boost::variant迭代器,该函数将作为参数从第一个迭代到第二个迭代.

我的函数看起来像这样(简化了很多):

set<Foo> CMyClass::GetUniqueFoos(FooIterator itBegin, FooIterator itEnd)
{
    set<Foo> uniques;
    for(/**/;
        apply_visitor(do_compare(), itBegin, itEnd);  // equals "itBegin != itEnd"
        apply_visitor(do_increment(), itBegin))       // equals "++itBegin"
    {
        // Exact mechanism for determining if unique is omitted for clarity
        uniques.insert( do_dereference< shared_ptr<Foo> >(), itBegin) );
    }

    return uniques;
}
Run Code Online (Sandbox Code Playgroud)

FooIterator和访问者定义如下:

typedef
    boost::variant<
        FooMap::const_iterator,
        FooList::const_iterator>
    FooIterator;

struct do_compare : boost::static_visitor<bool>
{
    bool operator() (
        const …
Run Code Online (Sandbox Code Playgroud)

c++ iterator boost-variant visual-c++-2008

3
推荐指数
1
解决办法
1928
查看次数

如何关闭动态创建的CDockablePane窗口?

在我的MFC(Feature Pack)应用程序中,可以动态创建停靠窗格以显示图表/表格等.
但是,我不想让用户打开相同的东西两次.

我创建一个像这样的窗格:

// Create CMyDockablePane pPane
pPane->Create(...);
pPane->EnableDocking(CBRS_ALIGN_ANY);
// Create CRect rcPane
pPane->FloatPane(rcPane);
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.

这就是我尝试检查窗格是否已存在的方法.窗格由其类型(类)和参数标识.

BOOL CanOpenPane(const type_info & paneType, const CMyParameter & parameter) const
{
    CMainFrame* pFrm = GetMainFrame();
    CDockingManager* pDockMan = pFrm->GetDockingManager();


    // Check if there already is a pane of the same type which also has the same parameter.
    bool canOpen = true;
    CObList panes;
    pDockMan->GetPaneList(panes);
    POSITION pos = panes.GetHeadPosition();
    while (pos)
    {
        CMyDockablePane* pPane = dynamic_cast<CMyDockablePane*>(panes.GetNext(pos));
        if (NULL == pPane) { continue; }

        if …
Run Code Online (Sandbox Code Playgroud)

c++ docking mfc-feature-pack pane

2
推荐指数
1
解决办法
6410
查看次数

动态分配成员的指针或引用始终存在?

我有一个类CContainer,它有一些成员CMemberX,CMemberY,这是相互独立和其他的CClientA,CClientB阶级使用CContainer.

#include "MemberX.h"
#include "MemberY.h"

class CContainer
{
public:
    CMemberX & GetX() const { return m_x; }
    CMemberY & GetY() const { return m_y; }

private:
    CMemberX m_x;
    CMemberY m_y;
};
Run Code Online (Sandbox Code Playgroud)

我想避免在使用前向声明和动态分配和CClient修改其中一个类时重新编译所有类.CMemberm_xm_y

最初,我做了成员指针:

// Container.h
class CMemberX;
class CMemberY;

class CContainer
{
public:
    CContainer();
    ~CContainer();

    CMemberX & GetX() const { ASSERT(m_pX != NULL); return *m_pX; }
    CMemberY & GetY() const { ASSERT(m_pY != …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference member

2
推荐指数
1
解决办法
1159
查看次数

用一个参数调用重载函数,但我以为我已经通过了两个

我最近重构了这样的代码(MyClassto MyClassR).

#include <iostream>

class SomeMember
{
public:
  double m_value;

  SomeMember() : m_value(0) {}
  SomeMember(int a) : m_value(a) {}
  SomeMember(int a, int b)
  : m_value(static_cast<double>(a) / 3.14159 +
            static_cast<double>(b) / 2.71828)
  {}
};


class MyClass
{
public:
SomeMember m_first, m_second, m_third;

MyClass(const bool isUp, const int x, const int y)
{
  if (isUp)
  {
    m_first = SomeMember(x);
    m_second = SomeMember(y);
    m_third = SomeMember(x, y);
  }
  else
  {
    m_first = SomeMember(y);
    m_second = SomeMember(x);
    m_third = SomeMember(y, x); …
Run Code Online (Sandbox Code Playgroud)

c++ refactoring ternary-operator

2
推荐指数
1
解决办法
454
查看次数

哪一个会更快

只需在代码中略微修改即可计算两个数组的总和

int main()

{

    int a[10000]={0};   //initialize something
    int b[10000]={0};   //initialize something

    int sumA=0, sumB=0;

    for(int i=0; i<10000; i++)
    {
        sumA += a[i];
        sumB += b[i];
    }
        printf("%d %d",sumA,sumB);

}
Run Code Online (Sandbox Code Playgroud)

要么

int main()

{

    int a[10000]={0};   //initialize something
    int b[10000]={0};   //initialize something

    int sumA=0, sumB=0;

    for(int i=0; i<10000; i++)
    {
        sumA += a[i];

    }

        for(int i=0; i<10000; i++)
    {       
        sumB += b[i];
    }
        printf("%d %d",sumA,sumB); 
}
Run Code Online (Sandbox Code Playgroud)

哪个代码会更快.

c c++ performance refactoring

1
推荐指数
4
解决办法
609
查看次数

如何定位Debian稳定但在测试中发展?

我们有一些专门开发的C++应用程序,仅适用于Debian stable(x86).

目前,这些应用程序的开发也是使用Debian stable(x86)系统完成的,因此开发人员拥有与目标系统相同的库版本.
偶尔,我还需要处理这些组件,并且一直困扰我,因为我坚持使用非常过时的KDevelop版本(4.0.1与最新的4.4.1).我想使用更新的系统进行开发(比如最新的Ubuntu或Debian测试),但是如何创建适合目标系统的二进制文件呢?
是否有一些简单的方法可以告诉编译器/链接器只使用目标平台上可用的库版本?
我看了Emdebian和他们的交叉编译包,但我不认为这对我有用.他们似乎只有针对ARM等其他架构的软件包.

linux debian chroot cross-compiling binary-compatibility

1
推荐指数
1
解决办法
441
查看次数

使用boost :: spirit :: karma生成时如何避免boost :: phoenix

我是错误"LNK1179:无效或损坏的文件:重复COMDAT"的受害者,这些 来源让我相信,通过不使用phoenix我可以避免此错误.

(这是我之前的问题的后续行动.)我想boost::phoenix用其他东西替换.也许,boost::bind但我不知道如何让它访问karma::_val.

以下代码无法在VC9上编译

错误C2825:'F':当后跟'::'时必须是类或命名空间

#include <boost/config/warning_disable.hpp>

#include <boost/foreach.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>

#include <boost/bind.hpp>

#include <iostream>
#include <string>
#include <list>


namespace karma = boost::spirit::karma;
namespace spirit = boost::spirit;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;


class Item
{
public:
    typedef std::vector<int> Values;

    Item(const std::string  & i, const Values & v) : m_id(i), m_values(v) {}
    std::string getId() const { …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-bind boost-spirit boost-phoenix

1
推荐指数
1
解决办法
1304
查看次数

Java在任何情况下都可以更快地使用C++吗?

Java应用程序是否可能比用C++编写的程序更快?另外,编译中的发布模式是什么?

c++ java performance

0
推荐指数
3
解决办法
5922
查看次数

将枚举值转换为整数值时,如何避免编译器警告?

我创建了一个CMyClassCTor采用UCHARas参数的类.该参数可以具有各种枚举的值(都保证适合a UCHAR).我需要转换这些值,UCHAR因为库函数要求其参数作为该类型.

我必须创建很多这些消息对象并节省我使用的打字工作boost::assign:

std::vector<CMyClass> myObjects;
        boost::assign::push_back(myObjects)
            (MemberOfSomeEnum)
            (MemberOfSomeEnum);

std::vector<CMyClass> myOtherObjects;
        boost::assign::push_back(myObjects)
            (MemberOfAnotherEnum)
            (MemberOfAnotherEnum);
Run Code Online (Sandbox Code Playgroud)

上面的代码CMessage用两个枚举成员中的每一个调用CTor,然后将它们放在一个列表中.我的问题是,这段代码在VC++ 9上抛出警告C4244(在从枚举转换为UCHAR期间可能丢失数据).

我目前的解决方案是为每个枚举类型创建一个转换函数:

static UCHAR ToUchar(const SomeEnum eType)
{
    return static_cast<UCHAR>(eType);
}

static UCHAR ToUchar(const AnotherEnum eType)
{
    return static_cast<UCHAR>(eType);
}
Run Code Online (Sandbox Code Playgroud)

然后上面的代码如下所示:

std::vector<CMyClass> myObjects;
        boost::assign::push_back(myObjects)
            (ToUchar(MemberOfSomeEnum))
            (ToUchar(MemberOfSomeEnum));

std::vector<CMyClass> myOtherObjects;
        boost::assign::push_back(myObjects)
            (ToUchar(MemberOfAnotherEnum))
            (ToUchar(MemberOfAnotherEnum));
Run Code Online (Sandbox Code Playgroud)

这是迄今为止我能想到的最干净的方法.

有没有更好的方法?
也许boost有一些不错的东西可供选择?

我不想用pragma语句禁用警告,我无法修改枚举.

c++ enums boost integer

0
推荐指数
1
解决办法
764
查看次数

Linux上的增长文件是否需要花费任

这两种情况之间的速度是否存在明显差异?

场景1:我有一个大小为1024字节的文件,每个字节都填充0.我打开文件,用fwrite写入1024字节的1s.

场景2:我有一个大小为512字节的文件,每个字节都填充0.我打开文件,用fwrite写入1024字节的1s.

显然我最终得到了相同的文件,但在调整磁盘上的第二个文件时是否有任何损失?

我正在尝试确定在使用它们之前调整文件大小是否有任何价值.奖励指向任何能够向我展示一些Linux文档以证明这一点的人.

c++ linux performance disk

0
推荐指数
1
解决办法
203
查看次数