Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > BitMap


Автор: Zorak 6.2.2009, 22:22
Почему вот ето ничего не работает ?
Код

#include "windows.h"
#include "windowsx.h"

#define XSIZE 400
#define YSIZE 300

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL OnCreate(HWND, CREATESTRUCT FAR*);
void OnPaint(HWND);
void onDestroy(HWND);

//Car BITMAP "Car.bmp"

HINSTANCE hInstance;
HBITMAP hBitmap, hOldBitmap;
HDC hdcMem;
BITMAP bm;
                   
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
    char szClassName[] = "MainWindow";
    char szTitle[] = "Create by Terrian";
    MSG msg;
    WNDCLASS T;
    ZeroMemory(&T, sizeof(T));

    T.lpfnWndProc = WndProc;
    T.hInstance = hInst;
    T.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    T.hCursor = LoadCursor(NULL,IDC_ARROW);
    T.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
    T.lpszClassName = szClassName;
    
    RegisterClass(&T);

    HWND hwnd = CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,500,300,XSIZE,YSIZE,HWND_DESKTOP,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    while (GetMessage(&msg,NULL,0,0))
        DispatchMessage(&msg);
    return 0;

    

}

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        HANDLE_MSG(hWnd,WM_DESTROY,onDestroy);
        HANDLE_MSG(hWnd,WM_PAINT,OnPaint);
        HANDLE_MSG(hWnd,WM_CREATE,OnCreate);
    default:return(DefWindowProc(hWnd,msg,wParam,lParam));
    }
}

void onDestroy(HWND)
{
    DeleteBitmap(hBitmap);
    SelectBitmap(hdcMem,hOldBitmap);
    DeleteDC(hdcMem);
    PostQuitMessage(0);
}

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT)
{
    hBitmap = (HBITMAP)LoadImage(hInstance,"Car.bmp",IMAGE_BITMAP,0,0,0);
    GetObject(hBitmap,sizeof(hBitmap),&bm);
    HDC hdc = GetDC(hWnd);
    hdcMem = CreateCompatibleDC(hdc);
    hOldBitmap = SelectBitmap(hdcMem,hBitmap);
    ReleaseDC(hWnd,hdc);
    return TRUE;
}

void OnPaint (HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd,&ps);
        BitBlt(hdc,25,20,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY);
    EndPaint(hWnd,&ps);
}

Когда я раскаменчу строку Car BITMAP "Car.bmp", то видает след. ошибки:
Код

--------------------Configuration: RastrBMP - Win32 Debug--------------------
Compiling...
RastrBMP.cpp
D:\Programmer\!!! Projects !!!\Visual C++\RastrBMP\RastrBMP.cpp(12) : error C2146: syntax error : missing ';' before identifier 'BITMAP'
D:\Programmer\!!! Projects !!!\Visual C++\RastrBMP\RastrBMP.cpp(12) : error C2501: 'Car' : missing storage-class or type specifiers
D:\Programmer\!!! Projects !!!\Visual C++\RastrBMP\RastrBMP.cpp(12) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

RastrBMP.exe - 3 error(s), 0 warning(s)

З.Ы. В ресурсах я ничего не добавлял.. может в етом моя проблема ?.. Если да, то подскажите как правильно ето сделать )

Автор: Alca 7.2.2009, 10:49
Раз:
Код

#define IDB_Car 5000
IDB_Car BITMAP "Car.bmp"

Два:
Не
Код

BITMAP bm;

а
Код

HBITMAP bm;

Автор: GremlinProg 7.2.2009, 13:00
Цитата(Zorak @  7.2.2009,  00:22 Найти цитируемый пост)
Car BITMAP "Car.bmp"

такая запись возможна только в файле ресурсов
открой *.rc и скопируй это туда
затем, открой resource.h и добавь определение
Код

#define Car 100

иначе русерс добавится под именем "Car", но, в принципе, если тебе это не важно, можешь это определение и не добавлять, просто впоследствии, в LoadBitmap придется передавать строку "Car", а не идентификатор 100
делай как удобно

Добавлено через 4 минуты и 37 секунд
можно и проще, через меню: Add Resource -> Import

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)