【问题标题】:Returning int_ptr from dialogboxes从对话框返回 int_ptr
【发布时间】:2011-01-13 17:42:56
【问题描述】:

对话框 proc 的返回类型为 BOOL 但我正在尝试做的事情

case WM_CTLCOLORSTATIC:
        {
            HBRUSH g_hbrBackground = CreateSolidBrush(RGB(237, 209, 238));
            HDC hdcStatic = (HDC)wParam;
            SetBkMode(hdcStatic, TRANSPARENT);
            return (INT_PTR)g_hbrBackground;
        }

上面的(INT_PTR)案例是从int_ptr到bool的性能警告转换,是怎么做的?

【问题讨论】:

  • 你想做什么?您是要返回指针还是指针是否为空?
  • 嗨,James,我正在尝试将静态控件的背景更改为透明,根据 WM_CTLCOLORSTATIC 的文档,我必须返回画笔句柄。
  • LRESULTHBRUSH 都和指针一样宽,所以你应该可以投射画笔。在 C++ 中,您应该更喜欢 reinterpret_cast: return reinterpret_cast<LRESULT>(g_hbrBackground)
  • “从 int_ptr 到 bool 的转换”对我来说听起来很可疑,包含该代码的函数是如何声明的?窗口过程的正确返回类型是LRESULT,而不是BOOL
  • 真正的问题是您在 DialogBox() 调用中使用了强制转换。这让编译器关闭了,但让你一筹莫展。

标签: c++ winapi dialog


【解决方案1】:

这是一个对话过程的声明:

INT_PTR CALLBACK DialogProc(
  __in  HWND hwndDlg,
  __in  UINT uMsg,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);

那里没有BOOL

使用正确的类型,您的问题就会消失。

干杯,

【讨论】:

  • 遗留代码仍然到处都是 BOOL。很好理解。在 Win32 上,BOOL 和 INT_PTR 的大小无论如何都是相同的,而在 Win64 上,编译器会在 DialogBox() 调用上发牢骚。
【解决方案2】:

将画笔句柄类型转换为 BOOL。这太丑了,但就是这样。

【讨论】:

    【解决方案3】:
    return (BOOL)(g_hbrBackground != 0);
    

    应该解决警告。

    【讨论】:

    • 阅读 WM_CTLCOLORxxx 消息。他们实际上期望返回一个句柄,而不是一个布尔值。
    • 我怀疑这是 OP 想要的。
    • 对于曾经编写过 WM_CTLCOLOR 处理程序的任何人来说,OP 的含义都一清二楚。我做了很多次。
    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多