c++ - 在优化校准中绘制图像

标签 c++ windows winapi

我有一个名为 IDC_PICTURECONTROL 的图片控件,还有一个名为 lpPicutreLPPICTURE

当我的窗口接收到 WM_PAINT 时,我调用我的函数 drawPicture(HWND, LPPICTURE) 如下:

drawPicture(GetDlgItem(hDlg, IDC_PICTURECONTROL), lpPicture);

现在这样写,控件周围的黑色边框就消失了,根本没有绘制图片。

如果我编辑该函数,使其不绘制到图片控件,而是绘制到对话框本身 (hDlg),则它会正确地绘制在窗口客户区的背景上。 (不是我想要的)。

这是绘画函数中的代码:

void drawPicture(HWND hWnd, LPPICTURE picture)
{
    PAINTSTRUCT ps;
    HDC hdc;

    hdc = BeginPaint(hWnd, &ps);
  //hdc = BeginPaint(hDlg, &ps); (works, but draws on window instead of control)

    if (picture)
    {
        long hmWidth;
        long hmHeight;
        picture->get_Width(&hmWidth);
        picture->get_Height(&hmHeight);

        int nWidth  = MulDiv(hmWidth,  GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
        int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);

        RECT rc;
        GetClientRect(hWnd, &rc); // I have tried GetWindowRect() also

        int w = 0, h = 0, x = 0, y = 0;
        if (hmWidth == hmHeight)
        {
            // square
            w = (rc.right - rc.left);
            h = (rc.bottom - rc.top);

            x = rc.left;
            y = rc.top;
        }
        else if (hmWidth > hmHeight)
        {
            // wide
            w = (rc.right - rc.left);
            h = (w * hmHeight) / hmWidth;

            x = rc.left;
            y = (rc.bottom - rc.top - h) / 2;
        }
        else
        {
            //tall
            h = (rc.bottom - rc.top);
            w = (h * hmWidth) / hmHeight;

            y = rc.top;
            x = (rc.right - rc.left - w) / 2;
        }

        picture->Render(hdc, x, y, w, h, 0, hmHeight, hmWidth, -hmHeight, &rc);
    }

    EndPaint(hWnd, &ps);
  //EndPaint(hDlg, &ps);
}

hWnd 是图片控件的处理程序,hDlg 是对话框的处理程序。

我想它可能是从窗口的某个地方被拉出来的,所以我将 x 和 y 设置为 0,将宽度和高度设置为 1000,但这并没有改变任何东西。

我做错了什么?

最佳答案

如果此代码与 hDlg 一起工作,则没有问题,问题可能出在静态控件本身。确保它具有 SS_BITMAP 样式。在 Visual Studio 资源编辑器中,它被称为 Type,默认设置为 SS_BLACKFRAME (Frame)。

关于c++ - 在优化校准中绘制图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8222836/

相关文章:

c++ - 获取当前 TTS 语音的语言

c++ - QResizeEvent 导致 SIGSEGV

windows - GitBash 创建的目录没有出现在 Windows 资源管理器中

java - 绘制到图像的组件使用难看的字体渲染

c++ - 如何从文件名列表创建 IShellItemArray

c++ - 按下 VK_MENU(Alt 键)时出现奇怪的 Windows 消息序列 WM_KEYDOWN/WM_KEYUP

c++ - OpenGL 3.0 中 glDrawPixels 的替代品?

C++ std::chrono::high_resolution_clock time_since_epoch 返回的数字太小。如何获得自 1970 年以来以微秒为单位的正确时间?

用于复制和修改包含重定向字符的文件的 Windows 批处理脚本

c - 调试和发布之间的奇怪链接差异导致未解析的 _except_handler3,或者为什么,哦,为什么我不知道 libcmtd?