在运行时将图像加载到对话框图片控件中
Posted
技术标签:
【中文标题】在运行时将图像加载到对话框图片控件中【英文标题】:Loading an image into a dialog picture control during runtime 【发布时间】:2014-01-23 05:35:57 【问题描述】:我最近购买了一台具有高 dpi 屏幕的笔记本电脑,并且一直在调整我的一个程序以利用更高的分辨率。在我的一个 Win32 对话框中,我显示了一张位图图片。通常我通过资源编辑器将其分配给图片控件,而不必处理它。现在我需要根据屏幕分辨率显示两个图像之一。我知道如何加载位图并获取其句柄,但是如何在对话框启动期间将其分配给图片控件,以便内置对话框例程显示它?我想我应该在对话框中放置一个静态图片控件,但是我找不到一个 win32 示例来说明如何在运行时将图像分配给该图片控件。似乎应该很简单,但我似乎找不到合适的 windows 功能。我没有使用 MFC。
--特里
【问题讨论】:
如果您可以显示当前代码是什么,那么建议更改会更容易。 【参考方案1】:这是一个例子。基本上,您需要将 STM_SETIMAGE 消息连同您要显示的图像的句柄一起发送到图片控件。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "resource.h"
HINSTANCE hInst;
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
static HBITMAP bmp1, bmp2;
static bool isImg1 = true;
switch(uMsg)
case WM_INITDIALOG:
bmp1 = (HBITMAP)SendDlgItemMessage(hwndDlg, IDC_STATIC1, STM_GETIMAGE, IMAGE_BITMAP, 0);
bmp2 = (HBITMAP)LoadImage(NULL, "bitmap2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
return TRUE;
case WM_DESTROY:
DeleteObject(bmp1);
DeleteObject(bmp2);
return true;
case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE;
case IDC_BTN_TEST:
if (isImg1)
SendDlgItemMessage(hwndDlg, IDC_STATIC1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp2);
else
SendDlgItemMessage(hwndDlg, IDC_STATIC1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp1);
isImg1 = !isImg1;
return TRUE;
return FALSE;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
hInst = hInstance;
// The user interface is a modal dialog box
return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
【讨论】:
【参考方案2】:-
从资源中加载位图
向优化校准发送消息
case IDC_BUTTON_RELOAD:
hbitmap = (HBITMAP)LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP_FULL));
hbitmap2 = (HBITMAP)LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP_EMPTY));
/*hdc = GetDC(hDlg);
image_dc = CreateCompatibleDC(hdc);
old_hbitmap = (HBITMAP)SelectObject(image_dc,hbitmap);
BitBlt(hdc,1,0,530,450,image_dc,0,0,SRCCOPY);*/
SendMessage(GetDlgItem(hDlg,IDC_STATIC_PICTURE2), STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbitmap);
SendMessage(GetDlgItem(hDlg,IDC_STATIC_PICTURE), STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbitmap2);
return TRUE;
case IDC_BUTTON_EXIT:
MessageBox(hDlg,_T("Thank you"),_T("Close"),MB_ICONINFORMATION|MB_OK);
DeleteObject(hbitmap);
DeleteObject(hbitmap2);
DestroyWindow(hDlg);
return TRUE;
【讨论】:
以上是关于在运行时将图像加载到对话框图片控件中的主要内容,如果未能解决你的问题,请参考以下文章