Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683

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

11.12.2008, 12:06. Показов 4891. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как создать меню а то в книге бестолково написано 2 час мучаюсь не могу создать ((
Имеется код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void OnPaint(HWND);
void OnDestroy(HWND);
 
int WINAPI WinMain(HINSTANCE hi, HINSTANCE, LPSTR, int)
{
    MSG msg;
    WNDCLASS wc;
    char classn[] = "MyClass";
    memset(&wc,0,sizeof(wc));
    wc.hInstance = hi;
    wc.lpszClassName = classn;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.lpfnWndProc = WndProc;
    wc.hbrBackground = GetStockBrush( LTGRAY_BRUSH );
    [COLOR="Red"]wc.lpszMenuName = "My";[/COLOR]
    RegisterClass(&wc);
 
    HWND hwnd = CreateWindow(classn,"3a4et",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hi,NULL);
    ShowWindow(hwnd, SW_SHOWNORMAL);
 
    while( GetMessage(&msg, NULL, 0,0) )
        DispatchMessage(&msg);
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint ); 
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy); 
        default: return DefWindowProc(hwnd,msg,w,l);
    }
}
 
void OnDestroy(HWND)
{
    PostQuitMessage(0);
}
 
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    RECT r;
    HDC hdc = BeginPaint(hwnd, &ps);
    GetClientRect(hwnd,&r);
    FillRect(hdc, &r, CreateSolidBrush(RGB(128,0,0)));
    //Rectangle(hdc,0,0,300,220);
    EndPaint(hwnd,&ps);
}
Далее выбираю Insert -> Resource(Ctr+R) в списке выбираю Меню - New
Жму сохранить проект оно мне предлогет сохранить Script1 Сохраняю его + оно создает еще 1 файл в итоге имеется
Script1.rc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
 
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
 
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
 
/////////////////////////////////////////////////////////////////////////////
// Russian resources
 
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32
 
/////////////////////////////////////////////////////////////////////////////
//
// Menus
//
 
My MENU DISCARDABLE 
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",                        ID_FILE_EXIT
    END
    POPUP "View2"
    BEGIN
        MENUITEM "Cut",                         ID_VIEW2_CUT
    END
END
 
 
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
 
1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END
 
2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END
 
3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END
 
#endif    // APSTUDIO_INVOKED
 
#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////
 
 
 
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
 
 
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
и
resource.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define My                       101
#define ID_FILE_EXIT                    40001
#define ID_VIEW2_CUT                    40002
 
// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
Теперь возвращаясь к самой программе дописываем Имя меню в ВНДКЛАСС и по идее должно отображать?! По крайней мере в книге так написано. Но почему-то у меня ничего не отображает?! Может я что не так делаю? Или можно сделать по легче? Подскажите пожалуйста.
Кстати можно ли создать файл .rc вручную из текстовика а потом в пустой файл записать только структуру меню без всего остального?
C++
1
2
3
4
5
6
7
8
9
10
11
My MENU DISCARDABLE 
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",                        ID_FILE_EXIT
    END
    POPUP "View2"
    BEGIN
        MENUITEM "Cut",                         ID_VIEW2_CUT
    END
END
--------------------------------------------------
Вот еще пробовал Project - Add To Project - New - Resource Script - New.
Появляется новая иконка в Docking View жму на новый скрипт добавляю сново новое меню дальше делаю как в 1 раз и как всегда ничего не выводит((((
Чот за бред?

Добавлено через 15 часов 10 минут 7 секунд
Замечательно... Ели нарыл в нэте и все же меню заработало!
C++
1
wc.lpszMenuName = (LPCSTR)MyMenu;
Объясните почему тогда в книге написано что можно писать и имя меню в кавычках и что оно само найдет это имя и установит нужный адрес? В книги же так в кавычках и написано имя. Что за...
??
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2008, 12:06
Ответы с готовыми решениями:

Создание меню
каким образом можно вручную создать меню на пустом диалоговом окне в Visual C++? программирую в Visual Studio 2008. при создании проекта...

Создание меню
Я вот дошол до создания меню и возникли несколько вопросов:Как создать плавающее меню методом ключевых слов? и второй : Зачем нужен файл...

создание меню
подскажите пожалуйста кусок программы чтобы происходил вывод меню на экран типа: 1.Добавить объект 2.Очистить файл 3..... 4....... ...

4
 Аватар для FOLKEN
22 / 21 / 6
Регистрация: 03.12.2008
Сообщений: 85
11.12.2008, 20:22
Code
1
wc.lpszMenuName = "My";
тут компилятор должен ругаться на несоответствие типов. я с такой бедой столкнулся при переходе с VС++ 6.0 на 2008. Действительно, и имя меню и окна и чего угодно раньше можно было писать в кавычках, но теперь вот нельзя... Насколько я понял, дело в переходе всего и вся на юникод, а символ в юникоде и в ASCII занимают разный объем памяти.

а lpszMenuName имеет тип LPCTSTR, который определяется как
Code
1
2
3
4
5
6
7
8
9
10
An LPCWSTR if UNICODE is defined, an LPCSTR otherwise. 
 
This type is declared in WinNT.h as follows:
 
 
#ifdef UNICODE
 typedef LPCWSTR LPCTSTR; 
#else
 typedef LPCSTR LPCTSTR;
#endif
(с)MSDN
то бишь раньше он был просто char, а сейчас wchar_t.. как-то так)
з.ы.
а вот такая штука
Code
1
wc.lpszMenuName = L"My";
вроде как работает.

Добавлено через 1 минуту 4 секунды
забыл спросить... Визуал Студия у вас какая?)
0
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
12.12.2008, 01:39  [ТС]
Хоть кто-то отозвался, спасибо) А то я думал эту книгу уже халтурщики писали))
У меня 6 студия. И кстати этот код
Code
1
wc.lpszMenuName = L"My";
Вызывает бурные овации
--------------------Configuration: eight - Win32 Debug--------------------
Compiling...
eight.cpp
D:\Visual Studio\VSC++\MyProjects\eight\eight.cpp( 21) : error C2440: '=' : cannot convert from 'unsigned short [7]' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

eight.exe - 1 error(s), 0 warning(s)
0
 Аватар для FOLKEN
22 / 21 / 6
Регистрация: 03.12.2008
Сообщений: 85
12.12.2008, 03:34
Шестая? тогда то что я писал выше можно не читать...
у меня где-то была рабочая прога с менюшкой на 6ой С++, сейчас глянем как там что)

Добавлено через 11 минут 20 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//cpp файл, тут инклюды и прочая
char lpszTitleName[]="Бла бла бла";
 
CMainWin::CMainWin(){
    Create(0, lpszTitleName,
        WS_OVERLAPPEDWINDOW, 
        rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));
    LoadAccelTable("MyAccel");
///...
    InitCommonControls();
}
 
BOOL CApp::InitInstance() {
    m_pMainWnd=new CMainWin;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    return TRUE;
}
 
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
    ON_COMMAND(ID_SAVECUT, OnSaveCut)
    ON_COMMAND(ID_FILE_OPEN, OnOpen)
    ON_COMMAND(ID_FILE_EXIT, OnExit)
    ON_COMMAND(ID_ADD, OnAdd)
    ON_COMMAND(ID_NEW, OnNew)
    ON_COMMAND(ID_START, OnStart)
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONUP()
    ON_WM_RBUTTONDOWN()
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_PAINT()
END_MESSAGE_MAP()
 
static UINT Indicators[]={
    ID_SEPARATOR,
    ID_INDICATOR_XY,
    ID_INDICATOR_RGB
};
afx_msg int CMainWin::OnCreate(LPCREATESTRUCT lpCreate){
///...
    m_maxX=GetSystemMetrics(SM_CXSCREEN);
    m_maxY=GetSystemMetrics(SM_CYSCREEN);
    if(CFrameWnd::OnCreate(lpCreate)==-1)
        return -1;
    if(!m_Status.Create(this)){
        TRACE0("Failed to create status bar\n");
        return -1;;
    }
    if(!m_Status.SetIndicators(Indicators, 
        sizeof(Indicators)/sizeof(UINT))){
        TRACE0("Failed to set indicators\n");
        return -1;
    }
    if(!m_ToolBar.Create(this))
    {
        TRACE0("Failed to create Toolbar\n");
        return -1;;
    }
    if(!m_ToolBar.LoadToolBar(IDR_TOOLBAR))
    {
        TRACE0("Failed to set Resource\n");
        return -1;
    }
    m_ToolBar.SetBarStyle(m_ToolBar.GetBarStyle()
        |CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
    return 0;
 
}
 
afx_msg void CMainWin::OnPaint() {
    CPaintDC dc(this);
    dc.BitBlt(0, 31, m_maxX, m_maxY, &m_memDC, 0, 0, SRCCOPY);
}
 
CApp App;
 
//файл rc
IDR_MAINFRAME MENU DISCARDABLE 
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&Open\tCtrl+O",               ID_FILE_OPEN
        MENUITEM "&Save\tCtrl+S",               ID_SAVECUT
        MENUITEM "&New\tCtrl+N",                ID_NEW
        MENUITEM SEPARATOR
        MENUITEM "E&xit\tCtrl+X",               ID_FILE_EXIT
    END
    POPUP "Tools"
    BEGIN
        MENUITEM "A&dd\tCtrl+d",                ID_ADD
        MENUITEM "S&tart\tCtrl+t",              ID_START
    END
END
 
//файл h
class CMainWin : public CFrameWnd {
    private:
        CStatusBar m_Status;
        CToolBar m_ToolBar;
        int m_maxX, m_maxY;
        CBitmap m_memBitmap;
        CDC m_memDC;
    public:
        CMainWin();
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnPaint();
        DECLARE_MESSAGE_MAP()
};
 
class CApp: public CWinApp {
    public:
        BOOL InitInstance();
};
Добавлено через 12 минут 42 секунды
всякие #define, include, обработчики сообщений и прочие не суть важные вещи повыкидывал.
create в конструкторе, как я понимаю относится к классу Cwnd..

эта беда написана на С++ 6.0 1998 года, с тех пор много чего поменялось, сейчас как раз занят тем, что пытаюсь понять, что же именно)
0
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
12.12.2008, 17:40  [ТС]
Ну для начала это MFC)) И как я понимаю разница есть. Так что будет считать, что я ничего не понял т.к. до МФЦ еще не добрался) Ясно только, что МФЦ на С++ классах держится. А вот с меню тут туговато.
Ну без разницы, ответ найдет. Буду дальше учить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2008, 17:40
Помогаю со студенческими работами здесь

Создание меню
Простейшая программа,создающая меню,одним из элементов меню должен быть рисунок,но при добавлении его к меню возникают проблемы(нужно...

Создание основного меню
Создание основного меню (что располагается ниже заголовка окна). Работаю в среде VS2008. Посоветуйте пожалуйста литературу или ссылку где...

Создание контекстного меню в MFC
Есть список (лист бокс) в нем несколько строк, так вот я хотел чтобы по клику правой кнопкой, вывилось меню из пунктов...

Создание меню без использования ресурсного файла
Создаю меню при помощи функций CreateMenu(),CreatePopupMenu(). Добавлял пункты меню функцией BOOL AppendMenu( HMENU hMenu, ...

Установка галочки в пункте меню при выборе данного пункта меню
Есть меню,надо,чтобы при нажатии на пункт меню напротив этого пункта ставилась галочка. Знаю про функцию checkmenuitem,но она устанавливает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru