#c
#c
Вопрос:
Я новичок в программировании приложений Visual c для Windows, и я хочу отобразить изображение на экране, но я не знаю, как это сделать. Кто-нибудь может мне помочь?
Большая часть материала, который я нашел в сети, касалась приложения MFC, которое меня не интересует. Я хочу, чтобы это приложение было как можно более простым, поэтому неудивительно, что я не заинтересован в использовании какой-либо дополнительной библиотеки, такой как OpenCV или Direct2D, OpenGL.
Комментарии:
1. Если вы хотите, чтобы это было просто, вы выбрали неправильный инструмент. Необработанный winapi не прост. Простой — это MFC, WinForms или VCL.
Ответ №1:
BitBlt, найдите его в MSDN. Также смотрите, http://www.winprog.org/tutorial/bitmaps.html .
Ответ №2:
Просто используйте следующий код. Это некрасиво, но работает достаточно хорошо для отладки
#include <windows.h>
#include <tchar.h>
HBITMAP hBitmap;
HDC localDC;
HBITMAP hOld;
BITMAP qB;
HDC hDC; // Handle (virtual memory pointer) to drawing characteristics
LRESULT CALLBACK fnWndProc(HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_CREATE:{
//MessageBox(hwnd,_T("Window Procedure Received WM_CREATE Message!"),_T("Message Report!"),MB_OK);
return 0;
}
case WM_LBUTTONDOWN: {
//MessageBox(hwnd,_T("Window Procedure Received WM_LBUTTONDOWN Message!"),_T("Message Report!"),MB_OK);
return 0;
}
case WM_PAINT: { //At program start up the whole window is invalid so must be drawn.
//TCHAR tmpText[]=_T("TempText");
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd,amp;ps);
BOOL qRetBlit = ::BitBlt(hDC,0,0,qB.bmWidth,qB.bmHeight,localDC,0,0,SRCCOPY);
// Draw text on top of the image
//int iBkMode=SetBkMode(hDC,TRANSPARENT); // Save Background Mode characteristic of drawing context
//TextOut(hDC,40,20,tmpText,(int)_tcslen(tmpText)); // Draw Text
//SetBkMode(hDC,iBkMode); // Return Drawing Context To Original State
EndPaint(hwnd, amp;ps);
return 0;
}
case WM_DESTROY: {
::SelectObject(localDC,hOld);
::DeleteDC(localDC);
::DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int iShow){
TCHAR szClassName[]=_T("Name");
WNDCLASSEX wc;
MSG messages;
HWND hWnd;
wc.lpszClassName = szClassName; //Important Field! Character string identifying window class
wc.lpfnWndProc = fnWndProc; //Important Field! Function Pointer. Address of Window Procedure
wc.cbSize = sizeof (WNDCLASSEX); //Those top two fields I just listed are very important. The
wc.style = 0; //others are of course necessary too, but fully understanding all
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); //the implications of the .szClassName and .lpfnWndProc fields will
wc.hInstance = hInstance; //go a long way to helping you understand Win32 coding. The
wc.hIconSm = 0; //.hBrushBackground field will be the color of the Window's
wc.hCursor = LoadCursor(NULL,IDC_ARROW); //background. The .cbWndExtra field is very useful as it allows
wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; //you to associate object (Window) data to the instantiated Window's
wc.cbWndExtra = 0; //internal structure, i.e., accomodate member data.
wc.cbClsExtra = 0;
wc.lpszMenuName = NULL;
RegisterClassEx(amp;wc);
hBitmap = (HBITMAP)::LoadImage(NULL, (LPCSTR)"P:/Resources/testing/a.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(reinterpret_cast<HGDIOBJ>(hBitmap),sizeof(BITMAP),reinterpret_cast<LPVOID>(amp;qB));
localDC = ::CreateCompatibleDC(hDC);
hOld = (HBITMAP)::SelectObject(localDC,hBitmap);
hWnd = CreateWindowEx(0,szClassName,szClassName,WS_OVERLAPPEDWINDOW,0,0,qB.bmWidth,qB.bmHeight,HWND_DESKTOP,0,hInstance,0);
ShowWindow(hWnd,iShow);
while(GetMessage(amp;messages,NULL,0,0)){
TranslateMessage(amp;messages);
DispatchMessage(amp;messages);
}
return (int)messages.wParam;
}