создание Toolbar-а с помощью Winapi

Тема в разделе "MS Visual C++", создана пользователем Zerkal0, 27 мар 2010.

  1. Zerkal0

    Zerkal0 Member

    Регистрация:
    21 май 2009
    Сообщения:
    15
    Симпатии:
    0
    Здраствуйте.


    3-й день сижу с примером программы 6_2 из книги Финогенова "Win32.Основы программирования". Всё делаю как по книге, работаю в среде VS 2003.net (пробовал делать в VS 2008 Express edition, результат тот же), получается такая фигня.
    Построение решения(прокта) выполняется без ошибок, когда запускаю процесс отладки, вот что выдаёт:

    "Необработанное исключение в "0x5d5cd465" в 6_2.exe: 0x0000005: Нарушение прав доступа при чтении "0x0096fffc""

    Внизу среды разработки, где показывают переменные в параметрах переменной hwnd написано: 0x00040954 {unused=???}
    CX0030:ошибка: невозможно вычислить выражение

    Прошу строго не судить за ляпы, в программировании новичок.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Вот код проги (win32 приложение):</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    //Заголовочный файл 6_2.h

    #define ID_1 300//Идентификатор кнопки 1
    #define ID_2 301//Идентификатор кнопки 2
    #define ID_3 302//Идентификатор кнопки 3
    #define ID_BTNS 400//Идентификатор ресурса-файла с изображением кнопок

    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

    void OnCommand(HWND,int,HWND,UINT);
    void OnPaint(HWND);
    BOOL OnCreate(HWND hwnd,LPCREATESTRUCT);
    void OnDestroy(HWND);


    //Файл 6_2.cpp

    #pragma comment(lib, "comctl32.lib")

    #include<windows.h>
    #include<windowsx.h>
    #include<commctrl.h>

    #include"6_2.h"

    HBRUSH hBlueBrush,hGreenBrush;

    int sw;//Переключатель цвета окна
    HINSTANCE hI;//Дескриптор приложения



    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {

    hI=hInst;
    char szClassName[] = "MainWindow";
    char szTitle[] = "Программа 6_2";

    MSG Msg;
    WNDCLASS wc;

    memset(&wc,0,sizeof(wc));

    wc.lpfnWndProc=WndProc;
    wc.hInstance=hInst;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=GetStockBrush(WHITE_BRUSH);
    wc.lpszClassName=reinterpret_cast<LPCWSTR>(szClassName);
    RegisterClass(&wc);

    HWND hwnd=CreateWindow(reinterpret_cast<LPCWSTR>(szClassName),reinterpret_cast<LPCWSTR>(szTitle),WS_OVERLAPPEDWINDOW,
    10,10,300,150,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_COMMAND,OnCommand);
    HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
    HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
    HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
    default:
    return(DefWindowProc(hwnd,msg,wParam,lParam));
    }
    }

    void OnDestroy(HWND) {
    PostQuitMessage(0);
    }


    //Функция обработки сообщений WM_CREATE
    BOOL OnCreate(HWND hwnd,LPCREATESTRUCT) {

    hBlueBrush=CreateSolidBrush(RGB(100,100,255));
    hGreenBrush=CreateSolidBrush(RGB(100,255,100));

    TBBUTTON tbb[3];//массив структур TBUTTON

    ZeroMemory(&tbb,sizeof(tbb));//Обнулим весь массив структур

    tbb[0].iBitmap=0;//Порядковый номер кнопки 1
    tbb[0].idCommand=ID_1;//Идентификатор кнопки 1
    tbb[0].fsState=TBSTATE_ENABLED;//Разрешить управление от кнопки 1

    tbb[1].iBitmap=1;//Порядковый номер кнопки 2
    tbb[1].idCommand=ID_2;//Идентификатор кнопки 2
    tbb[1].fsState=TBSTATE_ENABLED;//Разрешить управление от кнопки 2

    tbb[2].iBitmap=2;//Порядковый номер кнопки 3
    tbb[2].idCommand=ID_3;//Идентификатор кнопки 3
    tbb[2].fsState=TBSTATE_ENABLED;//Разрешить управление от кнопки 3


    CreateToolbarEx(hwnd,WS_CHILD|WS_BORDER|WS_VISIBLE,-1,3,
    hI,ID_BTNS,tbb,3,16,16,16,16,sizeof(TBBUTTON));//Создаём инструментальную панель


    return TRUE;   
    }




    //Функция обработки сообщений WM_PAINT
    void OnPaint(HWND hwnd) {

    PAINTSTRUCT ps;
    HDC hdc=BeginPaint(hwnd,&ps);

    if(sw==1)
    FillRect(hdc,&ps.rcPaint,hBlueBrush);
    if(sw==2){
    FillRect(hdc,&ps.rcPaint,hGreenBrush);
    }
    EndPaint(hwnd,&ps);


    }


    void OnCommand(HWND hwnd,int id,HWND,UINT)
    {
    switch(id){//id=идентификатор выбранного пункта меню
    case ID_1://Нажали кнопку 1 - изменить цвет
    sw=1;
    InvalidateRect(hwnd,NULL,TRUE);
    break;
    case ID_2://Нажали кнопку 2 - изменить цвет
    sw=2;
    InvalidateRect(hwnd,NULL,TRUE);
    break;
    case ID_3://Нажали кнопку 2 - завершить приложение
    DestroyWindow(hwnd);
    }

    }
    // Файл ресурсов 6_2.rc

    #include "6_2.h"

    ID_BTNS BITMAP "buttons.bmp"//Файл с изображением кнопок


    ...Вот
    Картинку buttons.bmp делаю размером 48 x 16, размещаю в папке проекта 6_2.


    ПАМАГИТЕ люди добрые, а то на луну выть начну. Буду очень признателен.
     
Загрузка...

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