小编Sau*_*aul的帖子

如何清除Direct2D渲染目标以使其完全透明

我试图在一个看不见的HWND上绘制半透明的矩形.但是,使用ID2D1HwndRenderTarget :: Clear清除窗口只会使整个窗口变黑,所以当我在顶部绘制矩形时,它们看起来是半黑色的.

如果我没有Clear()并且没有绘制,那么窗口是不可见的,因为它应该是.Clear()是罪魁祸首; 但是,如果我不使用它,那么绘画就会非常糟糕.

这是我在WindowProc中使用的代码:

case WM_PAINT:
    // Begin drawing
    pRenderTarget->BeginDraw();
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

    // Clear the window
    pRenderTarget->Clear();

    // Paint the panel and its children
    D2DSurface()->StartPainting();
    {
        D2DSurface()->PaintTraverse(panel);
    }
    D2DSurface()->FinishPainting();

    // Finish drawing
    HRESULT hr = plat->pRenderTarget->EndDraw();
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c c++ transparency hwnd direct2d

7
推荐指数
3
解决办法
8518
查看次数

正常关闭TCP套接字

我正在用C++编写一个IRC客户端,目前我遇到了一个问题,退出后,我做了:

Send("QUIT :Quit\r\n"); // just an inline, variadic send() wrapper
shutdown(m_hSocket, SD_BOTH);
closesocket(m_hSocket);

WSAShutdown();

但是,问题是没有发送QUIT消息.我嗅到了来自客户端的数据包,实际上这条消息从未发送过.我认为这是套接字没有被刷新的问题,但我不知道如何做到这一点,谷歌建议禁用Nagle算法,但我怀疑这是一个好习惯.

提前致谢.

c++ sockets irc tcp winsock

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

计算套接字上传速度

我想知道是否有人知道如何计算C++中Berkeley套接字的上传速度.我的发送呼叫没有阻塞,需要0.001秒才能发送5兆字节的数据,但需要一段时间来收回响应(所以我知道它正在上传).

这是HTTP服务器的TCP套接字,我需要异步检查已上载/剩余的数据字节数.但是,我在Winsock中找不到任何API函数,所以我很难过.

任何帮助将不胜感激.

编辑:我找到了解决方案,并将尽快发布作为答案!

编辑2:作为答案添加适当的溶液,将在4小时内作为溶液添加.

c++ sockets performance winsock

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

如何读取和写入字节数组的位

我有一个unsigned char缓冲区,我想知道如何写入和读取有符号和无符号位到这个字节缓冲区.

Source Engine中有一个名为bf_write的类,其中两个主要方法(由WriteString,WriteChar,WriteLong等使用)使用两个名为WriteUBitLongWriteSBitLong的函数.

提前致谢

c c++ buffer class bit

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

模糊模板函数特化编译错误

我目前正在尝试创建一组转换函数,通过一次调用,可以(尝试)将JavaScript对象(CefV8Value)转换为其C++对应函数,并支持指针.

以下是转换函数(结尾处的指针转换):

template<typename T>
T convert_v8value_to_cpp(const CefRefPtr<CefV8Value> &value) {};

// Explicit type conversion functions
#define V8VALUE_TO_CPP_CONVERSION(type) \
      template<> type \
      convert_v8value_to_cpp<type>(const CefRefPtr<CefV8Value> &value)

V8VALUE_TO_CPP_CONVERSION(CefRefPtr<CefV8Value>)
{
    return value;
}

V8VALUE_TO_CPP_CONVERSION(bool)
{
    return value->GetBoolValue();
}

V8VALUE_TO_CPP_CONVERSION(int)
{
    return value->GetIntValue();
}

V8VALUE_TO_CPP_CONVERSION(std::string)
{
    return value->GetStringValue().ToString();
}

V8VALUE_TO_CPP_CONVERSION(const char *)
{
    return value->GetStringValue().ToString().c_str();
}

V8VALUE_TO_CPP_CONVERSION(std::wstring)
{
    return value->GetStringValue().ToWString();
}

// HACKHACK: most VGUI functions take non-const wchar_t pointers, when they
// shouldn't
V8VALUE_TO_CPP_CONVERSION(wchar_t *)
{
    return (wchar_t*)value->GetStringValue().ToWString().c_str();
}

V8VALUE_TO_CPP_CONVERSION(const wchar_t *)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization

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

获取特定的进程内存空间

我有一个void *函数的指针(),我想知道这个函数属于哪个进程.我不知道采用哪种方式,但我认为通过使用某种形式的VirtualQuery技巧是可能的.任何帮助,将不胜感激.

提前致谢,

澄清: "属于进程"是指函数所处的进程.例如:假设test.exe在内存中加载了可执行文件().此可执行文件包含一个名为的函数SayHello,该函数位于内存中的0xDEADBEEF.在一个完全不同的过程中,我怎么知道0xDEADBEEF在test.exe内存空间中.

希望这能说明问题.

澄清2:我确定你熟悉"VTable挂钩",其中外部模块在单独的进程中更改VTable指针以指向不同的功能.因此,每当调用钩状构件时,它就被传递到外部模块.

为了防止这种情况(反作弊),我希望能够检查VTable的所有方法是否指向它们所在的模块.

解决方案代码:

template<class T>
inline void **GetVTableArray(T *pClass, int *pSize)
{
    void **ppVTable = *(void ***)pClass;

    if(pSize)
    {
        *pSize = 0;

        while(!IsBadReadPtr(ppVTable[*pSize], sizeof(UINT_PTR)))
            (*pSize)++;
    }

    return ppVTable;
}

bool AllVTableMembersPointToCurrentModule(void *pClass)
{
    DWORD dwOldProtect;
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
    MODULEENTRY32 moduleEntry;

    // Take a snapshot of all modules in the specified process
    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
    if(hModuleSnap == INVALID_HANDLE_VALUE)
        return false;

    // Set …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi

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