我有一个名为IDC_PICTURECONTROL
的图片控件和一个名为LPPICTURE
的{{1}}。
当我的窗口收到lpPicutre
时,我会像这样调用我的函数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
是对话框的处理程序。
我想也许它正在被窗户拉出来,所以我将x和y设置为0,宽度和高度设置为1000,但这并没有改变任何东西。
我做错了什么?
答案 0 :(得分:1)
如果此代码与hDlg一起使用,则可以,问题可能出在静态控件本身。确保它具有SS_BITMAP样式。在Visual Studio资源编辑器中,它被称为Type,默认情况下设置为SS_BLACKFRAME(Frame)。
答案 1 :(得分:0)
此代码适用于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);