我有一个按钮,它是在 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 但它似乎有点矫枉过正。或者这是唯一的解决方案?
最后,当光标悬停在按钮上时,如何将光标更改为一只手?
我正在使用CoqIDE完成关于Coq的软件基础书中的练习.我可以成功编译Basics.v,在我的目录中生成Basics.vo和Basics.glob.当我尝试运行Induction.v时,它可以工作.当我尝试编译它时,它会抱怨大量缺少的引用,例如evenb和negb_involutive.如果我将Basics.v内容复制到Induction.v中,它会编译,但显然这不是要走的路.
这不是问题的重复Coq错误:在当前环境中找不到引用evenb,因为我已经完成了这些事情:
编译Basics.v.检查Basics.vo是否在目录中.现在编译Induction.v.最后一步失败了.
我正在开发一款类似于桌面游戏风险的游戏,或者是全面战争系列的竞选部分.我目前有一个区域系统的工作实现,但由于性能不佳,游戏在某些命令后挂起.我敢肯定有可能做得更好.
我希望能够呈现一张地图,例如世界地图,并将其划分为区域(例如国家).我希望能够通过点击它们,向它们发送单位以及获取相邻区域来选择区域.
地图由3个文件定义:
"Region Name" "Region Color" "Game-related information" ["Adjacent Region 1", "Adjacent Region 2", ...]'这种颜色图的一个例子:
(所有白色部分在当前实现中评估到相同的区域.想象它们都有不同的颜色).
当我加载这些文件时,我首先加载彩色图像.然后我加载文本文件并遍历每一行.我按照自己的意愿创建了具有正确设置的区域.这里没有真正的性能影响,因为它只是简单地读取数据.然后制作一堆Region对象,并给出正确的颜色.
在这个阶段,一切正常.我可以点击区域,询问彩色图像的像素数据,并通过遍历列表中的所有区域,我可以找到与该特定像素的颜色匹配的区域.
然而,这里是性能影响的地方:
每个玩家都有一堆单位.我希望能够在一个地区产生这些单位.假设我想在红色区域中生成一个单位.我浏览了文件中的所有像素,当我点击红色时,我将单位放在那里.
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)
简单地看一下这个伪代码就可以看出这种方法效果不佳.无论如何,不是以合理的速度.
另一个问题是我想在"漂亮的"地图上为玩家所拥有的区域着色.让我们说玩家一拥有三个区域:蓝色,红色和绿色.然后,我浏览世界地图,在彩色图像上找到蓝色,红色和绿色像素,然后在透明版本的播放器颜色中在"漂亮的"地图上着色这些像素.
然而,这也是一个非常繁重的操作,需要几秒钟.
由于这是一个基于回合制的游戏,所以它不是那么大的交易,游戏慢慢减少.但是,我不喜欢我写这个丑陋的代码.我已经考虑了其他选项,例如将某个区域的每个点存储为浮点数,但这会对内存造成巨大压力(64位乘以3000x1000分辨率的图像很多).
我想知道是否为此创建了算法,或者我是否应该尝试使用更多内存来缓解处理器.我已经寻找其他游戏以及他们如何做到这一点,但无济于事.我还没有找到关于这个或文章的一些源代码.
我故意不在这个问题中放入太多代码,因为它已经相当冗长,并且代码对我的应用程序的其他部分有很多依赖性.但是,如果需要解决问题,我会尽快发布一些内容.
提前致谢!
我正在使用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) 我有一个包含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,以使事情变得更容易.
我有使用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++ ×3
c++11 ×2
button ×1
coq ×1
coqide ×1
memory ×1
memory-leaks ×1
optimization ×1
performance ×1
unique-ptr ×1
vector ×1
winapi ×1