Модераторы: 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   Вверх
S.A.G.
Дата 21.8.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Если подставить "101" всеравно меню не отображается.

В чем разница между (char *)101 и "101"?

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


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



****


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

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



Цитата(S.A.G. @  21.8.2007,  18:43 Найти цитируемый пост)
Если подставить "101" всеравно меню не отображается. 

а если подставить (LPSTR)101 или reinterpret_cast<LPSTR>(101)?

вот пример накидал, может прояснит:
Код

#include <cstdio>

#define A 101
#define MYMAKEINTRESOURCE(i) ((char *)((unsigned long)((unsigned short)(i))))

int main()
{
    char sA[] = "A";
    char *pA1 = sA;
    printf( "\npA1 == %p" , pA1 );

    char *pA2 =  (char *)A;
    printf( "\npA2 == %p" , pA2 );

    char *pA3 = MYMAKEINTRESOURCE( A );
    printf( "\npA3 == %p" , pA3 );

    getc( stdin );
}

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


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


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

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



(char *)101 работает

Попробуй объяснить чем отличается "101" от (char *)101


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



****


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

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



Цитата(S.A.G. @  21.8.2007,  19:00 Найти цитируемый пост)
Попробуй объяснить чем отличается "101" от (char *)101 

вот:
Цитата(zkv @  21.8.2007,  18:17 Найти цитируемый пост)
Два варианта:

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

и

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

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

и пример в комплекте:
Цитата(zkv @  21.8.2007,  18:54 Найти цитируемый пост)
#include <cstdio>
#define A 101
#define MYMAKEINTRESOURCE(i) ((char *)((unsigned long)((unsigned short)(i))))
int main()
{
    char sA[] = "A";
    char *pA1 = sA;
    printf( "\npA1 == %p" , pA1 );
    char *pA2 =  (char *)A;
    printf( "\npA2 == %p" , pA2 );
    char *pA3 = MYMAKEINTRESOURCE( A );
    printf( "\npA3 == %p" , pA3 );
    getc( stdin );
}

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


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


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

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



char * a = "101", имеем последствие - в a содержится адрес 1
char * a = (char *)B == char * a = (char *)101... привести целую константу к типу "указатель на чар"... компилятор разместит строку в память а адрес 1 присвоит a? т.е. когда мы просто пишем "101" оно в памяти не размещено, а когда (char *)101 то строка "101" помещается в память?

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


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



****


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

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



Цитата(S.A.G. @  21.8.2007,  19:55 Найти цитируемый пост)
а когда (char *)101 то строка "101" помещается в память?

да ничего не помещается, просто мы явно указываем адрес строки = 101, или 0x00000065(hex). Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно...
PM MAIL   Вверх
586
Дата 21.8.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



если wc.lpszClassName <= 0xFFFF, то это ID ресурса,
если wc.lpszClassName > 0xFFFF, то это указатель на LPCTSTR
PM   Вверх
S.A.G.
Дата 21.8.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А разве этот ID не нужен нам как число..? Система генерирует не случайный адрес (101)?

Я поначалу не въехал в преобразование типов...


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


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(zkv @  21.8.2007,  21:05 Найти цитируемый пост)
"вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно...

zkv, ты сам немного запутался... smile
MAKEINTRESOURCE, как уже тут неоднократно упоминалось, просто приведение типа к требуемому прототипами соотв.функций. а передается просто номер - не адрес строки, а просто число. а так как адресов меньше 0xFFFF нет, то функция может четко определить, номер ресурса ей приплыл или адрес строки с именем ресурса.
PM MAIL   Вверх
zkv
Дата 21.8.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(586 @  21.8.2007,  20:17 Найти цитируемый пост)
если wc.lpszClassName <= 0xFFFF, то это ID ресурса,
если wc.lpszClassName > 0xFFFF, то это указатель на LPCTSTR 

ну это уже речь идет об интерпретации системы полученных данных, верно?
тогда следует заметить, что это верно:
Цитата(zkv @  21.8.2007,  20:05 Найти цитируемый пост)
да ничего не помещается, просто мы явно указываем адрес строки = 101, или 0x00000065(hex). Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно... 

только система не пытается обратиться к памяти по этому адресу, а рассматривает его (сам адрес) как ID, при условии указанном 586

Добавлено через 3 минуты и 32 секунды
Цитата(dumb @  21.8.2007,  20:40 Найти цитируемый пост)
zkv, ты сам немного запутался... 

нет, я возможно только отошел от темы, процитирую себя:
Цитата(zkv @  21.8.2007,  20:05 Найти цитируемый пост)
Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно... 

 smile 

Вообще то объяснял, что чем отличается "101" от (char *)101
PM MAIL   Вверх
dumb
Дата 21.8.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



значит это уже я запутался, читая - витиевато излагаете... smile
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



уууууууууууу блииииииииииин smile Доразбираюсь завтра а то седня точно крыша съедет

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


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



****


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

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



Цитата(dumb @  21.8.2007,  20:48 Найти цитируемый пост)
значит это уже я запутался, читая - витиевато излагаете... 

да просто уже много постов назад я начал объяснять, что (char *)101 - это не преобразование числа в строку... Пытался наоборот подоступнее.
PM MAIL   Вверх
S.A.G.
Дата 22.8.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Перед тем как переосмыслить все приведу цитату из книги:
Цитата(Финогенов)
Для того чтобы линейка меню была включена в состав приложения как 
его активный элемент, необходимо присвоить члену структуры типа WNDCLASS 
ipszMenuName адрес строки с именем меню, под которым оно фигурирует в файле ресур- 
сов. Как уже отмечалось, вместо адреса строки с именем, описанной где-то в другом мес- 
те, можно просто указать это имя в кавычках. Фактически сама строка будет размещена в 
сегменте данных приложения, а в переменную wc.lpszMenuName будет действительно 
занесен ее адрес.


Я таки считал что (char *)101 и "101" - одно и то же, и упрямо не отрывался от этого толкования. Иногда нужно ткнуть носом. smile +1

Новое объяснение породило еще вполне естественный вопрос. А нафиг системе так дико извращаться, запоминая ID ресурса (целое число без знака) в форме указателя, предварительно преобразовав типы (!!!)? Не проще было бы в структуре типа WNDCLASS предусмотреть поле соотв. целого типа?

И еще одно. Чем же так отличается число 101 (я непомню к какому типу компилятор C++ относит такие целочисленные константы) и адрес строки (да и вообще любой адрес). Ведь любой адрес это поидее тоже целое число?

Прочитал вот это. Стало понятно почему работает пример из книги. Т.е. стало понятно что есть некоторые обстоятельства при которых так может работать.smile При добавлении ресурсов в студии хидер resource.h создается (генерируется) автоматически. Непонятно при каких обстоятельствах это
Цитата
Ресурс может обозначаться либо именем - уникальной строкой,

возможно и зачем предусмотрено оба варианта.

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


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


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(S.A.G. @  23.8.2007,  00:48 Найти цитируемый пост)
Чем же так отличается число 101 (я непомню к какому типу компилятор C++ относит такие целочисленные константы) и адрес строки (да и вообще любой адрес). Ведь любой адрес это поидее тоже целое число?

Цитата(dumb @  21.8.2007,  21:40 Найти цитируемый пост)
так как адресов меньше 0xFFFF нет, то функция может четко определить, номер ресурса ей приплыл или адрес строки с именем ресурса.

невнимательно читал...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0877 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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