小编Rap*_*Cpp的帖子

从 win32 按钮中删除边框

我有一个按钮,它是在 Win32 应用程序的 WM_CREATE 函数中创建的,代码如下:

hChangeWorldButton = CreateWindowEx(NULL,
    "BUTTON",
    "OK",
    WS_CHILD | WS_VISIBLE | BS_FLAT | BS_BITMAP,
    2,
    2,
    25,
    25,
    hWnd,
    (HMENU)CHANGEWORLD_BUTTON,
    GetModuleHandle(NULL),
    NULL);
SendMessage(hChangeWorldButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)worldBmp);
Run Code Online (Sandbox Code Playgroud)

我希望按钮仅显示图像。不是背景和边框。

我怎样才能做到这一点?我从MSDN尝试了许多不同的按钮样式,但似乎没有什么适合我的需要。我正在考虑使用 BS_OWNERDRAW 但它似乎有点矫枉过正。或者这是唯一的解决方案?

最后,当光标悬停在按钮上时,如何将光标更改为一只手?

winapi button

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

在当前环境中找不到引用"X"

我正在使用CoqIDE完成关于Coq的软件基础书中的练习.我可以成功编译Basics.v,在我的目录中生成Basics.vo和Basics.glob.当我尝试运行Induction.v时,它可以工作.当我尝试编译它时,它会抱怨大量缺少的引用,例如evenbnegb_involutive.如果我将Basics.v内容复制到Induction.v中,它会编译,但显然这不是要走的路.

这不是问题的重复Coq错误:在当前环境中找不到引用evenb,因为我已经完成了这些事情:

编译Basics.v.检查Basics.vo是否在目录中.现在编译Induction.v.最后一步失败了.

coq coqide

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

存储游戏中的等级数据,如风险或全面战争

我正在开发一款类似于桌面游戏风险的游戏,或者是全面战争系列的竞选部分.我目前有一个区域系统的工作实现,但由于性能不佳,游戏在某些命令后挂起.我敢肯定有可能做得更好.

我想做的事

我希望能够呈现一张地图,例如世界地图,并将其划分为区域(例如国家).我希望能够通过点击它们,向它们发送单位以及获取相邻区域来选择区域.

我试过的

地图由3个文件定义:

  • 一个文本文件,其中包含如下格式的数据: "Region Name" "Region Color" "Game-related information" ["Adjacent Region 1", "Adjacent Region 2", ...]'
  • 一个图像文件,其中每个区域由黑色边框分隔并具有自己的颜色.因此,例如,可以存在两个区域,一个具有RGB值255,0,0(红色),另一个具有255,255,255(白色).它们由黑色边框分隔(但这不是算法工作所必需的).
  • 另一个图像文件,即绘制到屏幕的实际图像.这是"漂亮的"地图.

这种颜色图的一个例子: 彩色地图 (所有白色部分在当前实现中评估到相同的区域.想象它们都有不同的颜色).

当我加载这些文件时,我首先加载彩色图像.然后我加载文本文件并遍历每一行.我按照自己的意愿创建了具有正确设置的区域.这里没有真正的性能影响,因为它只是简单地读取数据.然后制作一堆Region对象,并给出正确的颜色.

在这个阶段,一切正常.我可以点击区域,询问彩色图像的像素数据,并通过遍历列表中的所有区域,我可以找到与该特定像素的颜色匹配的区域.

问题

然而,这里是性能影响的地方:

问题1:单位

每个玩家都有一堆单位.我希望能够在一个地区产生这些单位.假设我想在红色区域中生成一个单位.我浏览了文件中的所有像素,当我点击红色时,我将单位放在那里.

for(int i = 0; i < worldmap.size(); i++) {
    for(int j = 0; j < worldmap[i].size(); j++) {
         if(worldmap[i][j].color == unit_color) {
              // place it here
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

简单地看一下这个伪代码就可以看出这种方法效果不佳.无论如何,不​​是以合理的速度.

问题2:区域着色

另一个问题是我想在"漂亮的"地图上为玩家所拥有的区域着色.让我们说玩家一拥有三个区域:蓝色,红色和绿色.然后,我浏览世界地图,在彩色图像上找到蓝色,红色和绿色像素,然后在透明版本的播放器颜色中在"漂亮的"地图上着色这些像素.

然而,这也是一个非常繁重的操作,需要几秒钟.

我想问的是什么

由于这是一个基于回合制的游戏,所以它不是那么大的交易,游戏慢慢减少.但是,我不喜欢我写这个丑陋的代码.我已经考虑了其他选项,例如将某个区域的每个点存储为浮点数,但这会对内存造成巨大压力(64位乘以3000x1000分辨率的图像很多).

我想知道是否为此创建了算法,或者我是否应该尝试使用更多内存来缓解处理器.我已经寻找其他游戏以及他们如何做到这一点,但无济于事.我还没有找到关于这个或文章的一些源代码.

我故意不在这个问题中放入太多代码,因为它已经相当冗长,并且代码对我的应用程序的其他部分有很多依赖性.但是,如果需要解决问题,我会尽快发布一些内容.

提前致谢!

optimization performance

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

为什么我有内存泄漏?

我正在使用VLD来检测我用C++编写的游戏中的内存泄漏.它直到最近才报告没有泄漏.我有一个SettingsManager类(所有静态方法),它加载设置并可以保存它们(文件I/O).以下是我将"key = value"设置列表加载到向量中的方法:

std::vector<Setting*> settings;
SettingsManager::loadFromFile(settingsLocation + "display" + settingsExtension, settings);
Run Code Online (Sandbox Code Playgroud)

正确填充此向量,我可以进一步处理数据.loadFromFile()方法实现如下:

std::ifstream file;
file.open(filename);
if(file.is_open())
{
    std::string line;
    unsigned pos;
    while(file.good())
    {
        Setting* s = new Setting;
        getline(file, line);
        if(line.empty())
        {
            // do not read empty lines
            continue;
        }
        // parse to Setting
        pos = line.find('=');
        s->key = line.substr(0, pos);
        s->value = line.substr(pos + 1);
        // add to vector
        settings.push_back(s);
    }
    file.close();
    return true;
}
else
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

因此,这会分配Settings(这是一个带有两个std :: string变量的简单结构).我通过以下方法调用从我调用loadFromFile方法的位置删除它们:

SettingsManager::deleteSettings(settings);
Run Code Online (Sandbox Code Playgroud)

实现如下:

void SettingsManager::deleteSettings(std::vector<Setting*>& settings)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ memory memory-leaks visual-studio-2010

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

将unique_ptr传递给将其添加到向量的函数

我有一个包含unique_ptr向量的类.该类还有一个向向量添加元素的方法.

class PointerVector
{
  public:
    void addPointer(std::unique_ptr<int> p);

  private:
    std::vector<std::unique_ptr<int>> mPointers;
};
Run Code Online (Sandbox Code Playgroud)

addPointer方法的定义:

void PointerVector::addPointer(std::unique_ptr<int> p)
{
  mPointers.emplace_back(std::move(p));
}
Run Code Online (Sandbox Code Playgroud)

所以我std::move用来转移指针的所有权.

当我打电话时addPointer,我也使用std::move:

PointerVector pv;
std::unique_ptr<int> i(new i(1));
pv.addPointer(std::move(i));
Run Code Online (Sandbox Code Playgroud)

这是正确的做事方式吗?感觉就像一个麻烦不得不一直打电话std::move.

编辑:我实际上想要将unique_ptr的向量保存到类中,但我想先尝试使用int,以使事情变得更容易.

c++ vector unique-ptr c++11

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

C++ 11线程没有加入

我有使用Java的线程的经验,但想学习如何在C++ 11中使用它们.我试图创建一个简单的线程池,其中线程被创建一次,可以被要求执行任务.

#include <thread>
#include <iostream>

#define NUM_THREADS 2

class Worker
{
public:
    Worker(): m_running(false), m_hasData(false)
    {

    };
    ~Worker() {};

    void execute()
    {
        m_running = true;

        while(m_running)
        {
            if(m_hasData)
            {
                m_system();
            }
            m_hasData = false;
        }
    };

    void stop()
    {
        m_running = false;
    };

    void setSystem(const std::function<void()>& system)
    {
        m_system = system;
        m_hasData = true;
    };

    bool isIdle() const
    {
        return !m_hasData;
    };
private:
    bool m_running;
    std::function<void()> m_system;
    bool m_hasData;
};

class ThreadPool
{
public:
    ThreadPool()
    {
        for(int i = …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++11

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