C++ 在图片控件中绘制图像
我有一个名为C++ 在图片控件中绘制图像,c++,windows,winapi,C++,Windows,Winapi,我有一个名为IDC\u PICTURECONTROL的图片控件和一个名为lpPicutre的LPPICTURE 当我的窗口接收到WM_PAINT时,我调用我的函数drawPicture(HWND,LPPICTURE)如下: drawPicture(GetDlgItem(hDlg, IDC_PICTURECONTROL), lpPicture); 按照现在的书写方式,控件周围的黑色边框消失了,图片根本没有绘制出来 如果我编辑该函数,使其不是绘制到图片控件,而是绘制到对话框本身(hDlg),则它正
IDC\u PICTURECONTROL
的图片控件和一个名为lpPicutre
的LPPICTURE
当我的窗口接收到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一起工作,它是正常的,问题可能出在静态控件本身。确保is具有SS_位图样式。在VisualStudio资源编辑器中,它被称为Type,并默认设置为SS_BLACKFRAME(Frame)。此代码不适用于CStatic
CPictureView* image = new CPictureView(std::string("E:\\My Documents\\..jpeg"));
image->Create("", SS_BLACKRECT | SS_OWNERDRAW | WS_CHILD | WS_VISIBLE, CRect(100, 100, 300, 300), this, IDC_STATIC1);