Помогите с Winapi

Тема в разделе "Свободное общение", создана пользователем Infernus, 11 апр 2007.

  1. Infernus

    Infernus Гость

    Ребят, у меня такая проблемка. Написал прогу, чтобы скроллом можно было битмап прокручивать. Но вот зараза, битмап никак не открывается. Что делать?
    Вот прикрепляю файл, посмотрите что не так, пожалуйста. А то я наверно где-то затупил и понять не могу где. Заранее спасибо
    #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);
    }
     
Загрузка...

Поделиться этой страницей