Консультация № 140589
23.07.2008, 21:01
0.00 руб.
28.07.2008, 13:42
0 3 1
Уважаемые эксперты! Есть вопрос по Win32 API. Я написал программу для загрузки и воспроизведения битового образа. Я все вроде делал правильно,но картинка не изображается на экране. В то же время когда я прописываю путь к другому файлу,все работает нормально. Что в коде не так? (путь к файлу прописан верно! Так что дело не в указании неверного пути к файлу). При реализации использовался VS 2008,ОС Windows Vista x64.
Еще у меня есть вопросы:
1. Как в Win32 обрабатывать графические файлы формата JPG или каких-либо других не BMP-шных форматов?
2. Как сделть в данной проге так, чтбы через полосы прокрутки можно было
(как реализовать просмотр картинки через полосы прокрутки,как ее пролистывать?)

Приложение:
#include "windows.h"
#include "windowsx.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void Destroy();

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;

MyRegisterClass(hInstance);
InitInstance(hInstance,nCmdShow);

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int) msg.wParam;
}

//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
ZeroMemory(&wcex,sizeof(&wcex));

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = "Hello!!!!";
wcex.lpszClassName = "Window";
wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);

return RegisterClassEx(&wcex);
}

//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
// szWindowClass=
hWnd = CreateWindow("Window", "Hello!!!!", WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
RECT Rect;
HDC hdc,hmemdc;
static int cx,cy,Pos;
BITMAP Bitmap;
HANDLE hBitmap,hdc_Old;
SCROLLINFO hvi;

//Вариантная часть
switch(msg)
{
case WM_CREATE:
hvi.nMin=hvi.nPos=0;
hvi.cbSize=sizeof(SCROLLINFO);
Pos=0;
SetScrollPos(hWnd,SB_VERT,Pos,TRUE);
case WM_SIZE:
cx=LOWORD(lParam);
cy=HIWORD(lParam);
return 0;
case WM_VSCROLL: //Реализация функционала прокрутки
switch (LOWORD(wParam))
{
case SB_LINEUP:
Pos-=5;
return 0;
case SB_LINEDOWN:
Pos+=5;
return 0;
case SB_PAGEDOWN:
Pos+=10;
return 0;
case SB_PAGEUP:
Pos-=10;
return 0;
case SB_THUMBPOSITION:
Pos=HIWORD(wParam);
return 0;
}
SetScrollPos(hWnd,SB_VERT,Pos,TRUE);
InvalidateRect(hWnd,NULL,TRUE);
return 0;

case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
hBitmap=LoadImage(hInst,"c:marbina.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //Загрузка битмапа из файла
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);//Возвращение структуры битмапа по его хэндлу
hmemdc=CreateCompatibleDC(hdc);//Открываем совместимый контекст
GetClientRect(hWnd,&Rect);
BitBlt(hdc,0,0,Rect.right,Rect.bottom,hmemdc,Bitmap.bmWidth/4,Bitmap.bmHeight/4,SRCCOPY);//Копируем битмап из совместимого контекста непосредственно на экран с рисованием
/*Поскольку все нарисовано,удаляем ненужные переменные*/
DeleteObject(hBitmap);//Удаляем сам битмап
DeleteObject(hdc_Old);//Удаляем использованный контекст
DeleteDC(hmemdc);//Удаляем совместимый контекст
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
Destroy();
return 0;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
}

void Destroy()
{PostQuitMessage(0);}

Обсуждение

Неизвестный
24.07.2008, 02:14
общий
28.07.2008, 13:38
это ответ
Здравствуйте, Zombi-6!
Отвечу только на вопрос 1.
Лучшим выходом из ситуации, чтобы не изобретать велосипедов, будет использование сторонней библиотеки, например libpng, libjpg или, что еще проще, использовать связку библиотек SDL и SDL_Image(найти все это можно запросто в google). Кстати, вывод битового образа можно сделать тоже через эту библиотеку. Там все довольно просто, почитайте документацию и вот этот гайд руководство : http://lazyfoo.net/SDL_tutorials/index.php (там уроки 2 и 3).
Неизвестный
24.07.2008, 12:10
общий
И все-таки,как быть с программным кодом вывода изображения? Я присылал его во вложении,но он,видимо не воспроизвелся. Вот он:
#include "windows.h"
#include "windowsx.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void Destroy();



int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{


// TODO: Place code here.
MSG msg;

MyRegisterClass(hInstance);
InitInstance(hInstance,nCmdShow);

// Main message loop:

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

}


return (int) msg.wParam;
}



//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
ZeroMemory(&wcex,sizeof(&wcex));

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = "Hello!!!!";
wcex.lpszClassName = "Window";
wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);

return RegisterClassEx(&wcex);
}

//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
// szWindowClass=
hWnd = CreateWindow("Window", "Hello!!!!", WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
RECT Rect;
HDC hdc,hmemdc;
static int cx,cy,Pos;
BITMAP Bitmap;
HANDLE hBitmap,hdc_Old;
SCROLLINFO hvi;

//Вариантная часть
switch(msg)
{
case WM_CREATE:
hvi.nMin=hvi.nPos=0;
hvi.cbSize=sizeof(SCROLLINFO);
Pos=0;
SetScrollPos(hWnd,SB_VERT,Pos,TRUE);
case WM_SIZE:
cx=LOWORD(lParam);
cy=HIWORD(lParam);
return 0;
case WM_VSCROLL: //Реализация функционала прокрутки
switch (LOWORD(wParam))
{
case SB_LINEUP:
Pos-=5;
return 0;
case SB_LINEDOWN:
Pos+=5;
return 0;
case SB_PAGEDOWN:
Pos+=10;
return 0;
case SB_PAGEUP:
Pos-=10;
return 0;
case SB_THUMBPOSITION:
Pos=HIWORD(wParam);
return 0;
}
SetScrollPos(hWnd,SB_VERT,Pos,TRUE);
InvalidateRect(hWnd,NULL,TRUE);
return 0;

case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
hBitmap=LoadImage(hInst,"c:\marbina.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //Загрузка битмапа из файла
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);//Возвращение структуры битмапа по его хэндлу
hmemdc=CreateCompatibleDC(hdc);//Открываем совместимый контекст
GetClientRect(hWnd,&Rect);
BitBlt(hdc,0,0,Rect.right,Rect.bottom,hmemdc,Bitmap.bmWidth/4,Bitmap.bmHeight/4,SRCCOPY);//Копируем битмап из совместимого контекста непосредственно на экран с рисованием
/*Поскольку все нарисовано,удаляем ненужные переменные*/
DeleteObject(hBitmap);//Удаляем сам битмап
DeleteObject(hdc_Old);//Удаляем использованный контекст
DeleteDC(hmemdc);//Удаляем совместимый контекст
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
Destroy();
return 0;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
}

void Destroy()
{PostQuitMessage(0);}
Второй вопрос был про то, как реализовать просмотр картинки через полосы прокрутки,как ее пролистывать? Видимо,мой вопрос отобразился не весь почему-то вчера
давно
Мастер-Эксперт
425
4118
28.07.2008, 13:45
общий
Zombi-6

"Я присылал его во вложении,но он,видимо не воспроизвелся."
Возможно в коде было излишне большое кол-во символов. Впрочем, я не подсчитывал, но в любом случае ненужные фрагменты, типа вот таких комментариев:
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//

в код включать не нужно, т.к. они не несут никакой смысловой нагрузки (в даннром случае).
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа