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

21.05.2009
15
0
#1
Здраствуйте.


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">
Код:
//Заголовочный файл 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.


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