Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ресурсы, Почему не отображается меню? 
:(
    Опции темы
S.A.G.
Дата 20.8.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



WinAPI, MVS 8

Достаточно ли для отображения меню главного окна выполнить следующие действия:
  • Добавить .rc файл, создать в нем меню
  • Перед регистрацией класса окна заполнить поле lpszMenuName структуры типа WNDCLASS идентификатором меню
Source файл:
Код
#include <windows.h> //два файла с определениями, макросами
#include <windowsx.h> //и прототипами функций Windows

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //оконная функция
void OnDestroy(HWND); //прототип функции OnDestroy

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char szClassName[] = "MainWindow"; //произвольное имя класса главного окна
    char szTitle[] = "Программа 4-1"; //произвольный заголовок окна
    MSG Msg; //структура Msg типа MSG для получения сообщений Windows
    WNDCLASS wc; //структура wc типа WNDCLASS для задания характеристик окна

    /*Зарегестрируем класс главного окна*/
    ZeroMemory(&wc, sizeof(wc)); //Обнуление всех членов структуры 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.lpszMenuName = "IDR_MENU1";
    wc.lpszClassName = szClassName; //Имя класса окна
    
    RegisterClass(&wc); //Вызов функции Windows регистрации класса окна

    HWND hwnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 200, 100,
                             HWND_DESKTOP, NULL, hInst, NULL);
    
    ShowWindow(hwnd, SW_SHOWNORMAL); //Вызов функции Windows показа окна

        while (GetMessage(&Msg, NULL, 0, 0)) //Если есть сообщение, передать его нам
            DispatchMessage(&Msg); //и вызвать оконную процедуру WndProc
    return 0; //После выхода из цикла вернуться в Windows
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) //Переход по значению Msg - номеру сообщения
    {
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
                         return 0;
        default           : return (DefWindowProc(hwnd, msg, wParam, lParam));
    }
}
void OnDestroy(HWND)
{
    PostQuitMessage(0); //Вызов функции Windows завершения приложения
}


Resource файл:
Код
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Ukrainian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR)
#ifdef _WIN32
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDR_MENU1 MENU 
BEGIN
    POPUP "Фон"
    BEGIN
        MENUITEM "Синий",                       ID_40001
        MENUITEM "Зеленый",                     ID_40002
        MENUITEM SEPARATOR
        MENUITEM "Выход",                       ID_40003
    END
END

#endif    // Ukrainian resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


Хидер файла ресурсов:
Код
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Resources.rc
//
#define IDR_MENU1                       101
#define ID_40001                        40001
#define ID_40002                        40002
#define ID_40003                        40003

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40004
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


В готовом приложении меню нет. Почему?

Еще такой вопрос.

В созданном .rc и сгенерированном хидере среда создает кучу "левого" кода непонятного содержания и смысла. Как-то невдобно себя чувствую глядя на это безобразие.

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

Меня как-то раздражает любой "левый" код в такого рода средах.

Это сообщение отредактировал(а) S.A.G. - 20.8.2007, 21:42


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
586
Дата 21.8.2007, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(S.A.G. @  20.8.2007,  21:55 Найти цитируемый пост)
wc.lpszMenuName = "IDR_MENU1";

wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
PM   Вверх
S.A.G.
Дата 21.8.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Ммда.. везде эти макросы, а как заглянешь в них.. smile

А в чем состоит принципиальная разница?

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 14:36


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
586
Дата 21.8.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(S.A.G. @  21.8.2007,  13:50 Найти цитируемый пост)
А в чем состоит принципиальная разница?

IDR_MENU1 - это число, ID ресурса.

Добавлено через 3 минуты и 11 секунд
Цитата(S.A.G. @  20.8.2007,  21:55 Найти цитируемый пост)
#define IDR_MENU1                       101

PM   Вверх
S.A.G.
Дата 21.8.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Чем так принцыпиально отличается "IDR_MENU1" от MAKEINTRESOURCE(IDR_MENU1)?

lpsz расшифровывается как указатель на строку. Однако даже если я вместо "IDR_MENU1" подставлю char id[] = "IDR_MENU1" всеравно меня не спасет.

Цитата(winuser.h)
Код
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))

Скажите, кто-то понимает зачем это нужно или все просто принимают "на веру"?

Сначала приводится к WORD-у (и зачем эти макрозамены?)
Потом к непонятному ULONG_PTR
И наконец в LPSTR

Читаем Финогенова: LPSTR, PSTR - Строка символов Windows с завершающим нулем;

а id тогда что?

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 17:23


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Damarus
Дата 21.8.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(S.A.G. @  21.8.2007,  17:58 Найти цитируемый пост)
Однако даже если я вместо "IDR_MENU1" подставлю char id[] = "IDR_MENU1" всеравно меня не спасет. 

 smile 

Цитата(S.A.G. @  20.8.2007,  21:55 Найти цитируемый пост)
#define IDR_MENU1                       101

MAKEINTRESOURCE(IDR_MENU1) = (LPTSTR)((DWORD)((WORD)(101)))


PM MAIL ICQ Jabber   Вверх
zkv
Дата 21.8.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



S.A.G.,  иногда используют вместо MAKEINTRESOURCE()
Код

  wc.lpszMenuName = (LPTSTR)IDR_MENU1;

код говорит сам за себя - грубо говоря, рассматривать число IDR_MENU1 как адрес строки идентифицирующей ресурс. 
Признаюсь, что конкретнее я разобраться даже не пытался - не вижу необходимости

Добавлено через 9 минут и 56 секунд
Цитата(S.A.G. @  20.8.2007,  20:55 Найти цитируемый пост)
В созданном .rc и сгенерированном хидере среда создает кучу "левого" кода непонятного содержания и смысла. Как-то невдобно себя чувствую глядя на это безобразие.
Стоит ли в этом разбираться или оное нужно принять как должное (системные настройки среды или на что-то в этом духе списать чтобы успокоить взбунтовавшийся разум)?

это ты про что?
Вот про это:
Код

#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40004
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

так ведь написано:
// Next default values for new objects
но вникать в это смысла нет особого, можно считать служебной информацией для редактора
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Damarus, имелось ввиду id подставить а не всю строку, я же выделил его. И я знаю что такое макрорасширение. smile

Какая разница между типами LPSTR и char *?

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 18:11


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  18:05 Найти цитируемый пост)
Какая разница между типами LPSTR и char *

никакой

Добавлено через 1 минуту и 18 секунд
может дело в том, что ты считаешь, что запись  wc.lpszMenuName = (LPTSTR)IDR_MENU1; преобразует число в строку, так вот, это не так smile
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Тогда почему оно не работает с просто "IDR_MENU1"? Это же строковый литерал.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  18:05 Найти цитируемый пост)
Да и не только. Открой в режиме просмотра кода файл ресурсов. 

сказать досконально что есть что не смогу - не было надобности разбираться, но примерно что к чему наверное стоит представлять
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



lpszMenuName требует LPCSTR
Если..
LPSTR и char * одно и тоже то..
почему если я напишу в определениях char id[] = "IDR_MENU1" и подставлю..
.. вот так: lpszMenuName = id, оно не работает..?

В Финогенове вообще написано lpszMenuName = "IDR_MENU1" и заявлено что будет работать но нифига не пашет не в первом ни во втором случае.

А вот пресловутый макрос MAKEINTRESOURCE() решает все проблемы и обнаруживает непостижимую разницу между char * и LPSTR.

Или у меня уже совсем крыша съехала?

А все толдычут что IDR_MENU1 это число и все, да знаю, знаю я! smile smile

Это сообщение отредактировал(а) S.A.G. - 23.8.2007, 00:03


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  18:10 Найти цитируемый пост)
Тогда почему оно не работает с просто "IDR_MENU1"? Это же строковый литерал. 

елки-палки.
Два варианта:
Код

char A[] = "A";
char *pA = A;

и
Код

#define B 101
char *pB =  (char *)B;

в первом случае под строковый литерал на этапе компиляции будет выделена память, затем в процессе выполнения адрес этого участка будет записан в pA
во втором случае мы четко говорим, что строка расположена по адресу B.

Чувствуешь разницу?

Добавлено через 1 минуту
Цитата(S.A.G. @  21.8.2007,  18:15 Найти цитируемый пост)
В Финогенове вообще написано lpszMenuName = "IDR_MENU1" и заявлено что будет работать но нифига не пашет не в первом ни во втором случае.

честно говоря не читал его...

Добавлено через 6 минут и 35 секунд
Цитата(zkv @  21.8.2007,  18:17 Найти цитируемый пост)
затем в процессе выполнения

а может не в процессе... но не суть
Цитата(zkv @  21.8.2007,  18:17 Найти цитируемый пост)
В Финогенове вообще написано lpszMenuName = "IDR_MENU1" и заявлено что будет работать но нифига не пашет не в первом ни во втором случае.

может у него есть основания так полагать
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



бл...., забыл совсем что в кавычках макросы не макросы smile "IDR_MENU1" != "101"

Оно?

Если подставляю "101" не работает всеравно. :(

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 18:42


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  18:38 Найти цитируемый пост)
Оно? 

я не понимаю, что ты хочешь узнать, честно  smile 
Цитата(S.A.G. @  21.8.2007,  18:38 Найти цитируемый пост)
Ведь "IDR_MENU1" != "101"

тут ты прав, "IDR_MENU1" != "101"

а суть дела я уже изложил выше smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.