我有一个非常简单的类,它继承自System.Windows.Forms.Form并删除了WS_CAPTION窗口样式.它完全适用于Windows XP和7.在Windows 10中,仍然会绘制一段标题栏,使用自定义标题栏控件时它看起来很难看.
我知道有几种方法可以实现这种外观,但我选择这种方法的原因有很多.我对替代方法不感兴趣 - 这不是我的问题的意图.
我的问题是在Windows 10与Windows 7中呈现这种方式之间的差异是什么?差异不仅仅是风格.即使已删除WS_CAPTION标志,看起来仍然以某种身份呈现标题栏.
class BorderlessForm : System.Windows.Forms.Form
{
protected override System.Windows.Forms.CreateParams CreateParams
{
get
{
var _CreateParams = base.CreateParams;
_CreateParams.Style &= ~0x00C00000; // remove WS_CAPTION
return _CreateParams;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Windows 7截图(所需外观与MSDN描述一致):
Windows 10截图(不良外观与MSDN描述不一致):
我有一个有趣的例子,试图在模板函数中有分支,其中路径依赖于模板类型实现的接口.然后该分支确定返回值的构造函数.我不确定这种分支是否可行.可以选择将功能拆分为两个不同的功能,并让用户调用与所需分支对应的功能.
我的问题是双重的:
如何根据接口实现执行if语句?
如何在未实现接口时获取编译功能?例如int,没有带有两个参数的构造函数.
template<typename T>
T GetObject()
{
// If T implements interface, call interface constructor
if(typeid(T) implements inteface IInterface) // How can this be done?
return T(1, 2);
// If T does not implement the interface, call parameterless constructor
else
return T();
}
Run Code Online (Sandbox Code Playgroud) 我有用C++编写的DirectX11 Engine,带有CLR的C++包装器和C#中的接口.
1)我很好奇这个结构中的瓶颈在哪里,我想知道是否有更有效的方法让我在WinForms控件中托管DirectX11渲染.
2)有没有办法在WinForms控件的所有者以外的线程上呈现?我怀疑它,但我想问.
3)有没有办法渲染多个帧而不通过每个帧上的包装层但保持应用程序响应?
我已经将这个设置与SlimDX进行了比较,实际上只是清除屏幕并且没有进行任何其他API调用时,FPS稍微变慢了.SlimDX~3000 FPS,我的引擎~2000 FPS.这不是什么大问题,但我想知道这33%的差异来自哪里,因为它可能会在以后比较20 fps到30时产生影响.
我将介绍当前的设置并尽可能多地描述.我相信一路上人们会要求更多信息,我会根据需要更新.
我的WinForms GraphicsPanel控件如下.它将系统消息传递给包装层.
public class GraphicsPanel : Control
{
EngineWrapper Engine;
public GraphicsPanel()
{
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.UserMouse, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.TabStop = true;
}
public void SetEngine(EngineWrapper Engine)
{
this.Engine = Engine;
Application.Idle += OnApplicationIdle;
}
~GraphicsPanel()
{
System.Windows.Forms.Application.Idle -= OnApplicationIdle;
}
void PassMessage(Message m)
{
Engine.ProcessWindowMessage(m.Msg, m.WParam, m.LParam);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
PassMessage(m);
}
private void OnApplicationIdle(object sender, EventArgs …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含两个枚举的类.
enum NameType { Defined, Inherited };
enum ValueType { Defined, Inherited };
Run Code Online (Sandbox Code Playgroud)
数字值在第二个枚举中被称为"先前定义",因为它们与第一个枚举具有相同的名称.是否有简洁的语法并允许这些名称?
我知道在C#中这不是问题,但在C++中它似乎是.我正在使用C++ 11.
之前已经问过这个问题,但没有得到满意的答复.
我有一个充当事件处理程序的类,我希望有一个很好的语法来调用事件之外的事件处理程序.这归结为覆盖()运算符.我现在有
class EventHandler
{
public:
void Call(void* sender, EventArgs e);
void operator() (void* sender, EventArg e){ Call(sender, e); }
};
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.我可以通过调用事件处理程序
EventHandler EH;
EH(nullptr, EventArgs::Empty());
Run Code Online (Sandbox Code Playgroud)
我的问题在于我通常将事件处理程序存储在堆上,因此我需要
EventHandler* EH;
EH(nullptr, EventArgs::Empty()); // error but this is the syntax I'm hoping for
Run Code Online (Sandbox Code Playgroud)
但这只能用
EventHandler* EH;
(*EH)(nullptr, EventArgs::Empty()); // no error
Run Code Online (Sandbox Code Playgroud)
如何覆盖()运算符以使其与指向EventHandler对象的指针一起使用?我已经看到一些看起来像重载 - >()运算符而不仅仅是()运算符的东西,但我无法弄清楚它.
我以前见过这个问题,但不清楚或与我遇到的情况相同.
我有一个抽象的基类.它有一个受保护的构造函数和一个析构函数.它由几个完整的类型继承,它们也有公共构造函数和析构函数.我遇到的问题是,如果对象被基类型引用,则删除对象不会调用子析构函数.
class Tree
{
protected:
Tree(){ }
public:
~Tree(){ }
};
class OakTree : public Tree
{
public:
OakTree(){ }
~OakTree(){ }
};
vector<Tree*> Trees; // Store objects using the base type
Trees.push_back(new OakTree()); // Create derived object
delete Trees[0]; // OakTree desctructor does not get called
Run Code Online (Sandbox Code Playgroud)
如何调用OakTree析构函数?我已经尝试将所有析构函数标记为虚拟,但这不起作用.基类析构函数不能是抽象的(这将解决调用问题,但不能解决删除问题).
假设我有一个用于标志的枚举,即
enum Flags { Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2 };
Run Code Online (Sandbox Code Playgroud)
如果给出一个Flags值,我想知道该值的位移是什么.基本上,因为Flag1我想返回0,因为Flag2我想返回1,等等.除了使用带switch语句的函数之外,任何人都可以想到这样做的方法.
我想要这个因为我有一个数据数组,函数的返回值是这个数组的元素之一.要返回的元素取决于将哪个标志传递给函数.
我想以更简洁的方式执行以下操作.特别是如果我修改枚举,我不需要返回并修改此功能.
myobj* objects[3] = { obj1, obj2, obj3 };
myobj* GetObj(Flags FlagValue)
{
switch(FlagValue)
{
case Flag1:
return objects[0];
case Flag2:
return objects[1];
case Flag3:
return objects[2];
}
}
Run Code Online (Sandbox Code Playgroud) 令人震惊的是,这种情况发生了,我没有解释.由visual studio创建的简单控制台应用程序:
#include <stdlib.h>
#include <crtdbg.h>
#include "stdafx.h"
#include "ConsoleApplication.h"
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
double a;
a = 3.4;
return 0; // <======= Debug break point set here
}
Run Code Online (Sandbox Code Playgroud)
其值为a3.3999999999999999而不是3.4.对于大多数程序员来说这不是问题,但为什么数字3.4不能完全存储为double?考虑二进制它没有意义.
c++ ×7
c++11 ×3
c# ×2
enums ×2
inheritance ×2
winforms ×2
.net ×1
bit-shift ×1
directx-11 ×1
templates ×1