gpt4 book ai didi

c++ - 如何按条件打印位图?

转载 作者:行者123 更新时间:2023-11-28 07:00:36 24 4
gpt4 key购买 nike

请帮我按条件打印位图。我有两个按钮创建为

    case WM_CREATE:
HWND button1,button2;

button1= CreateWindow(TEXT("button"), TEXT("button1"),
WS_VISIBLE | WS_CHILD | BS_BITMAP|BS_FLAT,
675, 720, 105, 35,
hwnd, (HMENU) pgn, NULL, NULL);
button2=CreateWindow(TEXT("button"), TEXT("button2"),
WS_VISIBLE | WS_CHILD | BS_BITMAP|BS_FLAT,
675, 720, 105, 35,
hwnd, (HMENU) pgn, NULL, NULL);

和两个图像加载为:

    HBITMAP img1,img2;
static HINSTANCE g_hInst=NULL;
img1 = LoadBitmap(g_hInst,"a100");
img2 = LoadBitmsp(g_hInst,"a101");

我想在按下 button1 时打印 img1,在按下 button2 时打印 img2。我使用了以下代码:

    BITMAP bm;

case WM_CREATE:
GetObject(img1, sizeof(bm), &bm);

case WM_COMMAND:

switch (wParam)
{
case pgn:
PAINTSTRUCT ps;
HDC hdcWindow;
hdcWindow = BeginPaint(hwnd, &ps);
HDC hdcMemory;
hdcMemory = CreateCompatibleDC(hdcWindow);


SelectObject(hdcMemory, img1);
BitBlt(hdcWindow, 150,25,900, bm.bmHeight, hdcMemory, 0, 0,SRCCOPY);

DeleteDC(hdcMemory);
EndPaint(hwnd, &ps);
break;

case pgp:

hdcWindow = BeginPaint(hwnd, &ps);
hdcMemory = CreateCompatibleDC(hdcWindow);


SelectObject(hdcMemory,img2);
BitBlt(hdcWindow, 150,25,900, bm.bmHeight, hdcMemory, 0, 0,SRCCOPY);

DeleteDC(hdcMemory);
EndPaint(hwnd, &ps);

但它仅适用于第一次按下按钮。我想在按下 button1 时打印 img1,在按下 button2 时打印 img2。我能得到更好的代码吗?谁能帮我。谢谢。

最佳答案

有一个变量指示应该显示哪个位图。

HBITMAP hbmpSelected = NULL;

当您按下按钮时,更改变量并调用 InvalidateRect。这将导致您的消息循环调度和 WM_PAINT 处理程序。

// in WM_COMMAND handler
case pgn:
hbmpSelected = img1;
InvalidateRect(HWND, NULL);
break;
case pgp:
hbmpSelected = img2;
InvalidateRect(HWND, NULL);
break;

将所有绘画代码放入 WM_PAINT 的处理程序中。该代码应检查变量以决定将哪个位图选择到内存 DC 中,然后再将其 blit 到窗口。

case WM_PAINT:
PAINTSTRUCT ps;
HDC hdcWindow = BeginPaint(hwnd, &ps);
if (hbmpSelected != NULL) {
HDC hdcMemory = CreateCompatibleDC(hdcWindow);
HGDIOBJ hbmpOld = SelectObject(hdcMemory, hbmpSelected);
BitBlt(hdcWindow, 150, 25, 900, bm.bmHeight, hdcMemory, 0, 0, SRCCOPY);
SelectObject(hdcMemory, hbmpOld);
DeleteDC(hdcMemory);
}
EndPaint(hwnd, &ps);
break;

(特别是,仅在 WM_PAINT 处理程序中使用 BeginPaint 和 EndPaint。有一些方法可以在其他地方绘制到您的窗口,但这仅适用于特殊情况,您不会将 BeginPaint/EndPaint 用于那种绘制。 )

(在销毁内存 DC 之前,一定要从内存 DC 中选择你的位图。现代版本的 GDI 倾向于容忍这样的错误,但最好直接清理。)

(另请注意,您的按钮是使用相同的 ID pgn 创建的。我认为这是转录错误,第二个应该是 pgp。)

关于c++ - 如何按条件打印位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22555204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com