Помогите с Winapi

  • Автор темы Infernus
  • Дата начала
I

Infernus

Гость
#1
Ребят, у меня такая проблемка. Написал прогу, чтобы скроллом можно было битмап прокручивать. Но вот зараза, битмап никак не открывается. Что делать?
Вот прикрепляю файл, посмотрите что не так, пожалуйста. А то я наверно где-то затупил и понять не могу где. Заранее спасибо
#include <windows.h>

long WINAPI DCDemoWndProc(HWND,UINT,UINT,LONG);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
char szClassName[] = "DCDemo";
/*Ðåãèñòðèðóåì ñîçäàâàåìûé êëàññ*/
/*Çàïîëíÿåì ñòðóêòóðó òèïà WNDCLASS*/
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = DCDemoWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor = LoadCursor (NULL,IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = "MyMenu";
WndClass.lpszClassName = szClassName;

if(!RegisterClass(&WndClass))
{
MessageBox(NULL, "Cannot register class", "Error", MB_OK);
return 0;
}

hWnd = CreateWindow (szClassName, "Program No 3" ,
WS_OVERLAPPEDWINDOW | WS_VSCROLL |
WS_HSCROLL, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL,
hInstance, NULL);
if (!hWnd)
{
MessageBox(NULL, "Cannot create window", "Error", MB_OK);
return 0;
}

/*Show our window*/
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

/*Begining the messages cycle*/
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

LRESULT CALLBACK DCDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam )
{
HDC hDC, hCompatibleDC;
PAINTSTRUCT PaintStruct;
static HANDLE hBitmap;
HANDLE hOldBitmap;
RECT Rect;
BITMAP Bitmap;
static int nHorizDifference = 0, nVertDifference = 0;
static int nHorizPosition = 0, nVertPosition = 0;
switch (Message)
{
case WM_CREATE:
hBitmap = LoadImage(NULL, "girl.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
return 0;
case WM_PAINT:
hDC = BeginPaint(hWnd, &PaintStruct);
GetObject(hBitmap, sizeof(BITMAP), &Bitmap);
hCompatibleDC = CreateCompatibleDC(hDC);
hOldBitmap = SelectObject(hCompatibleDC, hBitmap);
GetClientRect(hWnd,&Rect);
BitBlt(hDC, 0, 0, Rect.right, Rect.bottom, hCompatibleDC, nHorizPosition,
nVertPosition, SRCCOPY);
if((nHorizDifference = (Bitmap.bmWidth - Rect.right)) > 0)
SetScrollRange(hWnd, SB_HORZ, 0, nHorizDifference, TRUE);
else
SetScrollRange(hWnd, SB_HORZ, 0, 0, TRUE);
if((nVertDifference = (Bitmap.bmHeight - Rect.bottom)) > 0)
SetScrollRange(hWnd, SB_VERT, 0, nVertDifference, TRUE);
else
SetScrollRange(hWnd, SB_VERT, 0, 0, TRUE);
//Âíîâü äåëàåì ñòàðûé bitmap òåêóùèì
SelectObject(hCompatibleDC, hOldBitmap);
//Óäàëÿåì çàãðóæåííûé ñ äèñêà bitmap
DeleteObject(hBitmap);
//Óäàëÿåì ñîâìåñòèìûé êîíòåêñò
DeleteDC(hCompatibleDC);
//Îñâîáîæäàåì îñíîâíîé êîíòåêñò, çàâåðøàÿ ïåðåðèñîâêó ðàáî÷åé îáëàñòè îêíà
EndPaint(hWnd,&PaintStruct);
return 0;
case WM_VSCROLL:
switch(LOWORD(wParam))
{
case SB_LINEDOWN:
if(nVertPosition < nVertDifference)
nVertPosition++;
break;
case SB_LINEUP:
if(nVertPosition > 0)
nVertPosition--;
break;
case SB_THUMBTRACK:
nVertPosition = HIWORD(wParam);
break;
}
SetScrollPos(hWnd, SB_VERT, nVertPosition, TRUE);
InvalidateRect(hWnd,NULL,TRUE);
return 0;
case WM_HSCROLL:
switch(LOWORD(wParam))
{
case SB_LINERIGHT:
if(nHorizPosition < nHorizDifference)
nHorizPosition++;
break;
case SB_LINELEFT:
if(nHorizPosition > 0)
nHorizPosition--;
break;
case SB_THUMBTRACK:
nHorizPosition = HIWORD(wParam);
break;
}
SetScrollPos(hWnd, SB_HORZ, nHorizPosition, TRUE);
InvalidateRect(hWnd, NULL, TRUE);
return 0;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, Message, wParam, lParam);
}