【发布时间】:2021-06-17 09:28:48
【问题描述】:
case ID_BUTTON2:
{
StretchBlt(hdc, 100, rect.bottom, rect.right, -rect.bottom, hmem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); // mirror vertically
break;
}
当我以这种方式调用它或尝试先释放 DC 时,程序只是没有运行。如果这是一个问题,只是不是处理内存分配的专家。那么有什么解决办法呢?
在 WM_PAINT 我有:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); // Get DC handle
GetClientRect(hwnd, &rect); // Get client rectangle
hmem = CreateCompatibleDC(hdc);
hbmp = LoadImage(0, "\\image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hmem, hbmp);
GetObject(hbmp, sizeof(BITMAP), &bmp);
StretchBlt(hdc, 100, 0, rect.right, rect.bottom, hmem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
if ((HWND)lParam == ID_BUTTON2) { // HOW TO MAKE IT WORK, I have read documentation, and googled a lot, just doesn't work
if (HIWORD(wParam) == BN_CLICKED) {
StretchBlt(hdc, 100, rect.bottom, rect.right, -rect.bottom, hmem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);// mirror vertically
}
}
【问题讨论】:
-
可能相关:别忘了致电
EndPaint。另外,你为什么在WM_PAINT处理程序之外调用StretchBlt? -
如果用户按下按钮,我想通过改变目标坐标来改变位图。
-
您仍然应该在您的
WM_PAINT处理程序中执行此操作。你可以通过调用InvalidateRect来触发重绘。 -
感谢您的回复,实际上我尝试了这样做,但现在我卡住了 5 个小时,无法触发 BT_CLICKED 成为 WM_PAINT 中的标志
-
在 createWindowW 中定义了一个按钮
#define ID_BUTTON2 2我有(HMENU)ID_BUTTON2如何触发在 WM_PAINT 中单击的按钮?我尝试用全局变量来做这件事,但它不起作用,没有错误,什么都没有