Надоведливое меню!
Есть SDI программа, ввыбираем в меню пункт "Добавить сервер" выводиться диалоговое окно (там пользователь указывает IP, порт и название сервака впрочем неважно) и нужно сделать так чтобы при нажатии кнопки "Добавить" в меню Подключение->Сервера добавлялся новый пункт меню.
Короче одним словом как програмно добавить новый пункт меню???
...
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"));
пункт меню ставится перед "Exit"(в данном случае):
...
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"));
ОГРОМАДНОЕ СПАСИБО!!!
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
CString str;
m_servername.GetWindowText(str);
pmSub->AppendMenu(MF_STRING, IDC_COMMAND, str);
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.
CMenu *pMenu = pFrame->GetMenu();
CMenu *pmSub = pMenu->GetSubMenu(0);
CString str;
m_servername.GetWindowText(str);
pmSub->AppendMenu(MF_STRING, IDC_COMMAND, str);
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 и туды это дело нужно впихнуть то как быть?
ммм а если допусти в меню Подключение есть пункт меню Серверы со свойством popup и туды это дело нужно впихнуть то как быть?
с этим я уже сам справился.... ну у меня последний вопрос по этой теме.... Вот добавили мы меню.... а как сделать так чтобы в него сразу устанавливались параметры и функции при нажатии которые он должен выполнять....?
(это 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()
{
...
}
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?
char ip_addr[??];
int m_port
в CMainFrm.
И тогда при добалении нового пункта меню можно написать
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
strcpy(pFrame->ip_address, ...);
pFrame->m_port = atoi(...);
В проге основная ошибка, что эти переменные не нужного типа.
Зы еще хотел спросить как узнать скока и какие имена в Подключение - > Серверы и занести результат в ListBox?
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
}
Объяви public переменные
char ip_addr[??];
int m_port
в CMainFrm.
И тогда при добалении нового пункта меню можно написать
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
strcpy(pFrame->ip_address, ...);
pFrame->m_port = atoi(...);
В проге основная ошибка, что эти переменные не нужного типа.
А что вместо троеточия писать или хотбі обїясни что делают єти функции:)
А что вместо троеточия писать или хотбі обїясни что делают єти функции:)
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);
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
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);
}
Компилит типа все правильно но то что требуеться от него не выполняет!:Е:Е:Е :'(
else
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CString strip, strport;
m_ipadress.GetWindowText(strip);
m_port.GetWindowText(strport);
int port = atoi(strport);
Socket.Connect(strip, port);
}
Компилит типа все правильно но то что требуеться от него не выполняет!:Е:Е:Е :'(
Та не, он как раз делает все так, как ты написал. Читает имя меню-пункта в одну строку([COLOR=red]s[/COLOR]tr) и добавляет в listbox совсем другую строку([COLOR=red]S[/COLOR]tr).
Та не, он как раз делает все так, как ты написал. Читает имя меню-пункта в одну строку([COLOR=red]s[/COLOR]tr) и добавляет в listbox совсем другую строку([COLOR=red]S[/COLOR]tr).
Пасиба всем большое прибольшое я разобрался с єтим также звиняйте за долгое молчание т.к. мне инет отрубили за неуплату :(