Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Надоведливое меню!

3.8K
13 ноября 2004 года
hex
58 / / 31.10.2004
Короче тут такая проблемма... Помогите пожалуйста а то я уже 5 день парюсь... Вот значит сама проблемма.

Есть SDI программа, ввыбираем в меню пункт "Добавить сервер" выводиться диалоговое окно (там пользователь указывает IP, порт и название сервака впрочем неважно) и нужно сделать так чтобы при нажатии кнопки "Добавить" в меню Подключение->Сервера добавлялся новый пункт меню.

Короче одним словом как програмно добавить новый пункт меню???
368
13 ноября 2004 года
rostyslav
629 / / 13.07.2004
пункт меню ставится перед "Exit"(в данном случае):
 
Код:
#include "MainFrm.h"
...
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu;
pMenu = pFrame->GetMenu();
pMenu->InsertMenu(ID_APP_EXIT, MF_STRING|MF_BYCOMMAND, IDC_NEW_MENU_ITEM, _T("New menu item"));
3.8K
13 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by rostyslav
пункт меню ставится перед "Exit"(в данном случае):
 
Код:
#include "MainFrm.h"
...
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu;
pMenu = pFrame->GetMenu();
pMenu->InsertMenu(ID_APP_EXIT, MF_STRING|MF_BYCOMMAND, IDC_NEW_MENU_ITEM, _T("New menu item"));

ОГРОМАДНОЕ СПАСИБО!!!

3.8K
13 ноября 2004 года
hex
58 / / 31.10.2004
но у меня тут вопросик навеялся ... как вставить пункт не в меню файл а в какое либо другое как его определить? и еще... как сделать чтобы название пункта бралось из EditBox с переменной m_servername???
368
13 ноября 2004 года
rostyslav
629 / / 13.07.2004
 
Код:
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
CString str;
m_servername.GetWindowText(str);
pmSub->AppendMenu(MF_STRING, IDC_COMMAND, str);
pMenu->GetSubMenu(0); - пункт меню ставится в конец первого подменю.
pMenu->GetSubMenu(1); - пункт меню ставится в конец второго подменю. итд.

Что касается
pMenu->InsertMenu(ID_APP_EXIT, MF_STRING|MF_BYCOMMAND, IDC_NEW_MENU_ITEM, _T("New menu item"));

то, если можно верить [COLOR=red]MSDN[/COLOR] первый параметр определяет перед каким пунктом меню будет ставиться новый пункт меню, если второй параметр содержит флаг MF_BYCOMMAND.

или же первый параметр определяет в какую позоцию меню или подменю будет ставится новый пункт меню, если второй параметр содержит флаг MF_BYPOSITION.
3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by rostyslav
 
Код:
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
CString str;
m_servername.GetWindowText(str);
pmSub->AppendMenu(MF_STRING, IDC_COMMAND, str);
pMenu->GetSubMenu(0); - пункт меню ставится в конец первого подменю.
pMenu->GetSubMenu(1); - пункт меню ставится в конец второго подменю. итд.

Что касается
pMenu->InsertMenu(ID_APP_EXIT, MF_STRING|MF_BYCOMMAND, IDC_NEW_MENU_ITEM, _T("New menu item"));

то, если можно верить [COLOR=red]MSDN[/COLOR] первый параметр определяет перед каким пунктом меню будет ставиться новый пункт меню, если второй параметр содержит флаг MF_BYCOMMAND.

или же первый параметр определяет в какую позоцию меню или подменю будет ставится новый пункт меню, если второй параметр содержит флаг MF_BYPOSITION.

ммм а если допусти в меню Подключение есть пункт меню Серверы со свойством popup и туды это дело нужно впихнуть то как быть?

3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by hex
ммм а если допусти в меню Подключение есть пункт меню Серверы со свойством popup и туды это дело нужно впихнуть то как быть?

с этим я уже сам справился.... ну у меня последний вопрос по этой теме.... Вот добавили мы меню.... а как сделать так чтобы в него сразу устанавливались параметры и функции при нажатии которые он должен выполнять....?

368
14 ноября 2004 года
rostyslav
629 / / 13.07.2004
Допустим ты добавил меню с ID = IDC_COMMAND
(это 2й параметр AppendMenu, или 3й параметр InsertMenu) и должна вызываться напр. ф-ия OnNewMenuItem()

тогда, в MainFrm.h в блок
//{{AFX_MSG(CMainFrame) нужно написать

afx_msg void OnNewMenuItem();

в MainFrm.cpp в блок
BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP (CMainFrame)
нужно написать

ON_COMMAND(IDC_COMMAND, OnNewMenuItem)

и конечно нужно реализовать ф-ю OnNewMenuItem в MainFrm.cpp

void CMainFrame::OnNewMenuItem()
{
...
}
3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
Класс! Всё работает! Но если я тебя не заколебал своими вопросами то расскажи неведающему вот у меня есть код обработки функции OnNewMenuItem():

void CMainFrame::OnNewMenuItem()
{
CSocket Socket;
int result = Socket.Create();
if(result == 0)
AfxMessageBox("Неудалось создать Socket для дальнейшего подключения.", MB_ICONWARNING);
else
{
result = Socket.Connect("192.168.0.84", 5356);
if(result == 0)
AfxMessageBox("Неудалось создать Socket для дальнейшего подключения.", MB_ICONWARNING);
}
}

Как при этой:
result = Socket.Connect("192.168.0.84", 5356);
функции сделать чтобы параметры айпи и порта брались из диалога добавления меню из едитов... пишу чисто:
CConnect *m_ipadress;
CConnect *m_port;
result = Socket.Connect(&m_ipadress, &m_port);
не работает говорит:
--------------------Configuration: Exerit - Win32 Release--------------------
Compiling...
MainFrm.cpp
D:\Tut\Exerit\MainFrm.cpp(205) : error C2664: 'int __thiscall CAsyncSocket::Connect(const char *,unsigned int)' : cannot convert parameter 1 from 'class CConnect *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Exerit.exe - 1 error(s), 0 warning(s)

Помоги пожалуйста и дай мне свой мейл будем переписываться:):):):);)

Зы еще хотел спросить как узнать скока и какие имена в Подключение - > Серверы и занести результат в ListBox?
368
14 ноября 2004 года
rostyslav
629 / / 13.07.2004
Объяви public переменные
char ip_addr[??];
int m_port
в CMainFrm.

И тогда при добалении нового пункта меню можно написать
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
strcpy(pFrame->ip_address, ...);
pFrame->m_port = atoi(...);

В проге основная ошибка, что эти переменные не нужного типа.

Зы еще хотел спросить как узнать скока и какие имена в Подключение - > Серверы и занести результат в ListBox?

 
Код:
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
int mniCnt = pmSub->GetMenuItemCount();
for(int i = 0; i < mniCnt; i++)
{
  CString str;
  pmSub->GetMenuString(i, str, MF_BYPOSITION);
  // добавить в listbox
}
3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by rostyslav
Объяви public переменные
char ip_addr[??];
int m_port
в CMainFrm.

И тогда при добалении нового пункта меню можно написать
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
strcpy(pFrame->ip_address, ...);
pFrame->m_port = atoi(...);

В проге основная ошибка, что эти переменные не нужного типа.

А что вместо троеточия писать или хотбі обїясни что делают єти функции:)

368
14 ноября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by hex
А что вместо троеточия писать или хотбі обїясни что делают єти функции:)


strcpy - Copy a string. //Копирует строку
atoi - Convert strings ...to integer. //Переводит строку в число

Все это описано в [COLOR=red]MSDN[/COLOR]. По другому, в help-e Visual C.

Предполагаю, что на диалоговом окне есть 2 Control-а для ввода ip адреса и номера порта.
И те 2 оператора присваивают введенные значения.

Напр. EditBox для ввода порта m_p(точнее переменная связанная с этим editbox), тогда
CString str;
m_p.GetWindowText(str);
pFrame->m_port = atoi(str);

3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by rostyslav

strcpy - Copy a string. //Копирует строку
atoi - Convert strings ...to integer. //Переводит строку в число

Все это описано в [COLOR=red]MSDN[/COLOR]. По другому, в help-e Visual C.

Предполагаю, что на диалоговом окне есть 2 Control-а для ввода ip адреса и номера порта.
И те 2 оператора присваивают введенные значения.

Напр. EditBox для ввода порта m_p(точнее переменная связанная с этим editbox), тогда
CString str;
m_p.GetWindowText(str);
pFrame->m_port = atoi(str);

блин опять запарка написал все так и опять баг:Е:Е:Е

void CMainFrame::OnNewMenuItem()
{
CSocket Socket;
CChatBar m_ipadress, m_port;
int result = Socket.Create();
if(result == 0)
AfxMessageBox("Неудалось создать Socket для дальнейшего подключения.", MB_ICONWARNING);
else
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CString strip, strport;
m_ipadress.GetWindowText(strip);
pFrame->m_ipadress = atoi(strip);
m_port.GetWindowText(strport);
pFrame->m_port = atoi(strport);
Socket.Connect(strip, strport);
}
}

D:\Tut\Exerit\MainFrm.cpp(212) : error C2664: 'int __thiscall CAsyncSocket::Connect(const char *,unsigned int)' : cannot convert parameter 2 from 'class CString' to 'unsigned int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

3.8K
14 ноября 2004 года
hex
58 / / 31.10.2004
+ ко всему еще и с определением чето не лады....

BOOL CConnectDel::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
int mniCnt = pmSub->GetMenuItemCount();
for(int i = 0; i < mniCnt; i++)
{
CString str;
CString Str = pmSub->GetMenuString(i, str, MF_BYPOSITION);
// добавить в listbox
m_listdel.AddString(Str);
}
return CDialog::Create(IDD, pParentWnd);
}

Компилит типа все правильно но то что требуеться от него не выполняет!:Е:Е:Е :'(
368
14 ноября 2004 года
rostyslav
629 / / 13.07.2004
Если так делаешь, то в переменных m_port, ip_addr в классе CFrameWnd нужды нет.
 
Код:
...
else
{
  CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CString strip, strport;
  m_ipadress.GetWindowText(strip);
  m_port.GetWindowText(strport);
  int port = atoi(strport);
  Socket.Connect(strip, port);
}
368
14 ноября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by hex
Компилит типа все правильно но то что требуеться от него не выполняет!:Е:Е:Е :'(

Та не, он как раз делает все так, как ты написал. Читает имя меню-пункта в одну строку([COLOR=red]s[/COLOR]tr) и добавляет в listbox совсем другую строку([COLOR=red]S[/COLOR]tr).

3.8K
23 ноября 2004 года
hex
58 / / 31.10.2004
Цитата:
Originally posted by rostyslav
Та не, он как раз делает все так, как ты написал. Читает имя меню-пункта в одну строку([COLOR=red]s[/COLOR]tr) и добавляет в listbox совсем другую строку([COLOR=red]S[/COLOR]tr).

Пасиба всем большое прибольшое я разобрался с єтим также звиняйте за долгое молчание т.к. мне инет отрубили за неуплату :(

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог