Создание меню

MAnton

Работаю в VC 2010 Express, редактора ресурсов там нет поэтому я воспользовался программой Resource Hacker, код меню имеет следующий вид:
MYMENU MENU
LANGUAGE LANG_RUSSIAN, 0x1
{
POPUP "Фон"
{
    MENUITEM "Зеленый",  1
    MENUITEM "Синий",  2
    MENUITEM SEPARATOR
    MENUITEM "Выход",  3
}
}
Файл с меню я сохранил в папку с проектом, потом я добавил этот файл к проекту. Сама программа имеет вид
#include <windows.h>
#include <windowsx.h>
#include "index.h"
HBRUSH **********,hGreenBrush;//Дескрипторы кистей фона
int sw;//Переключатель для управления фоном окна
 
int WINAPI WinMain (HINSTANCE hInst,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    char szClassName[]="MainWindow";
    char szTitle[]="Statistika";
    MSG Msg;                                    //Структура для получения сообщений Windows
    WNDCLASS wincl;                             //Структура для задания характеристик окна
    ZeroMemory(&wincl,sizeof(wincl));           //Обнудение всех членов структуры
    wincl.hInstance=hInst;                      //Дескрипртор данного приложения
    wincl.lpszClassName=szClassName;            //Имя класса окна
    wincl.lpfnWndProc=WndProc;                  //Определяем оконную процедуру для главного окна
    wincl.hIcon=LoadIcon(NULL,IDI_APPLICATION); //**********************
//  wincl.lpszMenuName=MAKEINTRESOURCE(Main);
    wincl.lpszMenuName="MYMENU";
    wincl.hCursor=LoadCursor(NULL,IDC_ARROW);
    wincl.hbrBackground=(HBRUSH)(LTGRAY_BRUSH);
    RegisterClass(&wincl);                      //Регистрация класса окна
 
    HWND hwnd=CreateWindow(szClassName,szTitle, //Класс и заголовок окна
                    WS_OVERLAPPEDWINDOW,100,100,500,300,//Стиль окна, координаты и размеры
           HWND_DESKTOP,NULL,hInst,NULL);
 
    ShowWindow (hwnd, nCmdShow);//Функция показа окна
 
    //Цикл обнаружения сообщений
    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_CREATE,OnCreate);
        HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
        HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}
void OnDestroy(HWND){
    PostQuitMessage(0);
}
void OnPaint(HWND hwnd){
    PAINTSTRUCT ps;
    HDC hdc=BeginPaint(hwnd,&ps);
    if(sw==1) FillRect(hdc,&ps.rcPaint,**********);
    if(sw==2) FillRect(hdc,&ps.rcPaint,hGreenBrush);
    EndPaint(hwnd,&ps);
}
 
BOOL OnCreate(HWND,LPCREATESTRUCT){
    **********=CreateSolidBrush(RGB(100,100,255));
    hGreenBrush=CreateSolidBrush(RGB(100,255,100));
    return TRUE;
}
void OnCommand(HWND hwnd,int id,HWND,UINT){
    switch(id){
        case MI_BLUE:
            sw=1;
            InvalidateRect(hwnd,NULL,TRUE);
        break;
        case MI_GREEN:
            sw=2;
            InvalidateRect(hwnd,NULL,TRUE);
        case MI_EXIT:
            DestroyWindow(hwnd);
    }
}
и заголовочный файл
#define MI_BLUE 2
#define MI_GREEN 1
#define MI_EXIT 3
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//Оконная функция
void OnDestroy(HWND);
void OnPaint(HWND);
void OnCommand(HWND,int,HWND,UINT);
BOOL OnCreate(HWND,LPCREATESTRUCT);
Проблема вот в чем: при запуске программы при выборе зеленого фона программа закрывается, а при выборе синего фона работает корректно. В чем проблема? И еще вопрос: я так понимаю что в заголовочном файле цифры после MI_BLUE MI_GREEN и MI_EXIT это их индификаторы, так вот они должны совпадать с теми которые стоят в файле ресурсов?
1 ответ

MAnton

Проблема в пропущенном break в OnCommand. Заведите привычку завершать ЛЮБОЙ выбор в switch() либо break, либо return