Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
#1

Меню не отображается - C++ WinAPI

07.10.2012, 18:20. Просмотров 616. Ответов 4
Метки нет (Все метки)

Пытаюсь создать пустое меню. Но оно не отображается при запуске. Что делаю не так?
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
115
116
117
118
119
120
121
122
123
124
125
126
127
//В рабочей области отображена кнопка с надписью "Нажмите правую клавишу мыши над рабочей областью".
//После нажатия правой клавиши мыши кнопка скрывается и отображается многострочный редактор с текстом 
//"Нажмите левую клавишу мыши над рабочей областью". 
//После нажатия левой клавиши мыши вернуться к исходному состоянию.
 
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
#define IDM_OPEN                        40001
HINSTANCE hInst;
static HWND hEdit;
BOOL RC(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//функция оконной процедуры
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)  ///главная функция
{
    hInst=hInstance;
    if(!RC(WndProc,szWindowClass,COLOR_WINDOW)) return FALSE;
       //создаём окно
 
HWND hwnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 500,
    NULL,
    (HMENU)NULL,
    hInstance,
    NULL
);
 
if (!hwnd)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
 
//отображаем окно
 
ShowWindow(hwnd,
    nCmdShow);
UpdateWindow(hwnd);
 
//цикл обработки сообщений отправляемых ОС
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
 
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//добавляем функциональные возможности
{
    static HWND hButton; 
    //HWND hEdit;
    PAINTSTRUCT ps;
    static HMENU hMenu;  // дескриптор главного меню
    HDC hdc;
    TCHAR greeting[] = _T("Zaharova Anna");
    switch (message)
    {
        
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            TextOut(hdc,195, 5,greeting, _tcslen(greeting));
            EndPaint(hwnd, &ps);
 
        break;
        
 
        case WM_DESTROY:
        break;
 
        case WM_CREATE:
        hMenu = GetMenu(hwnd);
        SetMenuDefaultItem(GetSubMenu(hMenu, 0), IDM_OPEN, FALSE);
        SetMenu(hwnd, hMenu);
            DrawMenuBar(hwnd);
        break;
 
        case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_OPEN:
            MessageBox(hwnd, greeting, greeting, MB_OK);
        break;
        default:
        break;
        }
        break;
 
        default:return DefWindowProc(hwnd, message, wParam, lParam);break;
    }
return 0;
}
 
 
BOOL RC(WNDPROC WndProc, LPCTSTR Name, UINT brBackground)
{
WNDCLASS wc = { 0 }; 
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc=WndProc; //указывает на функцию окна
    wc.hInstance=hInst; //указывает на дескриптор текущего приложения
    wc.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION)); //иконка
    wc.hCursor=LoadCursor(NULL, IDC_ARROW); //курсор
    wc.hbrBackground=(HBRUSH)( brBackground +1); //  задает дескриптор кисти закрашивания фона окна
    wc.lpszMenuName=NULL; // имя 
    wc.lpszClassName=Name; //имя класса окон
return (RegisterClass(&wc)!=0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2012, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Меню не отображается (C++ WinAPI):

Визуальный вид меню, и что такое меню? - C++ WinAPI
Люди, люди, человеки, помогите будьте так любезны. Я второй день мучаю интернет и свою библиотеку(она маленькая(нужных мне книг мало)). ...

Почему не отображается контекстное меню в меню "Пуск"? - Windows 7
При клике правой кнопкой мыши на значках программ в меню &quot;Пуск&quot; не отображается контекстное меню. Как это можно исправить?

Не отображается МЕНЮ - WordPress
Здравствуйте! Необходимость привела к созданию дочерней темы. Однако возникла проблема, которую пока не пойму, как решить. Может быть...

Не отображается меню в IE - HTML, CSS
вообщем замаялся я и все- наполнение меню на на пхп у меня срабатывать выпадающие подпункты должны на ховер. работает во всех...

Не отображается меню - 1С Битрикс
Создала раздел, туда добавила меню типа left, заполнила его. на странице делаю &lt;?$APPLICATION-&gt;IncludeComponent( ...

Не отображается текст в меню - HTML, CSS
На одном из сайтов который мне поручили делать (сайт не мой) поставили задачу разобраться почему не отображается текст в подменю. ветка...

4
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
08.10.2012, 18:52 #2
Для создания меню есть функция CreateMenu().

C
1
hMenu = GetMenu(hwnd);
Нельзя получить того, чего нет.
Цитата Сообщение от PinkPink Посмотреть сообщение
wc.lpszMenuName=NULL; // имя
Цитата Сообщение от PinkPink Посмотреть сообщение
(HMENU)NULL,
0
GrayWolf
Исследователь
312 / 311 / 7
Регистрация: 06.04.2011
Сообщений: 861
08.10.2012, 18:54 #3
Чего-то я не понял... Возможно, был невнимателен при чтении кода. Т.е. вы пытаетесь получить хэндл меню окна, которое не было задано для него изначально, установить пункт меню по умолчанию и только затем задать меню для окна??? Это неправильно чисто логически даже.
Сначала задаем меню для окна (при регистрации класса, создании окна и т.д.), затем, при необходимости, изменяем его параметры и, также при необходимости, перерисовываем его при помощи DrawMenu()
0
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
11.10.2012, 18:03  [ТС] #4
а можно какой-нибудь маненький примерчик? чтобы было видно последовательность действий

Добавлено через 38 минут
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
115
116
117
118
119
120
121
122
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
#define IDM_OPEN                        40001
HINSTANCE hInst;
static HWND hEdit;
static HMENU hmenu;
BOOL RC(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//функция оконной процедуры
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)  ///главная функция
{
    hInst=hInstance;
    if(!RC(WndProc,szWindowClass,COLOR_WINDOW)) return FALSE;
       //создаём окно
 hmenu=CreateMenu();
 
HWND hwnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 500,
    NULL,
    hmenu,
    hInstance,
    NULL
);
SetMenu(hwnd, hmenu);
if (!hwnd)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
 
//отображаем окно
 
ShowWindow(hwnd,
    nCmdShow);
UpdateWindow(hwnd);
 
//цикл обработки сообщений отправляемых ОС
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
 
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//добавляем функциональные возможности
{
    static HWND hButton; 
    //HWND hEdit;
    PAINTSTRUCT ps;
    //static HMENU hMenu;  // дескриптор главного меню
    HDC hdc;
    TCHAR greeting[] = _T("Menu");
    switch (message)
    {
        
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            TextOut(hdc,195, 5,greeting, _tcslen(greeting));
            EndPaint(hwnd, &ps);
 
        break;
        
 
        case WM_DESTROY:
        break;
 
        case WM_CREATE:
            SetMenu(hwnd,hmenu);
        SetMenuDefaultItem(GetSubMenu(hmenu, 0), IDM_OPEN, FALSE);
        break;
 
        case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_OPEN:
            MessageBox(hwnd, greeting, greeting, MB_OK);
        break;
        default:
        break;
        }
        break;
 
        default:return DefWindowProc(hwnd, message, wParam, lParam);break;
    }
return 0;
}
 
 
BOOL RC(WNDPROC WndProc, LPCTSTR Name, UINT brBackground)
{
WNDCLASS wc = { 0 }; 
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc=WndProc; //указывает на функцию окна
    wc.hInstance=hInst; //указывает на дескриптор текущего приложения
    wc.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION)); //иконка
    wc.hCursor=LoadCursor(NULL, IDC_ARROW); //курсор
    wc.hbrBackground=(HBRUSH)( brBackground +1); //  задает дескриптор кисти закрашивания фона окна
    wc.lpszMenuName=NULL; // имя 
    wc.lpszClassName=Name; //имя класса окон
return (RegisterClass(&wc)!=0);
}
Сделала так, но меню не появляется. Понимаю, что что-то не то делаю. Но разобраться, что именно не могу. Может что-то не туда пишу, а может и не то. Подскажите пожалуйста как надо
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
11.10.2012, 18:27 #5
Ну у тебя же меню пустое. Откуда там что появится?
Через 10 минут напишу простой пример.

Добавлено через 17 минут
Пример создания меню.
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
#include <windows.h>
 
static const char * g_szWindowName  = "menu_test";
static const char * g_szWindowClass = "menu_test_32";
 
static HWND         g_hWnd;
static HMENU        g_hMenu;
static HMENU        g_hMenuFile;
 
enum { ID_NEW = 1000, ID_OPEN, ID_EXIT };
 
LRESULT CALLBACK wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg ) {
        case WM_COMMAND:
            switch ( LOWORD( wParam ) ) {
                case ID_NEW:
                    MessageBox( hWnd, "File->New", "Menu", MB_OK );
                    break;
 
                case ID_OPEN:
                    MessageBox( hWnd, "File->Open", "Menu", MB_OK );
                    break;
 
                case ID_EXIT:
                    PostQuitMessage( 0 );
                    break;
            }
            return 0;
 
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
 
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int )
{
    WNDCLASS    wc;
    ZeroMemory( &wc, sizeof( WNDCLASS ) );
    wc.lpfnWndProc      = wnd_proc;
    wc.hInstance        = hInst;
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName    = g_szWindowClass;
    RegisterClass( &wc );
 
    //
    // Создаём выпадающее меню File
    //
    g_hMenuFile = CreatePopupMenu();
    AppendMenu( g_hMenuFile, MF_STRING, ID_NEW, "New" );
    AppendMenu( g_hMenuFile, MF_STRING, ID_OPEN, "Open" );
    AppendMenu( g_hMenuFile, MF_SEPARATOR, 0, 0 );
    AppendMenu( g_hMenuFile, MF_STRING, ID_EXIT, "Exit" );
 
    //
    // Создаём оконное меню
    //
    g_hMenu = CreateMenu();
    AppendMenu( g_hMenu, MF_POPUP | MF_STRING, (UINT_PTR)g_hMenuFile, "File" ); // Прикрепляем выпадающее меню "File" к оконному
 
    g_hWnd = CreateWindow(
        g_szWindowClass, g_szWindowName,
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, g_hMenu, hInst, NULL );
 
    MSG msg;
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
 
    DestroyMenu( g_hMenuFile );
    DestroyMenu( g_hMenu );
    UnregisterClass( g_szWindowClass, hInst );
    return 0;
}
0
11.10.2012, 18:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2012, 18:27
Привет! Вот еще темы с ответами:

Неправильно отображается меню - HTML, CSS
Всем привет! У меня есть меню, при наведении на ссылку меню оно увеличивается (увеличивает блок всего меню) Как можно от этого...

Некорректно отображается меню - HTML, CSS
Добрый день. Подскажите пожалуйста как поправить меню. Сейчас при наведении на пункты меню, их нельзя выбрать, так как внизу находится...

Некорректно отображается меню - HTML, CSS
Здравствуйте. При маштабирование в браузере меню перескакивает на новую строку. А хотелось, чтобы оно просто пропорцианально уменьшалось...

Не отображается меню выбора ОС - Linux
После того как переустановил Windows 7, пропало меню выбора запуска ОС. До этого прежде чем включался ноут появлялось окно, где были...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.